利用winpcap库提供的函数pcap_findalldevs,获取到的网卡设备描述信息如图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所示,网卡设备的描述信息可以正常并完整的获取。
前两种方式存在的问题相反,使用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
本文对比了使用WinPcap库中的pcap_findalldevs函数与Windows API函数GetAdaptersInfo获取网卡信息的方法。前者能够得到正确的适配器名称(AdapterName),但在描述(Description)上存在问题;后者则能获取准确的描述信息,但适配器名称路径不完整,导致无法正常打开网卡。文中还提供了通过Windows API获取网卡信息的具体代码实现。

3928

被折叠的 条评论
为什么被折叠?



