优先使用对象引用,而不是指针

This commit is contained in:
nnhy 2015-06-22 07:58:10 +00:00
parent dbd66ae830
commit b5e53811b3
10 changed files with 58 additions and 60 deletions

View File

@ -4,7 +4,7 @@
ArpSocket::ArpSocket(TinyIP* tip) : Socket(tip) ArpSocket::ArpSocket(TinyIP* tip) : Socket(tip)
{ {
Type = ETH_ARP; //Type = ETH_ARP;
#ifdef STM32F0 #ifdef STM32F0
Count = 4; Count = 4;
@ -24,13 +24,13 @@ ArpSocket::~ArpSocket()
_Arps = NULL; _Arps = NULL;
} }
bool ArpSocket::Process(IP_HEADER* ip, Stream* ms) bool ArpSocket::Process(IP_HEADER& ip, Stream& ms)
{ {
// 前面的数据长度很不靠谱,这里进行小范围修正 // 前面的数据长度很不靠谱,这里进行小范围修正
//uint size = ms->Position + sizeof(ARP_HEADER); //uint size = ms->Position + sizeof(ARP_HEADER);
//if(ms->Length < size) ms->Length = size; //if(ms->Length < size) ms->Length = size;
ARP_HEADER* arp = ms->Retrieve<ARP_HEADER>(); ARP_HEADER* arp = ms.Retrieve<ARP_HEADER>();
if(!arp) return false; if(!arp) return false;
/* /*
@ -74,7 +74,7 @@ bool ArpSocket::Process(IP_HEADER* ip, Stream* ms)
Tip->ShowIP(arp->SrcIP); Tip->ShowIP(arp->SrcIP);
debug_printf(" ["); debug_printf(" [");
Tip->ShowMac(arp->SrcMac); Tip->ShowMac(arp->SrcMac);
debug_printf("] Payload=%d\r\n", ms->Remain()); debug_printf("] Payload=%d\r\n", ms.Remain());
#endif #endif
// 仅处理ARP请求 // 仅处理ARP请求

View File

@ -24,7 +24,7 @@ public:
virtual ~ArpSocket(); virtual ~ArpSocket();
// 处理数据包 // 处理数据包
virtual bool Process(IP_HEADER* ip, Stream* ms); virtual bool Process(IP_HEADER& ip, Stream& ms);
// 请求Arp并返回其Mac。timeout超时3秒如果没有超时时间表示异步请求不用等待结果 // 请求Arp并返回其Mac。timeout超时3秒如果没有超时时间表示异步请求不用等待结果
bool Request(IPAddress& ip, MacAddress& mac, int timeout = 3); bool Request(IPAddress& ip, MacAddress& mac, int timeout = 3);

View File

@ -10,18 +10,18 @@ IcmpSocket::IcmpSocket(TinyIP* tip) : Socket(tip)
Enable = true; Enable = true;
} }
bool IcmpSocket::Process(IP_HEADER* ip, Stream* ms) bool IcmpSocket::Process(IP_HEADER& ip, Stream& ms)
{ {
ICMP_HEADER* icmp = ms->Retrieve<ICMP_HEADER>(); ICMP_HEADER* icmp = ms.Retrieve<ICMP_HEADER>();
if(!icmp) return false; if(!icmp) return false;
IPAddress remote = ip->SrcIP; IPAddress remote = ip.SrcIP;
uint len = ms->Remain(); uint len = ms.Remain();
if(OnPing) if(OnPing)
{ {
// 返回值指示是否向对方发送数据包 // 返回值指示是否向对方发送数据包
bool rs = OnPing(this, icmp, icmp->Next(), len); bool rs = OnPing(*this, *icmp, icmp->Next(), len);
if(!rs) return true; if(!rs) return true;
} }
else else

View File

@ -13,10 +13,10 @@ public:
IcmpSocket(TinyIP* tip); IcmpSocket(TinyIP* tip);
// 处理数据包 // 处理数据包
virtual bool Process(IP_HEADER* ip, Stream* ms); virtual bool Process(IP_HEADER& ip, Stream& ms);
// 收到Ping请求时触发传递结构体和负载数据长度。返回值指示是否向对方发送数据包 // 收到Ping请求时触发传递结构体和负载数据长度。返回值指示是否向对方发送数据包
typedef bool (*PingHandler)(IcmpSocket* socket, ICMP_HEADER* icmp, byte* buf, uint len); typedef bool (*PingHandler)(IcmpSocket& socket, ICMP_HEADER& icmp, byte* buf, uint len);
PingHandler OnPing; PingHandler OnPing;
// Ping目的地址附带a~z重复的负载数据 // Ping目的地址附带a~z重复的负载数据

View File

@ -61,13 +61,13 @@ void TcpSocket::OnClose()
Enable = false; Enable = false;
} }
bool TcpSocket::Process(IP_HEADER* ip, Stream* ms) bool TcpSocket::Process(IP_HEADER& ip, Stream& ms)
{ {
TCP_HEADER* tcp = (TCP_HEADER*)ms->Current(); TCP_HEADER* tcp = ms.Retrieve<TCP_HEADER>();
if(!ms->Seek(tcp->Size())) return false; if(!tcp) return false;
Header = tcp; Header = tcp;
uint len = ms->Remain(); uint len = ms.Remain();
ushort port = __REV16(tcp->DestPort); ushort port = __REV16(tcp->DestPort);
ushort remotePort = __REV16(tcp->SrcPort); ushort remotePort = __REV16(tcp->SrcPort);
@ -79,11 +79,11 @@ bool TcpSocket::Process(IP_HEADER* ip, Stream* ms)
//IP_HEADER* ip = tcp->Prev(); //IP_HEADER* ip = tcp->Prev();
RemotePort = remotePort; RemotePort = remotePort;
RemoteIP = ip->SrcIP; RemoteIP = ip.SrcIP;
LocalPort = port; LocalPort = port;
LocalIP = ip->DestIP; LocalIP = ip.DestIP;
OnProcess(tcp, *ms); OnProcess(tcp, ms);
return true; return true;
} }
@ -140,7 +140,7 @@ void TcpSocket::OnProcess(TCP_HEADER* tcp, Stream& ms)
void TcpSocket::OnAccept(TCP_HEADER* tcp, uint len) void TcpSocket::OnAccept(TCP_HEADER* tcp, uint len)
{ {
if(OnAccepted) if(OnAccepted)
OnAccepted(this, tcp, tcp->Next(), len); OnAccepted(*this, *tcp, tcp->Next(), len);
else else
{ {
#if NET_DEBUG #if NET_DEBUG
@ -164,7 +164,7 @@ void TcpSocket::OnAccept(TCP_HEADER* tcp, uint len)
void TcpSocket::OnAccept3(TCP_HEADER* tcp, uint len) void TcpSocket::OnAccept3(TCP_HEADER* tcp, uint len)
{ {
if(OnAccepted) if(OnAccepted)
OnAccepted(this, tcp, tcp->Next(), len); OnAccepted(*this, *tcp, tcp->Next(), len);
else else
{ {
#if NET_DEBUG #if NET_DEBUG
@ -207,7 +207,7 @@ void TcpSocket::OnDataReceive(TCP_HEADER* tcp, uint len)
if(OnReceived) if(OnReceived)
{ {
// 返回值指示是否向对方发送数据包 // 返回值指示是否向对方发送数据包
bool rs = OnReceived(this, tcp, tcp->Next(), len); bool rs = OnReceived(*this, *tcp, tcp->Next(), len);
// 如果不需要向对方发数据包则直接响应ACK // 如果不需要向对方发数据包则直接响应ACK
if(!rs) if(!rs)
{ {
@ -239,7 +239,7 @@ void TcpSocket::OnDataReceive(TCP_HEADER* tcp, uint len)
void TcpSocket::OnDisconnect(TCP_HEADER* tcp, uint len) void TcpSocket::OnDisconnect(TCP_HEADER* tcp, uint len)
{ {
if(OnDisconnected) OnDisconnected(this, tcp, tcp->Next(), len); if(OnDisconnected) OnDisconnected(*this, *tcp, tcp->Next(), len);
// RST是对方紧急关闭这里啥都不干 // RST是对方紧急关闭这里啥都不干
if(tcp->Flags & TCP_FLAGS_FIN) if(tcp->Flags & TCP_FLAGS_FIN)
@ -472,8 +472,8 @@ bool Callback(TinyIP* tip, void* param, Stream& ms)
// 处理。如果对方回发第二次握手包,或者终止握手 // 处理。如果对方回发第二次握手包,或者终止握手
//Stream ms(tip->Buffer, tip->BufferSize); //Stream ms(tip->Buffer, tip->BufferSize);
tip->FixPayloadLength(_ip, ms); tip->FixPayloadLength(*_ip, ms);
socket->Process(_ip, &ms); socket->Process(*_ip, ms);
return true; return true;
} }

View File

@ -7,7 +7,6 @@
class TcpSocket : public Socket, public ITransport class TcpSocket : public Socket, public ITransport
{ {
private: private:
//byte seqnum;
uint Seq; // 序列号,本地发出数据包 uint Seq; // 序列号,本地发出数据包
uint Ack; // 确认号,对方发送数据包的序列号+1 uint Ack; // 确认号,对方发送数据包的序列号+1
@ -23,12 +22,6 @@ public:
Established = 3, Established = 3,
}TCP_STATUS; }TCP_STATUS;
ushort Port; // 本地端口接收该端口数据包。0表示接收所有端口的数据包
ushort BindPort; // 绑定端口用于发出数据包的源端口。默认为Port若Port为0则从1024算起累加
IPAddress RemoteIP; // 远程地址
ushort RemotePort; // 远程端口
IPAddress LocalIP; // 本地IP地址
ushort LocalPort; // 本地端口,收到数据包的目的端口
TCP_STATUS Status; // 状态 TCP_STATUS Status; // 状态
TCP_HEADER* Header; TCP_HEADER* Header;
@ -36,14 +29,14 @@ public:
TcpSocket(TinyIP* tip); TcpSocket(TinyIP* tip);
// 处理数据包 // 处理数据包
virtual bool Process(IP_HEADER* ip, Stream* ms); virtual bool Process(IP_HEADER& ip, Stream& ms);
bool Connect(IPAddress ip, ushort port); // 连接远程服务器记录远程服务器IP和端口后续发送数据和关闭连接需要 bool Connect(IPAddress ip, ushort port); // 连接远程服务器记录远程服务器IP和端口后续发送数据和关闭连接需要
void Send(const byte* buf, uint len); // 向Socket发送数据可能是外部数据包 void Send(const byte* buf, uint len); // 向Socket发送数据可能是外部数据包
void Disconnect(); // 关闭Socket void Disconnect(); // 关闭Socket
// 收到Tcp数据时触发传递结构体和负载数据长度。返回值指示是否向对方发送数据包 // 收到Tcp数据时触发传递结构体和负载数据长度。返回值指示是否向对方发送数据包
typedef bool (*TcpHandler)(TcpSocket* socket, TCP_HEADER* tcp, byte* buf, uint len); typedef bool (*TcpHandler)(TcpSocket& socket, TCP_HEADER& tcp, byte* buf, uint len);
TcpHandler OnAccepted; TcpHandler OnAccepted;
TcpHandler OnReceived; TcpHandler OnReceived;
TcpHandler OnDisconnected; TcpHandler OnDisconnected;

View File

@ -91,7 +91,8 @@ void TinyIP::Process(Stream& ms)
// 处理ARP // 处理ARP
if(eth->Type == ETH_ARP) if(eth->Type == ETH_ARP)
{ {
if(Arp && Arp->Enable) Arp->Process(NULL, &ms); IP_HEADER header;
if(Arp && Arp->Enable) Arp->Process(header, ms);
return; return;
} }
@ -122,7 +123,7 @@ void TinyIP::Process(Stream& ms)
arp->Add(remote, mac); arp->Add(remote, mac);
} }
FixPayloadLength(ip, ms); FixPayloadLength(*ip, ms);
// 各处理器有可能改变数据流游标,这里备份一下 // 各处理器有可能改变数据流游标,这里备份一下
uint p = ms.Position(); uint p = ms.Position();
@ -137,7 +138,7 @@ void TinyIP::Process(Stream& ms)
if(socket->Type == ip->Protocol) if(socket->Type == ip->Protocol)
{ {
// 如果处理成功,则中断遍历 // 如果处理成功,则中断遍历
if(socket->Process(ip, &ms)) return; if(socket->Process(*ip, ms)) return;
ms.SetPosition(p); ms.SetPosition(p);
} }
} }
@ -153,14 +154,14 @@ void TinyIP::Process(Stream& ms)
} }
// 修正IP包负载数据的长度。物理层送来的长度可能有误一般超长 // 修正IP包负载数据的长度。物理层送来的长度可能有误一般超长
void TinyIP::FixPayloadLength(IP_HEADER* ip, Stream& ms) void TinyIP::FixPayloadLength(IP_HEADER& ip, Stream& ms)
{ {
// 前面的len不准确必须以这个为准 // 前面的len不准确必须以这个为准
uint size = __REV16(ip->TotalLength) - (ip->Length << 2); uint size = __REV16(ip.TotalLength) - (ip.Length << 2);
ms.Length = ms.Position() + size; ms.Length = ms.Position() + size;
//len = size; //len = size;
//buf += (ip->Length << 2); //buf += (ip->Length << 2);
ms.Seek((ip->Length << 2) - sizeof(IP_HEADER)); ms.Seek((ip.Length << 2) - sizeof(IP_HEADER));
} }
// 任务函数 // 任务函数

View File

@ -15,15 +15,25 @@ class TinyIP;
class Socket class Socket
{ {
public: public:
TinyIP* Tip; // TinyIP控制器 TinyIP* Tip; // TinyIP控制器
ushort Type; // 类型 IP_TYPE Type; // 类型
bool Enable; // 启用 bool Enable; // 启用
IP_HEADER* IPHeader;
ushort Port; // 本地端口接收该端口数据包。0表示接收所有端口的数据包
ushort BindPort; // 绑定端口用于发出数据包的源端口。默认为Port若Port为0则从1024算起累加
IPAddress RemoteIP; // 远程地址。当前数据包
ushort RemotePort; // 远程端口。当前数据包
IPAddress LocalIP; // 本地IP地址。当前数据包
ushort LocalPort; // 本地端口,收到数据包的目的端口
Socket(TinyIP* tip); Socket(TinyIP* tip);
virtual ~Socket(); virtual ~Socket();
// 处理数据包 // 处理数据包
virtual bool Process(IP_HEADER* ip, Stream* ms) = 0; virtual bool Process(IP_HEADER& ip, Stream& ms) = 0;
}; };
// Socket列表 // Socket列表
@ -58,7 +68,7 @@ public:
// 处理数据包 // 处理数据包
void Process(Stream& ms); void Process(Stream& ms);
// 修正IP包负载数据的长度。物理层送来的长度可能有误一般超长 // 修正IP包负载数据的长度。物理层送来的长度可能有误一般超长
void FixPayloadLength(IP_HEADER* ip, Stream& ms); void FixPayloadLength(IP_HEADER& ip, Stream& ms);
public: public:
IPAddress IP; // 本地IP地址 IPAddress IP; // 本地IP地址

View File

@ -43,9 +43,9 @@ void UdpSocket::OnClose()
Enable = false; Enable = false;
} }
bool UdpSocket::Process(IP_HEADER* ip, Stream* ms) bool UdpSocket::Process(IP_HEADER& ip, Stream& ms)
{ {
UDP_HEADER* udp = ms->Retrieve<UDP_HEADER>(); UDP_HEADER* udp = ms.Retrieve<UDP_HEADER>();
if(!udp) return false; if(!udp) return false;
ushort port = __REV16(udp->DestPort); ushort port = __REV16(udp->DestPort);
@ -56,20 +56,20 @@ bool UdpSocket::Process(IP_HEADER* ip, Stream* ms)
//IP_HEADER* ip = udp->Prev(); //IP_HEADER* ip = udp->Prev();
RemotePort = remotePort; RemotePort = remotePort;
RemoteIP = ip->SrcIP; RemoteIP = ip.SrcIP;
LocalPort = port; LocalPort = port;
LocalIP = ip->DestIP; LocalIP = ip.DestIP;
#if NET_DEBUG #if NET_DEBUG
byte* data = udp->Next(); byte* data = udp->Next();
uint len = ms->Remain(); uint len = ms.Remain();
uint plen = __REV16(udp->Length); uint plen = __REV16(udp->Length);
assert_param(len + sizeof(UDP_HEADER) == plen); assert_param(len + sizeof(UDP_HEADER) == plen);
//Sys.ShowHex((byte*)udp, udp->Size(), '-'); //Sys.ShowHex((byte*)udp, udp->Size(), '-');
//debug_printf("\r\n"); //debug_printf("\r\n");
#endif #endif
OnProcess(ip, udp, *ms); OnProcess(&ip, udp, ms);
return true; return true;
} }
@ -98,7 +98,7 @@ void UdpSocket::OnProcess(IP_HEADER* ip, UDP_HEADER* udp, Stream& ms)
if(OnReceived) if(OnReceived)
{ {
// 返回值指示是否向对方发送数据包 // 返回值指示是否向对方发送数据包
bool rs = OnReceived(this, udp, data, len); bool rs = OnReceived(*this, *udp, data, len);
if(rs) Send(udp, len, false); if(rs) Send(udp, len, false);
} }
else else

View File

@ -10,20 +10,14 @@ private:
UDP_HEADER* Create(); UDP_HEADER* Create();
public: public:
ushort Port; // 本地端口接收该端口数据包。0表示接收所有端口的数据包
ushort BindPort; // 绑定端口用于发出数据包的源端口。默认为Port若Port为0则从1024算起累加
IPAddress RemoteIP; // 远程地址
ushort RemotePort; // 远程端口
IPAddress LocalIP; // 本地IP地址
ushort LocalPort; // 本地端口,收到数据包的目的端口
UdpSocket(TinyIP* tip); UdpSocket(TinyIP* tip);
// 处理数据包 // 处理数据包
virtual bool Process(IP_HEADER* ip, Stream* ms); virtual bool Process(IP_HEADER& ip, Stream& ms);
// 收到Udp数据时触发传递结构体和负载数据长度。返回值指示是否向对方发送数据包 // 收到Udp数据时触发传递结构体和负载数据长度。返回值指示是否向对方发送数据包
typedef bool (*UdpHandler)(UdpSocket* socket, UDP_HEADER* udp, byte* buf, uint len); typedef bool (*UdpHandler)(UdpSocket& socket, UDP_HEADER& udp, byte* buf, uint len);
UdpHandler OnReceived; UdpHandler OnReceived;
// 发送UDP数据到目标地址 // 发送UDP数据到目标地址