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