欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt获取IP地址、MAC地址等网卡信息,区分本地网卡、无线网卡和虚拟网卡

程序员文章站 2022-07-16 19:31:53
...

原文地址::https://blog.csdn.net/caoshangpa/article/details/51073138


1.只有一个本地网卡

        此时获取IP地址最简单的方法如下所示,但是这种方法只能获取IP地址。需包含头文件#include <QNetworkInterface>,.pro文件中加入network模块。

  1. void getLocalIpWithQt()
  2. {
  3. QList<QHostAddress> ipList = QNetworkInterface::allAddresses();
  4. foreach(QHostAddress ipItem, ipList)
  5. {
  6. //只显示以192开头的IP地址
  7. if(ipItem.protocol()==QAbstractSocket::IPv4Protocol&&ipItem!=QHostAddress::Null
  8. &&ipItem!=QHostAddress::LocalHost&&ipItem.toString().left(3)=="192")
  9. {
  10. qDebug()<<ipItem.toString();
  11. }
  12. }
  13. }

2.只有虚拟网卡和一个本地网卡

        安装了虚拟机后,获取网卡信息时,会自动获取到虚拟网卡的信息,但是我们大多数时候并不需要虚拟网卡信息,因此必须以虚拟网卡的MAC地址为条件将其过滤掉。如下所示,"00:50:56:C0:00:01"和"00:50:56:C0:00:08"是虚拟网卡的MAC地址。

  1. void getAdapterInfoWithQt()
  2. {
  3. QList<QNetworkInterface> interfaceList = QNetworkInterface::allInterfaces();
  4. foreach(QNetworkInterface interfaceItem, interfaceList)
  5. {
  6. if(interfaceItem.flags().testFlag(QNetworkInterface::IsUp)
  7. &&interfaceItem.flags().testFlag(QNetworkInterface::IsRunning)
  8. &&interfaceItem.flags().testFlag(QNetworkInterface::CanBroadcast)
  9. &&interfaceItem.flags().testFlag(QNetworkInterface::CanMulticast)
  10. &&!interfaceItem.flags().testFlag(QNetworkInterface::IsLoopBack)
  11. &&interfaceItem.hardwareAddress()!="00:50:56:C0:00:01"
  12. &&interfaceItem.hardwareAddress()!="00:50:56:C0:00:08")
  13. {
  14. QList<QNetworkAddressEntry> addressEntryList=interfaceItem.addressEntries();
  15. foreach(QNetworkAddressEntry addressEntryItem, addressEntryList)
  16. {
  17. if(addressEntryItem.ip().protocol()==QAbstractSocket::IPv4Protocol)
  18. {
  19. qDebug()<<"------------------------------------------------------------";
  20. qDebug()<<"Adapter Name:"<<interfaceItem.name();
  21. qDebug()<<"Adapter Address:"<<interfaceItem.hardwareAddress();
  22. qDebug()<<"IP Address:"<<addressEntryItem.ip().toString();
  23. qDebug()<<"IP Mask:"<<addressEntryItem.netmask().toString();
  24. }
  25. }
  26. }
  27. }
  28. }

        通过这种方法同样需要需包含头文件#include <QNetworkInterface>,.pro文件中加入network模块。与第一种方法相比,这种方法能获取更多的网卡信息,除了IP地址,还包括网卡名,MAC地址,和子网掩码,但是这种方法不能区分本地网卡和无线网卡。

3.区分本地网卡、无线网卡和虚拟网卡

        第二种方法能区分虚拟网卡和本机网卡(本地网卡和无线网卡),不能区分本地网卡和无线网卡,是因为通过Qt库无法达到区分本地网卡和无线网卡的目的,需要调用windows库来实现。win7下实现代码如下,需包含头文件#include <WinSock2.h>和#include <iphlpapi.h>,并在.pro文件中引入Iphlpapi.lib。

  1. void getAdapterInfoWithWindows()
  2. {
  3. //PIP_ADAPTER_INFO结构体存储本机网卡信息,包括本地网卡、无线网卡和虚拟网卡
  4. PIP_ADAPTER_INFO pAdapterInfo=(IP_ADAPTER_INFO *) malloc(sizeof(IP_ADAPTER_INFO));
  5. ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
  6. //调用GetAdaptersInfo函数,填充pAdapterInfo指针变量,其中ulOutBufLen参数既是输入也是输出
  7. if(GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS)
  8. {
  9. //如果分配失败,释放后重新分配
  10. GlobalFree (pAdapterInfo);
  11. pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
  12. }
  13. if(GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == NO_ERROR)
  14. {
  15. while (pAdapterInfo)
  16. {
  17. //pAdapter->Description中包含"PCI"为本地网卡,pAdapter->Type是71为无线网卡
  18. if(strstr(pAdapterInfo->Description,"PCI") > 0|| pAdapterInfo->Type == 71)
  19. {
  20. //这里假设每个网卡只有一个IP
  21. char * ipAddress=pAdapterInfo->IpAddressList.IpAddress.String;
  22. char tempIpAddress[3]={'\0'};
  23. memcpy(tempIpAddress,ipAddress,3);
  24. //只显示IP以192开头的网卡信息
  25. if(strstr(tempIpAddress,"192"))
  26. {
  27. printf("------------------------------------------------------------\n");
  28. printf("Adapter Name: \t%s\n", pAdapterInfo->AdapterName);
  29. printf("Adapter Description: \t%s\n", pAdapterInfo->Description);
  30. printf("Adapter Address: \t");
  31. for (UINT i = 0; i < pAdapterInfo->AddressLength; i++)
  32. {
  33. printf("%02X%c", pAdapterInfo->Address[i],
  34. i == pAdapterInfo->AddressLength - 1 ? '\n' : '-');
  35. }
  36. printf("Adapter Type: \t%d\n", pAdapterInfo->Type);
  37. printf("IP Address: \t%s\n", pAdapterInfo->IpAddressList.IpAddress.String);
  38. printf("IP Mask: \t%s\n", pAdapterInfo->IpAddressList.IpMask.String);
  39. }
  40. }
  41. pAdapterInfo = pAdapterInfo->Next;
  42. }
  43. }
  44. else
  45. {
  46. printf("Call to GetAdaptersInfo failed.\n");
  47. }
  48. if(pAdapterInfo)
  49. {
  50. GlobalFree (pAdapterInfo);
  51. }
  52. }
第三种方法在我笔记本上的运行结果如下所示,Adapter Type为71的是无线网卡,Adapter Type为6的是本地网卡。

Qt获取IP地址、MAC地址等网卡信息,区分本地网卡、无线网卡和虚拟网卡
总结

        这三个方法都只适合每种网卡只有一个的情况,比如说电脑上如果有两个无线网卡,就无法对着两个无线网卡进行区分。

源码链接:见http://blog.csdn.net/caoshangpa/article/details/51073138的评论