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


相关文章
|
3月前
|
C++
基于Reactor模型的高性能网络库之地址篇
这段代码定义了一个 InetAddress 类,是 C++ 网络编程中用于封装 IPv4 地址和端口的常见做法。该类的主要作用是方便地表示和操作一个网络地址(IP + 端口)
173 58
|
3月前
|
网络协议 算法 Java
基于Reactor模型的高性能网络库之Tcpserver组件-上层调度器
TcpServer 是一个用于管理 TCP 连接的类,包含成员变量如事件循环(EventLoop)、连接池(ConnectionMap)和回调函数等。其主要功能包括监听新连接、设置线程池、启动服务器及处理连接事件。通过 Acceptor 接收新连接,并使用轮询算法将连接分配给子事件循环(subloop)进行读写操作。调用链从 start() 开始,经由线程池启动和 Acceptor 监听,最终由 TcpConnection 管理具体连接的事件处理。
68 2
|
3月前
基于Reactor模型的高性能网络库之Tcpconnection组件
TcpConnection 由 subLoop 管理 connfd,负责处理具体连接。它封装了连接套接字,通过 Channel 监听可读、可写、关闭、错误等
91 1
|
3月前
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
145 3
|
3月前
基于Reactor模式的高性能网络库github地址
https://github.com/zyi30/reactor-net.git
54 0
|
15天前
|
并行计算 C++ Windows
|
3月前
基于Reactor模型的高性能网络库之Poller(EpollPoller)组件
封装底层 I/O 多路复用机制(如 epoll)的抽象类 Poller,提供统一接口支持多种实现。Poller 是一个抽象基类,定义了 Channel 管理、事件收集等核心功能,并与 EventLoop 绑定。其子类 EPollPoller 实现了基于 epoll 的具体操作,包括事件等待、Channel 更新和删除等。通过工厂方法可创建默认的 Poller 实例,实现多态调用。
209 60
|
3月前
|
安全 调度
基于Reactor模型的高性能网络库之核心调度器:EventLoop组件
它负责:监听事件(如 I/O 可读写、定时器)、分发事件、执行回调、管理事件源 Channel 等。
193 57
|
3月前
基于Reactor模型的高性能网络库之时间篇
是一个用于表示时间戳(精确到微秒)**的简单封装类
139 57
|
3月前
|
缓存 索引
基于Reactor模式的高性能网络库之缓冲区Buffer组件
Buffer 类用于处理 Socket I/O 缓存,负责数据读取、写入及内存管理。通过预分配空间和索引优化,减少内存拷贝与系统调用,提高网络通信效率,适用于 Reactor 模型中的异步非阻塞 IO 处理。
110 3