速度决定网络接口优先级

This commit is contained in:
大石头X2 2017-02-04 23:18:15 +08:00
parent 3092595946
commit c29903d8df
5 changed files with 59 additions and 32 deletions

View File

@ -113,7 +113,7 @@ void Dhcp::Request()
auto opt = (DHCP_OPT*)p;
opt->SetType(DHCP_TYPE_Request);
opt = opt->Next()->SetData(DHCP_OPT_DHCPServer, Host.DHCPServer.Value);
opt = opt->Next()->SetData(DHCP_OPT_DHCPServer, Server.Value);
// 发往DHCP服务器
SendDhcp(buf, (byte*)opt->Next() - p);
@ -259,7 +259,7 @@ void Dhcp::PareOption(Stream& ms)
{
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: Host.DHCPServer= ms.ReadUInt32(); len -= 4; break;
case DHCP_OPT_DHCPServer: Server = ms.ReadUInt32(); len -= 4; break;
case DHCP_OPT_DNSServer:
{
// 有可能有多个DNS只要第一个

View File

@ -20,6 +20,7 @@ private:
public:
NetworkInterface& Host; // 主机
IPAddress IP; // 获取的IP地址
IPAddress Server;
uint ExpiredTime; // 过期时间默认5000毫秒
bool Running; // 正在运行

View File

@ -9,6 +9,8 @@
#define net_printf(format, ...)
#endif
List<NetworkInterface*> NetworkInterface::All;
/******************************** NetworkInterface ********************************/
struct NetConfig
@ -19,7 +21,6 @@ struct NetConfig
byte Mode; // 无线模式。0不是无线1是STA2是AP3是混合
byte Reserved;
uint DHCPServer;
uint DNSServer;
uint DNSServer2;
uint Gateway;
@ -49,7 +50,7 @@ void NetworkInterface::InitConfig()
IP[3] = first;
Mask = IPAddress(255, 255, 255, 0);
DHCPServer = Gateway = defip;
Gateway = defip;
// 修改为双DNS方案避免单点故障。默认使用阿里和百度公共DNS。
DNSServer = IPAddress(223, 5, 5, 5);
@ -82,7 +83,6 @@ bool NetworkInterface::LoadConfig()
Mac = nc.Mac;
Mode = (NetworkType)nc.Mode;
DHCPServer = nc.DHCPServer;
DNSServer = nc.DNSServer;
DNSServer2 = nc.DNSServer2;
Gateway = nc.Gateway;
@ -103,7 +103,6 @@ bool NetworkInterface::SaveConfig()
Mac.CopyTo(nc.Mac);
nc.Mode = (byte)Mode;
nc.DHCPServer = DHCPServer.Value;
nc.DNSServer = DNSServer.Value;
nc.DNSServer2 = DNSServer2.Value;
nc.Gateway = Gateway.Value;
@ -130,8 +129,8 @@ void NetworkInterface::ShowConfig()
Mask.Show();
net_printf("\r\n Gate:\t");
Gateway.Show();
net_printf("\r\n DHCP:\t");
DHCPServer.Show();
//net_printf("\r\n DHCP:\t");
//DHCPServer.Show();
net_printf("\r\n DNS:\t");
DNSServer.Show();
if(!DNSServer2.IsAny())
@ -164,25 +163,6 @@ void NetworkInterface::ShowConfig()
#endif
}
Socket* NetworkInterface::CreateClient(const NetUri& uri)
{
auto socket = CreateSocket(uri.Type);
socket->Local.Address = uri.Address;
socket->Local.Port = uri.Port;
return socket;
}
Socket* NetworkInterface::CreateRemote(const NetUri& uri)
{
auto socket = CreateSocket(uri.Type);
socket->Remote.Address = uri.Address;
socket->Remote.Port = uri.Port;
socket->Server = uri.Host;
return socket;
}
// DNS解析。默认仅支持字符串IP地址解析
IPAddress NetworkInterface::QueryDNS(const String& domain)
{
@ -198,3 +178,40 @@ bool NetworkInterface::IsAP() const
{
return Mode == NetworkType::AP || Mode == NetworkType::STA_AP;
}
Socket* NetworkInterface::CreateClient(const NetUri& uri)
{
for(int i=0; i < All.Count(); i++)
{
auto ni = All[i];
if(ni->Active)
{
auto socket = ni->CreateSocket(uri.Type);
socket->Local.Address = uri.Address;
socket->Local.Port = uri.Port;
return socket;
}
}
return nullptr;
}
Socket* NetworkInterface::CreateRemote(const NetUri& uri)
{
for(int i=0; i < All.Count(); i++)
{
auto ni = All[i];
if(ni->Active)
{
auto socket = ni->CreateSocket(uri.Type);
socket->Remote.Address = uri.Address;
socket->Remote.Port = uri.Port;
socket->Server = uri.Host;
return socket;
}
}
return nullptr;
}

View File

@ -7,6 +7,7 @@
#include "NetUri.h"
#include "Socket.h"
#include "Core\List.h"
#include "Core\Delegate.h"
class Socket;
@ -24,19 +25,24 @@ enum class NetworkType
class NetworkInterface
{
public:
byte Index; // 索引
bool Active; // 可用
ushort Speed; // 速度Mbps。决定优先级
cstring Name; // 名称
IPAddress IP; // 本地IP地址
IPAddress Mask; // 子网掩码
MacAddress Mac; // 本地Mac地址
NetworkType Mode; // 无线模式。0不是无线1是STA2是AP3是混合
IPAddress DHCPServer;
IPAddress Gateway;
IPAddress DNSServer;
IPAddress DNSServer2;
IPAddress Gateway;
String* SSID; // 无线SSID
String* Pass; // 无线密码
Delegate<NetworkInterface&> Changed; // 网络改变
Delegate<NetworkInterface&> NetReady; // 网络准备就绪。带this参数
NetworkInterface();
@ -53,8 +59,6 @@ public:
void ShowConfig();
virtual Socket* CreateSocket(NetType type) = 0;
virtual Socket* CreateClient(const NetUri& uri);
virtual Socket* CreateRemote(const NetUri& uri);
// DNS解析。默认仅支持字符串IP地址解析
virtual IPAddress QueryDNS(const String& domain);
@ -65,6 +69,11 @@ public:
bool IsStation() const;
bool IsAP() const;
// 全局静态
static List<NetworkInterface*> All;
static Socket* CreateClient(const NetUri& uri);
static Socket* CreateRemote(const NetUri& uri);
};
#endif

View File

@ -35,7 +35,7 @@ void TinyIP::Init()
_Arr.SetLength(1500);
Mask = 0x00FFFFFF;
DHCPServer = Gateway = DNSServer = IP = 0;
Gateway = DNSServer = IP = 0;
Arp = nullptr;
}