优先使用对象引用,而不是指针
This commit is contained in:
parent
dbd66ae830
commit
b5e53811b3
|
@ -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请求
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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重复的负载数据
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
11
TinyIP/Tcp.h
11
TinyIP/Tcp.h
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
// 任务函数
|
||||
|
|
|
@ -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地址
|
||||
|
|
|
@ -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
|
||||
|
|
10
TinyIP/Udp.h
10
TinyIP/Udp.h
|
@ -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数据到目标地址
|
||||
|
|
Loading…
Reference in New Issue