0


超级好用的C++实用库之网络

💡 需要该C++实用库源码的大佬们,可搜索微信公众号“希望睿智”。添加关注后,输入消息“超级好用的C++实用库”,即可获得源码的下载链接。

概述

    在网络相关的项目中,我们经常需要去获取和设置设备的IP地址、子网掩码、网关地址、MAC地址等信息。这些信息一般与操作系统相关,在Windows系统和Linux系统上调用的接口是不一样的。在Linux系统和基于Linux的一些嵌入式系统上,还涉及一些其他操作,比如:添加指定网卡的路由,使能指定网卡的广播路由,或获取指定网卡的丢包率等。简化所有这些信息的获取与设置,并提供跨平台的统一接口,是非常有必要的。

CHP_Network

    为了方便网络相关信息的获取与设置,我们封装了CHP_Network类。这个类是一个接口类,不需要实例化。因此,我们将构造函数和析构函数声明成了私有的。CHP_Network类的头文件,可参考下面的示例代码。
#pragma once

#include <string>
#include <vector>

#ifndef _WIN32
        #include "HP_Mutex.h"
#endif

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);

#ifndef _WIN32
        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);
#endif

private:
#ifndef _WIN32
        static CHP_Mutex m_mutexResolvConf;
#endif
};
    下面,我们将分别介绍这些静态接口。

    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表示成功,其他为错误码。

总结

    可以看到,我们提供了非常多实用的网络接口。通过封装网络接口,不仅能够简化开发流程,提升开发效率,还能确保代码质量和系统的长期可维护性。

💡 需要该源码的大佬们,可以移步至这里下载:【免费】超级好用的C++实用库+跨平台资源-CSDN文库

标签: c++ 网络 开发语言

本文转载自: https://blog.csdn.net/hope_wisdom/article/details/139079065
版权归原作者 希望_睿智 所有, 如有侵权,请联系我们删除。

“超级好用的C++实用库之网络”的评论:

还没有评论