规范化端口的使用,只有TCP和UDP使用端口,TinyIP类不需要端口

UDP测试未通过
This commit is contained in:
Stone 2014-11-16 14:21:14 +00:00
parent 92d4cdef58
commit cc8ca04a85
8 changed files with 103 additions and 42 deletions

View File

@ -16,6 +16,8 @@ ArpSocket::ArpSocket(TinyIP* tip) : Socket(tip)
Count = 64; Count = 64;
#endif #endif
_Arps = NULL; _Arps = NULL;
Enable = true;
} }
ArpSocket::~ArpSocket() ArpSocket::~ArpSocket()

View File

@ -6,6 +6,7 @@ Dhcp::Dhcp(TinyIP* tip) : UdpSocket(tip)
{ {
Type = IP_UDP; Type = IP_UDP;
Port = 68; Port = 68;
RemotePort = 67;
Running = false; Running = false;
Result = false; Result = false;
@ -36,8 +37,10 @@ void Dhcp::SendDhcp(DHCP_HEADER* dhcp, uint len)
Tip->RemoteMac = MAC_FULL; Tip->RemoteMac = MAC_FULL;
Tip->RemoteIP = IP_FULL; Tip->RemoteIP = IP_FULL;
Tip->Port = 68;
Tip->RemotePort = 67; //UDP_HEADER* udp = dhcp->Prev();
//udp->SrcPort = 68;
//udp->DestPort = 67;
// 如果最后一个字节不是DHCP_OPT_End则增加End // 如果最后一个字节不是DHCP_OPT_End则增加End
//byte* p = (byte*)dhcp + sizeof(DHCP_HEADER); //byte* p = (byte*)dhcp + sizeof(DHCP_HEADER);
@ -149,13 +152,18 @@ void Dhcp::Start()
taskID = Sys.AddTask(SendDiscover, this, 0, 1000000); taskID = Sys.AddTask(SendDiscover, this, 0, 1000000);
// 通过DHCP获取IP期间关闭Arp响应 // 通过DHCP获取IP期间关闭Arp响应
Tip->EnableArp = false; //Tip->EnableArp = false;
if(Tip->Arp) Tip->Arp->Enable = false;
Running = true; Running = true;
Open();
} }
void Dhcp::Stop() void Dhcp::Stop()
{ {
Close();
Running = false; Running = false;
if(taskID) if(taskID)
{ {
@ -165,7 +173,8 @@ void Dhcp::Stop()
taskID = 0; taskID = 0;
// 通过DHCP获取IP期间关闭Arp响应 // 通过DHCP获取IP期间关闭Arp响应
Tip->EnableArp = true; //Tip->EnableArp = true;
if(Tip->Arp) Tip->Arp->Enable = true;
debug_printf("Dhcp::Stop Result=%d DhcpID=0x%08x\r\n", Result, dhcpid); debug_printf("Dhcp::Stop Result=%d DhcpID=0x%08x\r\n", Result, dhcpid);

View File

@ -9,6 +9,9 @@ TcpSocket::TcpSocket(TinyIP* tip) : Socket(tip)
Port = 0; Port = 0;
RemoteIP = 0; RemoteIP = 0;
RemotePort = 0; RemotePort = 0;
LocalIP = 0;
LocalPort = 0;
seqnum = 0xa; seqnum = 0xa;
Status = Closed; Status = Closed;
@ -33,8 +36,9 @@ bool TcpSocket::Process(MemoryStream* ms)
// 不能修改主监听Socket的端口否则可能导致收不到后续连接数据 // 不能修改主监听Socket的端口否则可能导致收不到后续连接数据
//Port = port; //Port = port;
//RemotePort = remotePort; //RemotePort = remotePort;
Tip->Port = port; //
Tip->RemotePort = remotePort; //Tip->Port = port;
//Tip->RemotePort = remotePort;
// 第一次同步应答 // 第一次同步应答
if (tcp->Flags & TCP_FLAGS_SYN && !(tcp->Flags & TCP_FLAGS_ACK)) // SYN连接请求标志位为1表示发起连接的请求数据包 if (tcp->Flags & TCP_FLAGS_SYN && !(tcp->Flags & TCP_FLAGS_ACK)) // SYN连接请求标志位为1表示发起连接的请求数据包
@ -125,8 +129,8 @@ void TcpSocket::Send(TCP_HEADER* tcp, uint len, byte flags)
{ {
Tip->RemoteIP = RemoteIP; Tip->RemoteIP = RemoteIP;
tcp->SrcPort = __REV16(Port > 0 ? Port : Tip->Port); tcp->SrcPort = __REV16(Port);
tcp->DestPort = __REV16(RemotePort > 0 ? RemotePort : Tip->RemotePort); tcp->DestPort = __REV16(RemotePort);
tcp->Flags = flags; tcp->Flags = flags;
if(tcp->Length < sizeof(TCP_HEADER) / 4) tcp->Length = sizeof(TCP_HEADER) / 4; if(tcp->Length < sizeof(TCP_HEADER) / 4) tcp->Length = sizeof(TCP_HEADER) / 4;

View File

@ -20,9 +20,11 @@ public:
Established = 2, Established = 2,
}TCP_STATUS; }TCP_STATUS;
ushort Port; // 本地端口 ushort Port; // 本地端口。0表示接收所有端口的数据包
IPAddress RemoteIP; // 远程地址 IPAddress RemoteIP; // 远程地址
ushort RemotePort; // 远程端口 ushort RemotePort; // 远程端口
IPAddress LocalIP; // 本地IP地址
ushort LocalPort; // 本地端口
TCP_STATUS Status; // 状态 TCP_STATUS Status; // 状态
TCP_HEADER* Header; TCP_HEADER* Header;

View File

@ -32,7 +32,7 @@ TinyIP::TinyIP(ITransport* port)
Buffer = NULL; Buffer = NULL;
BufferSize = 1500; BufferSize = 1500;
EnableBroadcast = true; EnableBroadcast = true;
EnableArp = true; //EnableArp = true;
Sockets.SetCapacity(0x10); Sockets.SetCapacity(0x10);
// 必须有Arp否则无法响应别人的IP询问 // 必须有Arp否则无法响应别人的IP询问
@ -79,13 +79,14 @@ void TinyIP::Process(MemoryStream* ms)
// 只处理发给本机MAC的数据包。此时不能进行目标Mac地址过滤因为可能是广播包 // 只处理发给本机MAC的数据包。此时不能进行目标Mac地址过滤因为可能是广播包
//if(eth->DestMac != Mac) return; //if(eth->DestMac != Mac) return;
LocalMac = eth->DestMac; //LocalMac = eth->DestMac;
RemoteMac = eth->SrcMac; RemoteMac = eth->SrcMac;
// 处理ARP // 处理ARP
if(eth->Type == ETH_ARP) if(eth->Type == ETH_ARP)
{ {
if(EnableArp && Arp) Arp->Process(ms); //if(EnableArp && Arp) Arp->Process(ms);
if(Arp && Arp->Enable) Arp->Process(ms);
return; return;
} }
@ -104,7 +105,7 @@ void TinyIP::Process(MemoryStream* ms)
#endif #endif
// 记录远程信息 // 记录远程信息
LocalIP = ip->DestIP; //LocalIP = ip->DestIP;
RemoteIP = ip->SrcIP; RemoteIP = ip->SrcIP;
// 移交给ARP处理为了让它更新ARP表 // 移交给ARP处理为了让它更新ARP表
@ -132,7 +133,7 @@ void TinyIP::Process(MemoryStream* ms)
for(int i=count-1; i>=0; i--) for(int i=count-1; i>=0; i--)
{ {
Socket* socket = Sockets[i]; Socket* socket = Sockets[i];
if(socket) if(socket && socket->Enable)
{ {
// 必须类型匹配 // 必须类型匹配
if(socket->Type == ip->Protocol) if(socket->Type == ip->Protocol)
@ -219,6 +220,10 @@ bool TinyIP::Init()
assert_param(Sys.CheckMemory()); assert_param(Sys.CheckMemory());
} }
// 必须有Arp否则无法响应别人的IP询问
if(!Arp) Arp = new ArpSocket(this);
Arp->Enable = true;
if(!Open()) return false; if(!Open()) return false;
ShowInfo(); ShowInfo();
@ -422,6 +427,7 @@ Socket::Socket(TinyIP* tip)
assert_param(tip); assert_param(tip);
Tip = tip; Tip = tip;
Enable = false;
// 除了ARP以外加入到列表 // 除了ARP以外加入到列表
if(this->Type != ETH_ARP) tip->Sockets.Add(this); if(this->Type != ETH_ARP) tip->Sockets.Add(this);
} }
@ -430,6 +436,7 @@ Socket::~Socket()
{ {
assert_param(Tip); assert_param(Tip);
Enable = false;
// 从TinyIP中删除当前Socket // 从TinyIP中删除当前Socket
Tip->Sockets.Remove(this); Tip->Sockets.Remove(this);
} }

View File

@ -15,8 +15,9 @@ class TinyIP;
class Socket class Socket
{ {
public: public:
TinyIP* Tip; TinyIP* Tip; // TinyIP控制器
ushort Type; ushort Type; // 类型
bool Enable; // 启用
Socket(TinyIP* tip); Socket(TinyIP* tip);
virtual ~Socket(); virtual ~Socket();
@ -35,8 +36,8 @@ public:
class TinyIP; class TinyIP;
typedef bool (*LoopFilter)(TinyIP* tip, void* param); typedef bool (*LoopFilter)(TinyIP* tip, void* param);
// 精简IP类 // 精简以太网协议。封装以太网帧以及IP协议不包含其它协议实现仅提供底层支持。
class TinyIP //: protected IEthernetAdapter class TinyIP
{ {
private: private:
ITransport* _port; ITransport* _port;
@ -59,16 +60,16 @@ public:
IPAddress IP; // 本地IP地址 IPAddress IP; // 本地IP地址
IPAddress Mask; // 子网掩码 IPAddress Mask; // 子网掩码
MacAddress Mac; // 本地Mac地址 MacAddress Mac; // 本地Mac地址
ushort Port; // 本地端口 //ushort Port; // 本地端口
bool EnableBroadcast; // 使用广播 bool EnableBroadcast; // 使用广播
bool EnableArp; // 启用Arp //bool EnableArp; // 启用Arp
MacAddress LocalMac;// 本地目标Mac地址 //MacAddress LocalMac;// 本地目标Mac地址
IPAddress LocalIP; // 本地目标IP地址 //IPAddress LocalIP; // 本地目标IP地址
//ushort LocalPort; // 本地目标端口 //ushort LocalPort; // 本地目标端口
MacAddress RemoteMac;// 远程Mac地址 MacAddress RemoteMac;// 远程Mac地址
IPAddress RemoteIP; // 远程IP地址 IPAddress RemoteIP; // 远程IP地址
ushort RemotePort; // 远程端口 //ushort RemotePort; // 远程端口
ushort BufferSize; // 缓冲区大小 ushort BufferSize; // 缓冲区大小
IPAddress DHCPServer; IPAddress DHCPServer;

View File

@ -3,9 +3,38 @@
UdpSocket::UdpSocket(TinyIP* tip) : Socket(tip) UdpSocket::UdpSocket(TinyIP* tip) : Socket(tip)
{ {
Type = IP_UDP; Type = IP_UDP;
Port = 0;
RemoteIP = 0; RemoteIP = 0;
RemotePort = 0; RemotePort = 0;
LocalIP = 0;
LocalPort = 0;
// 累加端口
static ushort g_udp_port = 1024;
Port = g_udp_port++;
}
string UdpSocket::ToString()
{
static string name = "UDP_65535";
sprintf(name, "UDP_%d", Port);
return name;
}
bool UdpSocket::OnOpen()
{
if(Port)
debug_printf("Udp::Open %d\r\n", Port);
else
debug_printf("Udp::Open %d 监听所有端口UDP数据包\r\n", Port);
Enable = true;
return Enable;
}
void UdpSocket::OnClose()
{
debug_printf("Udp::Close %d\r\n", Port);
Enable = false;
} }
bool UdpSocket::Process(MemoryStream* ms) bool UdpSocket::Process(MemoryStream* ms)
@ -19,8 +48,11 @@ bool UdpSocket::Process(MemoryStream* ms)
// 仅处理本连接的IP和端口 // 仅处理本连接的IP和端口
if(Port != 0 && port != Port) return false; if(Port != 0 && port != Port) return false;
IP_HEADER* ip = udp->Prev();
RemotePort = remotePort; RemotePort = remotePort;
RemoteIP = udp->Prev()->SrcIP; RemoteIP = ip->SrcIP;
LocalPort = port;
LocalIP = ip->DestIP;
#if NET_DEBUG #if NET_DEBUG
byte* data = udp->Next(); byte* data = udp->Next();
@ -54,10 +86,10 @@ void UdpSocket::OnProcess(UDP_HEADER* udp, MemoryStream& ms)
{ {
#if NET_DEBUG #if NET_DEBUG
debug_printf("UDP "); debug_printf("UDP ");
Tip->ShowIP(Tip->RemoteIP); Tip->ShowIP(RemoteIP);
debug_printf(":%d => ", Tip->RemotePort); debug_printf(":%d => ", RemotePort);
Tip->ShowIP(Tip->LocalIP); Tip->ShowIP(LocalIP);
debug_printf(":%d Payload=%d udp_len=%d \r\n", Tip->Port, len, __REV16(udp->Length)); debug_printf(":%d Payload=%d udp_len=%d \r\n", LocalPort, len, __REV16(udp->Length));
Sys.ShowString(data, len); Sys.ShowString(data, len);
debug_printf(" \r\n"); debug_printf(" \r\n");
@ -72,8 +104,8 @@ void UdpSocket::Send(UDP_HEADER* udp, uint len, bool checksum)
//UDP_HEADER* udp = (UDP_HEADER*)(buf - sizeof(UDP_HEADER)); //UDP_HEADER* udp = (UDP_HEADER*)(buf - sizeof(UDP_HEADER));
assert_param(udp); assert_param(udp);
udp->SrcPort = __REV16(Port > 0 ? Port : Tip->Port); udp->SrcPort = __REV16(Port > 0 ? Port : LocalPort);
udp->DestPort = __REV16(RemotePort > 0 ? RemotePort : Tip->RemotePort); udp->DestPort = __REV16(RemotePort);
udp->Length = __REV16(sizeof(UDP_HEADER) + len); udp->Length = __REV16(sizeof(UDP_HEADER) + len);
// 网络序是大端 // 网络序是大端

View File

@ -4,15 +4,17 @@
#include "TinyIP.h" #include "TinyIP.h"
// Udp会话 // Udp会话
class UdpSocket : public Socket, ITransport class UdpSocket : public Socket, public ITransport
{ {
private: private:
UDP_HEADER* Create(); UDP_HEADER* Create();
public: public:
ushort Port; // 本地端口 ushort Port; // 本地端口。0表示接收所有端口的数据包
IPAddress RemoteIP; // 远程地址 IPAddress RemoteIP; // 远程地址
ushort RemotePort; // 远程端口 ushort RemotePort; // 远程端口
IPAddress LocalIP; // 本地IP地址
ushort LocalPort; // 本地端口
UdpSocket(TinyIP* tip); UdpSocket(TinyIP* tip);
@ -26,12 +28,14 @@ public:
// 发送UDP数据到目标地址 // 发送UDP数据到目标地址
void Send(const byte* buf, uint len, IPAddress ip = 0, ushort port = 0); void Send(const byte* buf, uint len, IPAddress ip = 0, ushort port = 0);
virtual string ToString();
protected: protected:
void Send(UDP_HEADER* udp, uint len, bool checksum = true); void Send(UDP_HEADER* udp, uint len, bool checksum = true);
virtual void OnProcess(UDP_HEADER* udp, MemoryStream& ms); virtual void OnProcess(UDP_HEADER* udp, MemoryStream& ms);
//virtual bool OnOpen() { return _port->Open(); } virtual bool OnOpen();
//virtual void OnClose() { _port->Close(); } virtual void OnClose();
virtual bool OnWrite(const byte* buf, uint len); virtual bool OnWrite(const byte* buf, uint len);
virtual uint OnRead(byte* buf, uint len); virtual uint OnRead(byte* buf, uint len);