解决Qt下利用winpcap获取网卡设备描述信息不全的问题

本文对比了使用WinPcap库中的pcap_findalldevs函数与Windows API函数GetAdaptersInfo获取网卡信息的方法。前者能够得到正确的适配器名称(AdapterName),但在描述(Description)上存在问题;后者则能获取准确的描述信息,但适配器名称路径不完整,导致无法正常打开网卡。文中还提供了通过Windows API获取网卡信息的具体代码实现。

利用winpcap库提供的函数pcap_findalldevs,获取到的网卡设备描述信息如图1所示,无法区分五个不同的虚拟网卡。

图1

修改点:

        调用windows下自带的接口获取网卡设备信息,代码如下:

//windows下需要使用到的头文件
#include <winsock2.h>
#include <iphlpapi.h>

//并且在工程目录下的X.pro文件中添加一行链接静态库: LIBS += -lIphlpapi

PIP_ADAPTER_INFO PcapCommon::getAllDev() 
{ 
    PIP_ADAPTER_INFO pAdapterInfo; 
    DWORD dwRetVal; 
    ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO); 
 
    pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulOutBufLen); 
    if (!pAdapterInfo) 
    { 
        return NULL; 
    } 
 
    dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen); 
    // 第一次调用GetAdapterInfo获取ulOutBufLen大小 
    if (ERROR_BUFFER_OVERFLOW == dwRetVal) 
    { 
        free(pAdapterInfo); 
        pAdapterInfo  = (PIP_ADAPTER_INFO)malloc(ulOutBufLen); 
        if (!pAdapterInfo) 
        { 
            return NULL; 
        } 
        dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen); 
    } 
    if (NO_ERROR == dwRetVal) 
    { 
        return pAdapterInfo; 
    } 
 
    if (pAdapterInfo != NULL) 
    { 
        free(pAdapterInfo); 
    } 
    return NULL; 
} 
// combobox adapter 初始化
void Widget::comboboxAdapterInit()
{
    while(ui->comboBoxAdapter->count() > 0)
    {
        ui->comboBoxAdapter->removeItem(0);
    }

    PIP_ADAPTER_INFO pAdapterInfo = pcap->getAllDev();
    PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
    while (pAdapter)
    {
        QPixmap icon  = style()->standardPixmap(QStyle::SP_DriveNetIcon);
        ui->comboBoxAdapter->addItem(icon, pAdapter->Description);
        pAdapter = pAdapter->Next;
    }

    if (pAdapterInfo)
    {
        free(pAdapterInfo);
    }
}

运行结果如图2所示,网卡设备的描述信息可以正常并完整的获取。

图2

前两种方式存在的问题相反,使用pcap_findalldevs得到的AdapterName正确,但Description存在问题,导致多个虚拟网卡无法区分;

使用winAPI得到的Description正常可以区分不同的网卡,但AdapterName路径不全,导致pcap_open_live打开失败!             

比如:正常的AdapterName为\Device\NPF_{62CF518E-87AC-455B-AF08-E9987953ECED},使用winAPI获取到的AdapterName为{62CF518E-87AC-455B-AF08-E9987953ECED}!

pcap_findalldevs在linux平台下底层调用的为ioctl,所以在此不列举ioctl获取网卡信息的方式。

下面介绍QT自带的获取网卡设备信息的方式:

https://www.cnblogs.com/cppskill/p/6064395.html

https://blog.csdn.net/wjs1033/article/details/22697063

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值