windows c++qt获取本机网卡信息

利用qt自带的QNetworkInterface接口以及c++Iphlpapi库,获取当前windows电脑下的网卡型号、物理地址、ip地址、子网掩码、网关等信息。

#include 

#include 
#include 
#include 

#pragma comment(lib, "Iphlpapi.lib")


//获取对应网卡部分信息
BOOL MatchNetcardInfo(UiNetcardVersion &netcardVer)
{
    PIP_ADAPTER_INFO pIPAdapterInfo = new IP_ADAPTER_INFO();
    PIP_ADAPTER_INFO adapters = nullptr;
    ULONG size = sizeof(IP_ADAPTER_INFO);

    int nRet = GetAdaptersInfo(pIPAdapterInfo, &size);


    //pIPAdapterInfo内存不够,重新申请
    if (ERROR_BUFFER_OVERFLOW == nRet)
    {
        delete pIPAdapterInfo;
        pIPAdapterInfo = (PIP_ADAPTER_INFO)new byte[size];
        nRet = GetAdaptersInfo(pIPAdapterInfo, &size);
    }

    if (ERROR_SUCCESS == nRet)
    {
        adapters = pIPAdapterInfo;
        while (adapters)
        {
            //以XX-XX-XX-XX-XX-XX的形式输出MAC
            char buf[20]{0};
            sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", adapters->Address[0], adapters->Address[1], adapters->Address[2], adapters->Address[3], adapters->Address[4], adapters->Address[5]);

            QString macTmp = buf;
            if(macTmp != netcardVer.macAddr){
                adapters = adapters->Next;
                continue;
            }

            netcardVer.desc = adapters->Description;
            //可能网卡有多IP,因此通过循环去判断
            IP_ADDR_STRING* pIpAddrString = &(adapters->IpAddressList);
            do
            {
                netcardVer.ipAddr = pIpAddrString->IpAddress.String;
                netcardVer.netMask = pIpAddrString->IpMask.String;
                netcardVer.gateway = adapters->GatewayList.IpAddress.String;
                pIpAddrString = pIpAddrString->Next;
            } while (pIpAddrString);

            break;
        }
    }

    //释放分配的内存
    if (pIPAdapterInfo)
        delete pIPAdapterInfo;

    return true;
}

//获取网卡信息
void GetNetcardInfo(){
    QList<UiNetcardVersion> netcardList;
    netcardList.clear();


    QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
    foreach(const QNetworkInterface& it, interfaces){

        if(QNetworkInterface::Loopback == it.type())
            continue;

        UiNetcardVersion netcardVer;
        //获取名称和mac地址
        netcardVer.name = it.humanReadableName();
        netcardVer.macAddr = it.hardwareAddress();
        //获取型号、ip地址、子网掩码、网关
        MatchNetcardInfo(netcardVer);
        //添加到容器
        netcardList.append(netcardVer);
    }
}

你可能感兴趣的:(windows,c++,qt)