概述
在网络相关的项目中,我们经常需要去获取和设置设备的IP地址、子网掩码、网关地址、MAC地址等信息。这些信息一般与操作系统相关,在Windows系统和Linux系统上调用的接口是不一样的。在Linux系统和基于Linux的一些嵌入式系统上,还涉及一些其他操作,比如:添加指定网卡的路由,使能指定网卡的广播路由,或获取指定网卡的丢包率等。简化所有这些信息的获取与设置,并提供跨平台的统一接口,是非常有必要的。
CHP_Network
为了方便网络相关信息的获取与设置,我们封装了CHP_Network类。这个类是一个接口类,不需要实例化。因此,我们将构造函数和析构函数声明成了私有的。CHP_Network类的头文件,可参考下面的示例代码。
typedef struct _THPNetAdaptInfo { std::string strIP; std::string strMask; std::string strGateway; char pMac[6]; }THPNetAdaptInfo; class CHP_Network { public: static bool IsValidIP(const char *pszIP); static bool IsValidIP(unsigned int uiIP); static bool IsLanIP(const char *pszIP); static bool IsLanIP(unsigned int uiIP); static bool IsValidSubnetMask(const char *pszSubnetMask); static bool IsValidSubnetMask(unsigned int uiSubnetMask); static unsigned int GetHostCountBySubnetMask(const char *pszSubnetMask); static unsigned int GetHostCountBySubnetMask(unsigned int uiSubnetMask); static int SetDNSServerIP(const std::vector<std::string> &vctIP); static int GetDNSServerIP(std::vector<std::string> &vctIP); static int GetNetworkAdaptInfo(std::vector<THPNetAdaptInfo> &vctInfo); static int GetLocalIP(unsigned int &uiIP); static int GetLocalIP(std::string &strIP); static int GetAllLocalIPs(std::vector<std::string> &vctIP); static int GetAllLocalIPs(unsigned int *puiIP, int &nCount); static int GetLocalNetworkInfo(unsigned int &uiIP, unsigned int &uiMask, unsigned int &uiGateway, unsigned char pMac[6]); static int GetLocalNetworkInfo(std::string &strIP, std::string &strMask, std::string &strGateway, unsigned char pMac[6]); static int GetLocalMac(unsigned char pMac[6]); static int GetAllLocalMacs(unsigned char ppMac[][6], int &nCount); static int GetAllOrderedLocalMacs(unsigned char ppMac[][6], int &nCount); static bool IsNetworkAlive(const char *pszNetName = "eth0"); static int SetIP(unsigned int uiIP, unsigned int uiSubnetMask, const char *pszNetName = "eth0"); static unsigned int GetIP(const char *pszNetName = "eth0"); static unsigned int GetSubnetMask(const char *pszNetName = "eth0"); static unsigned int GetGateway(const char *pszNetName = "eth0"); static int SetGateway(unsigned int uiGateway, const char *pszNetName = "eth0"); static bool IsNetworkInterfaceExist(const char *pszNetName = "eth0"); static int AddRoute(unsigned int uiDestIP, unsigned int uiNetMask, const char *pszNetName = "eth0"); static int DeleteRoute(unsigned int uiDestIP, unsigned int uiNetMask, unsigned int uiGateway, const char *pszNetName = "eth0"); static int SetDefaultRoute(unsigned int uiGateway, const char *pszNetName = "eth0"); static int EnableBroadcastRoute(bool bEnable = true, const char *pszNetName = "eth0"); static int SetRouteMetric(const char *pszNetName, unsigned int uiMetric); static bool IsCablePluggedIn(const char *pszNetName = "eth0"); static int EnableNetwork(bool bEnable, const char *pszNetName = "eth0"); static int GetMacAddr(unsigned char pucMac[6], bool bGetFromCmdlineIfFailed = true, const char *pszNetName = "eth0"); static int SetMacAddr(unsigned char pucMac[6], const char *pszNetName = "eth0"); static int GetPacketLoss(unsigned int &uiLossRate, const char *pszNetName = "eth0"); private: CHP_Network(); ~CHP_Network(); static int GetLocalIPList(std::vector<std::string> &vctIP); typedef struct _TMiiData { unsigned short phy_id; unsigned short reg_num; unsigned short val_in; unsigned short val_out; }TMiiData; static int GetMac(unsigned char pMac[6]); static int GetCommandToken(const char *pCmd, const char *pToken, const char *pKey, std::string &strResult); private: static CHP_Mutex m_mutexResolvConf; };
下面,我们将分别介绍这些静态接口。
IsValidIP:是否为有效的IP。参数可以为IP地址字符串,也可以为整型IP地址(网络字节序)。返回值为true表示有效的IP,否则为无效的IP。
IsLanIP:是否为局域网IP。参数可以为IP地址字符串,也可以为整型IP地址(网络字节序)。返回值为true表示局域网IP,否则为非局域网IP。
IsValidSubnetMask:是否为有效的子网掩码。参数可以为子网掩码字符串,也可以为整型子网掩码(网络字节序)。返回值为true表示有效的子网掩码,否则为无效的子网掩码。
GetHostCountBySubnetMask:根据子网掩码获取主机数量。参数可以为子网掩码字符串,也可以为整型子网掩码(网络字节序)。返回值为主机数量。
SetDNSServerIP:设置DNS服务器的IP地址。参数vctIP为DNS服务器的IP地址的数组。返回值为0表示成功,其他为错误码。
GetDNSServerIP:获取DNS服务器的IP地址。参数vctIP为DNS服务器的IP地址的数组,用于传出。返回值为0表示成功,其他为错误码。
GetNetworkAdaptInfo:获取本机的网卡信息。参数vctInfo为本机网卡信息的数组,用于传出。返回值为0表示成功,其他为错误码。
GetLocalIP:获取本地IP地址。参数可以为整型IP地址(网络字节序),也可以为IP地址字符串。返回值为0表示成功,其他为错误码。
GetAllLocalIPs:获取本地所有网卡的IP地址。参数可以为STL的向量形式,也可以是数组形式,均用于传出。返回值为0表示成功,其他为错误码。
GetLocalNetworkInfo:获取本地网络信息,包括:IP、子网掩码、网关、MAC地址。传出的参数可以为整型,也可以为字符串。返回值为0表示成功,其他为错误码。
GetLocalMac:获取本地MAC地址,一般为第一个有线网卡的地址。参数pMac为MAC地址,用于传出。返回值为0表示成功,其他为错误码。
GetAllLocalMacs:获取本地所有网卡的MAC地址。参数ppMac为MAC地址数组,参数nCount为传入本地MAC地址数组大小,返回本地MAC地址个数。返回值为0表示成功,其他为错误码。
GetAllOrderedLocalMacs:获取排序(有线网络>无线网络>其他)后的本地所有网卡的MAC地址。
IsNetworkAlive:判断指定网卡的网络是否正常。参数pszNetName为网卡接口名称,默认为"eth0",仅对Linux有效。返回值为true表示正常,否则异常。
SetIP:设置指定网卡的IP等信息(该接口仅对Linux有效)。参数uiIP为整型IP地址(网络字节序),参数uiSubnetMask为整型子网掩码(网络字节序),参数pszNetName为网卡接口名称,默认为"eth0"。返回值为0表示成功,其他为错误码。
GetIP:获取指定网卡的IP地址(该接口仅对Linux有效)。参数pszNetName为网卡接口名称,默认为"eth0"。返回值为非0表示有效的IP地址,0表示无效的IP地址。
GetSubnetMask:获取指定网卡的子网掩码(该接口仅对Linux有效)。参数pszNetName为网卡接口名称,默认为"eth0"。返回值为非0表示有效的子网掩码,0表示无效的子网掩码。
GetGateway:获取指定网卡的网关(该接口仅对Linux有效)。参数pszNetName为网卡接口名称,默认为"eth0"。返回值为整型网关(网络字节序),返回0时,表示没有网关。
SetGateway:设置指定网卡的网关(该接口仅对Linux有效)。参数uiGateway为整型网关(网络字节序),为-1时,表示删除网关。参数pszNetName为网卡接口名称,默认为"eth0"。返回值为0表示成功,其他为错误码。
IsNetworkInterfaceExist:判断指定网卡接口是否存在(该接口仅对Linux有效)。参数pszNetName为网卡接口名称,默认为"eth0"。返回值为true表示存在,否则不存在
AddRoute:添加指定网卡的路由(该接口仅对Linux有效)。参数uiDestIP为整型目标IP(网络字节序),参数uiNetMask为整型子网掩码(网络字节序),参数pszNetName为网卡接口名称,默认为"eth0"。返回值为0表示成功,其他为错误码。
DeleteRoute:删除指定网卡的路由(该接口仅对Linux有效)。参数uiDestIP为整型目标IP(网络字节序),参数uiNetMask为整型子网掩码(网络字节序),参数uiGateway为整型网关(网络字节序),参数pszNetName为网卡接口名称,默认为"eth0"。返回值为0表示成功,其他为错误码。
SetDefaultRoute:设置指定网卡的默认路由(该接口仅对Linux有效)。参数uiGateway为整型网关(网络字节序),为-1时, 表示删除指定网卡接口的默认路由;若pszNetName也为NULL,则表示删除所有默认路由。参数pszNetName为网卡接口名称,默认为"eth0"。返回值为0表示成功,其他为错误码。
EnableBroadcastRoute:使能指定网卡的广播路由(该接口仅对Linux有效)。参数bEnable为是否使能,参数pszNetName为网卡接口名称,默认为"eth0"。返回值为0表示成功,其他为错误码。
SetRouteMetric:设置指定网卡的路由的metric值(该接口仅对Linux有效),一般用于多网卡时选择和切换活动网络。参数pszNetName为网卡接口名称,参数uiMetric为路由的metric值。返回值为0表示成功,其他为错误码。
IsCablePluggedIn:判断指定网卡的网线是否插入,一般用于有线网卡(该接口仅对Linux有效)。参数pszNetName为网卡接口名称,默认为"eth0"。返回值为true表示存在,否则不存在。
EnableNetwork:使能指定网卡的网络(该接口仅对Linux有效)。参数bEnable表示是否使能网络,参数pszNetName为网卡接口名称,默认为"eth0"。返回值为0表示成功,其他为错误码。
GetMacAddr:获取指定网卡的MAC地址(该接口仅对Linux有效)。参数pucMac为MAC地址,参数bGetFromCmdlineIfFailed表示获取失败时,是否从命令行继续获取(网口损坏时,普通方法获取MAC地址会失败),参数pszNetName为网卡接口名称,默认为"eth0"。返回值为0表示成功,其他为错误码。
SetMacAddr:设置指定网卡的MAC地址(该接口仅对Linux有效)。参数pucMac为MAC地址,参数pszNetName为网卡接口名称,默认为"eth0"。返回值为0表示成功,其他为错误码。
GetPacketLoss:获取指定网卡的丢包率(该接口仅对Linux有效)。参数uiLossRate为丢包率,单位为百分比,取值为0到100。参数pszNetName为网卡接口名称,默认为"eth0"。返回值为0表示成功,其他为错误码。