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

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)
{
Type = ETH_ARP;
//Type = ETH_ARP;
#ifdef STM32F0
Count = 4;
@ -24,13 +24,13 @@ ArpSocket::~ArpSocket()
_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);
//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;
/*
@ -74,7 +74,7 @@ bool ArpSocket::Process(IP_HEADER* ip, Stream* ms)
Tip->ShowIP(arp->SrcIP);
debug_printf(" [");
Tip->ShowMac(arp->SrcMac);
debug_printf("] Payload=%d\r\n", ms->Remain());
debug_printf("] Payload=%d\r\n", ms.Remain());
#endif
// 仅处理ARP请求

View File

@ -24,7 +24,7 @@ public:
virtual ~ArpSocket();
// 处理数据包
virtual bool Process(IP_HEADER* ip, Stream* ms);
virtual bool Process(IP_HEADER& ip, Stream& ms);
// 请求Arp并返回其Mac。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;
}
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;
IPAddress remote = ip->SrcIP;
IPAddress remote = ip.SrcIP;
uint len = ms->Remain();
uint len = ms.Remain();
if(OnPing)
{
// 返回值指示是否向对方发送数据包
bool rs = OnPing(this, icmp, icmp->Next(), len);
bool rs = OnPing(*this, *icmp, icmp->Next(), len);
if(!rs) return true;
}
else

View File

@ -13,10 +13,10 @@ public:
IcmpSocket(TinyIP* tip);
// 处理数据包
virtual bool Process(IP_HEADER* ip, Stream* ms);
virtual bool Process(IP_HEADER& ip, Stream& ms);
// 收到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;
// Ping目的地址附带a~z重复的负载数据

View File

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

View File

@ -7,7 +7,6 @@
class TcpSocket : public Socket, public ITransport
{
private:
//byte seqnum;
uint Seq; // 序列号,本地发出数据包
uint Ack; // 确认号,对方发送数据包的序列号+1
@ -23,12 +22,6 @@ public:
Established = 3,
}TCP_STATUS;
ushort Port; // 本地端口接收该端口数据包。0表示接收所有端口的数据包
ushort BindPort; // 绑定端口用于发出数据包的源端口。默认为Port若Port为0则从1024算起累加
IPAddress RemoteIP; // 远程地址
ushort RemotePort; // 远程端口
IPAddress LocalIP; // 本地IP地址
ushort LocalPort; // 本地端口,收到数据包的目的端口
TCP_STATUS Status; // 状态
TCP_HEADER* Header;
@ -36,14 +29,14 @@ public:
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和端口后续发送数据和关闭连接需要
void Send(const byte* buf, uint len); // 向Socket发送数据可能是外部数据包
void Disconnect(); // 关闭Socket
// 收到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 OnReceived;
TcpHandler OnDisconnected;

View File

@ -91,7 +91,8 @@ void TinyIP::Process(Stream& ms)
// 处理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;
}
@ -122,7 +123,7 @@ void TinyIP::Process(Stream& ms)
arp->Add(remote, mac);
}
FixPayloadLength(ip, ms);
FixPayloadLength(*ip, ms);
// 各处理器有可能改变数据流游标,这里备份一下
uint p = ms.Position();
@ -137,7 +138,7 @@ void TinyIP::Process(Stream& ms)
if(socket->Type == ip->Protocol)
{
// 如果处理成功,则中断遍历
if(socket->Process(ip, &ms)) return;
if(socket->Process(*ip, ms)) return;
ms.SetPosition(p);
}
}
@ -153,14 +154,14 @@ void TinyIP::Process(Stream& ms)
}
// 修正IP包负载数据的长度。物理层送来的长度可能有误一般超长
void TinyIP::FixPayloadLength(IP_HEADER* ip, Stream& ms)
void TinyIP::FixPayloadLength(IP_HEADER& ip, Stream& ms)
{
// 前面的len不准确必须以这个为准
uint size = __REV16(ip->TotalLength) - (ip->Length << 2);
uint size = __REV16(ip.TotalLength) - (ip.Length << 2);
ms.Length = ms.Position() + size;
//len = size;
//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
{
public:
TinyIP* Tip; // TinyIP控制器
ushort Type; // 类型
bool Enable; // 启用
TinyIP* Tip; // TinyIP控制器
IP_TYPE Type; // 类型
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);
virtual ~Socket();
// 处理数据包
virtual bool Process(IP_HEADER* ip, Stream* ms) = 0;
virtual bool Process(IP_HEADER& ip, Stream& ms) = 0;
};
// Socket列表
@ -58,7 +68,7 @@ public:
// 处理数据包
void Process(Stream& ms);
// 修正IP包负载数据的长度。物理层送来的长度可能有误一般超长
void FixPayloadLength(IP_HEADER* ip, Stream& ms);
void FixPayloadLength(IP_HEADER& ip, Stream& ms);
public:
IPAddress IP; // 本地IP地址

View File

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

View File

@ -10,20 +10,14 @@ private:
UDP_HEADER* Create();
public:
ushort Port; // 本地端口接收该端口数据包。0表示接收所有端口的数据包
ushort BindPort; // 绑定端口用于发出数据包的源端口。默认为Port若Port为0则从1024算起累加
IPAddress RemoteIP; // 远程地址
ushort RemotePort; // 远程端口
IPAddress LocalIP; // 本地IP地址
ushort LocalPort; // 本地端口,收到数据包的目的端口
UdpSocket(TinyIP* tip);
// 处理数据包
virtual bool Process(IP_HEADER* ip, Stream* ms);
virtual bool Process(IP_HEADER& ip, Stream& ms);
// 收到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;
// 发送UDP数据到目标地址