增加Socket::CreateRemote作为创建网络连接的主要方法

This commit is contained in:
大石头X2 2017-02-06 09:55:00 +08:00
parent 84bfeb50d7
commit dfab94d73e
4 changed files with 66 additions and 11 deletions

View File

@ -3,6 +3,7 @@
#include "ITransport.h"
#include "Socket.h"
#include "NetworkInterface.h"
#include "DNS.h"
#include "Ethernet.h"

View File

@ -2,6 +2,7 @@
#include "ITransport.h"
#include "Socket.h"
#include "NetworkInterface.h"
#include "Dhcp.h"
#include "Ethernet.h"
@ -167,14 +168,15 @@ void Dhcp::Stop()
net_printf("Dhcp::Stop Result=%d DhcpID=0x%08x Times=%d MaxTimes=%d\r\n", Result, dhcpid, Times, MaxTimes);
auto& host = Host;
if(Result)
{
// 成功后次数清零
Times = 0;
// 获取IP成功重新设置参数
Host.Config();
Host.SaveConfig();
host.Config();
host.SaveConfig();
}
else
{
@ -188,16 +190,16 @@ void Dhcp::Stop()
net_printf("尝试次数 %d 超过最大允许次数 %d ", Times, MaxTimes);
// 恢复上一次设置,如果首次,则恢复出厂设置
if(Host.LoadConfig())
if(host.LoadConfig())
net_printf("恢复上一次设置");
else
{
net_printf("恢复出厂设置");
Host.InitConfig();
host.InitConfig();
}
net_printf("\r\n");
Host.Config();
host.Config();
// 3分钟后继续启动DHCP
Sys.SetTaskPeriod(taskID, 3 * 60 * 1000);
@ -249,6 +251,7 @@ DHCP_OPT* GetOption(byte* p, int len, DHCP_OPTION option)
void Dhcp::PareOption(Stream& ms)
{
auto& host = Host;
while(ms.Remain())
{
byte opt = ms.ReadByte();
@ -257,8 +260,8 @@ void Dhcp::PareOption(Stream& ms)
// 有些家用路由器会发送错误的len大于4字节导致覆盖前后数据
switch(opt)
{
case DHCP_OPT_Mask: Host.Mask = ms.ReadUInt32(); len -= 4; break;
case DHCP_OPT_Router: Host.Gateway = ms.ReadUInt32(); len -= 4; break;
case DHCP_OPT_Mask: host.Mask = ms.ReadUInt32(); len -= 4; break;
case DHCP_OPT_Router: host.Gateway = ms.ReadUInt32(); len -= 4; break;
case DHCP_OPT_DHCPServer: Server = ms.ReadUInt32(); len -= 4; break;
case DHCP_OPT_DNSServer:
{
@ -266,9 +269,9 @@ void Dhcp::PareOption(Stream& ms)
IPAddress dns = ms.ReadUInt32();
// 成功获取DHCP信息后采用本地DNS为主DNS阿里公共DNS为备用DNS
IPAddress aliyun(223, 5, 5, 5);
//if(Host.DNSServer != dns) Host.DNSServer2 = Host.DNSServer;
Host.DNSServer2 = aliyun;
Host.DNSServer = dns;
//if(host.DNSServer != dns) host.DNSServer2 = host.DNSServer;
host.DNSServer2 = aliyun;
host.DNSServer = dns;
len -= 4;
break;
}

View File

@ -1,6 +1,8 @@
#include "Socket.h"
#include "Config.h"
#include "NetworkInterface.h"
#define NET_DEBUG DEBUG
//#define NET_DEBUG 0
#if NET_DEBUG
@ -8,3 +10,49 @@
#else
#define net_printf(format, ...)
#endif
Socket* Socket::CreateClient(const NetUri& uri)
{
auto& list = NetworkInterface::All;
for(int i=0; i < list.Count(); i++)
{
auto ni = list[i];
if(ni->Active)
{
auto socket = ni->CreateSocket(uri.Type);
if(socket)
{
socket->Local.Address = uri.Address;
socket->Local.Port = uri.Port;
return socket;
}
}
}
return nullptr;
}
Socket* Socket::CreateRemote(const NetUri& uri)
{
auto& list = NetworkInterface::All;
for(int i=0; i < list.Count(); i++)
{
auto ni = list[i];
if(ni && ni->Active)
{
auto socket = ni->CreateSocket(uri.Type);
if(socket)
{
socket->Local.Address = ni->IP;
socket->Remote.Address = uri.Address;
socket->Remote.Port = uri.Port;
socket->Server = uri.Host;
return socket;
}
}
}
return nullptr;
}

View File

@ -5,7 +5,6 @@
#include "IPEndPoint.h"
#include "MacAddress.h"
#include "NetUri.h"
#include "NetworkInterface.h"
#include "Core\Delegate.h"
@ -33,6 +32,10 @@ public:
virtual bool SendTo(const Buffer& bs, const IPEndPoint& remote) { return Send(bs); }
// 接收数据
virtual uint Receive(Buffer& bs) = 0;
// 全局静态
static Socket* CreateClient(const NetUri& uri);
static Socket* CreateRemote(const NetUri& uri);
};
#endif