qt中查看本机mac/ip地址

墨蓝 2022-08-22 12:28 570阅读 0赞

分享一下,qt中如何获取计算机的mac和ip地址。

首先申明,不能用windows api,为了跨平台。

命令行查看
win+R cmd 出现命令提示行,键入:
ipconfig/all
这里写图片描述

QT中获取mac地址

  1. QString getMacAddress()
  2. {
  3. QString text;
  4. foreach(QNetworkInterface interface, QNetworkInterface::allInterfaces())
  5. {
  6. text += "Interface:"+interface.hardwareAddress()+"\n";
  7. if (!(interface.flags() & QNetworkInterface::IsRunning))
  8. {
  9. text = interface.hardwareAddress();
  10. qDebug() << text;
  11. return text;
  12. }
  13. }
  14. }

把E4:F8:9C:D9:84:B1形式转为uint8_t 数组

  1. #include <QGuiApplication>
  2. #include <QQmlApplicationEngine>
  3. #include <QString>
  4. #include "QtNetwork/qnetworkinterface.h"
  5. #include "qdebug.h"
  6. #include <qdatetime.h>
  7. #include <sstream>
  8. QString getMacAddress()
  9. {
  10. QString text;
  11. foreach(QNetworkInterface interface, QNetworkInterface::allInterfaces())
  12. {
  13. text += "Interface:"+interface.hardwareAddress()+"\n";
  14. if (!(interface.flags() & QNetworkInterface::IsRunning))
  15. {
  16. text = interface.hardwareAddress();
  17. qDebug() << text;
  18. return text;
  19. }
  20. }
  21. }
  22. int main(int argc, char *argv[])
  23. {
  24. uint8_t tgt_mac[6] = {
  25. 0};
  26. std::stringstream ss( getMacAddress().toStdString() );
  27. char trash;
  28. for ( int i = 0; i < 6; i++ )
  29. {
  30. int foo;
  31. ss >> std::hex >> foo >> trash;
  32. tgt_mac[i] = foo;
  33. }
  34. for (int i=0; i < 6; i++)
  35. {
  36. qDebug() << tgt_mac[i];
  37. }
  38. QGuiApplication app(argc, argv);
  39. QQmlApplicationEngine engine;
  40. engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
  41. return app.exec();
  42. }

获得更多参数

  1. #include <QCoreApplication>
  2. #include <WinSock2.h>
  3. #include <iphlpapi.h>
  4. #include <QDebug>
  5. #include <QNetworkInterface>
  6. void getLocalIpWithQt();
  7. void getAdapterInfoWithQt();
  8. void getAdapterInfoWithWindows();
  9. int main(int argc, char *argv[])
  10. {
  11. QCoreApplication a(argc, argv);
  12. // getLocalIpWithQt();
  13. // getAdapterInfoWithQt();
  14. getAdapterInfoWithWindows();
  15. return a.exec();
  16. }
  17. void getLocalIpWithQt()
  18. {
  19. QList<QHostAddress> ipList = QNetworkInterface::allAddresses();
  20. foreach(QHostAddress ipItem, ipList)
  21. {
  22. //只显示以192开头的IP地址
  23. if(ipItem.protocol()==QAbstractSocket::IPv4Protocol&&ipItem!=QHostAddress::Null
  24. &&ipItem!=QHostAddress::LocalHost&&ipItem.toString().left(3)=="192")
  25. {
  26. qDebug()<<ipItem.toString();
  27. }
  28. }
  29. }
  30. void getAdapterInfoWithQt()
  31. {
  32. QList<QNetworkInterface> interfaceList = QNetworkInterface::allInterfaces();
  33. foreach(QNetworkInterface interfaceItem, interfaceList)
  34. {
  35. if(interfaceItem.flags().testFlag(QNetworkInterface::IsUp)
  36. &&interfaceItem.flags().testFlag(QNetworkInterface::IsRunning)
  37. &&interfaceItem.flags().testFlag(QNetworkInterface::CanBroadcast)
  38. &&interfaceItem.flags().testFlag(QNetworkInterface::CanMulticast)
  39. &&!interfaceItem.flags().testFlag(QNetworkInterface::IsLoopBack)
  40. &&interfaceItem.hardwareAddress()!="00:50:56:C0:00:01"
  41. &&interfaceItem.hardwareAddress()!="00:50:56:C0:00:08")
  42. {
  43. QList<QNetworkAddressEntry> addressEntryList=interfaceItem.addressEntries();
  44. foreach(QNetworkAddressEntry addressEntryItem, addressEntryList)
  45. {
  46. if(addressEntryItem.ip().protocol()==QAbstractSocket::IPv4Protocol)
  47. {
  48. qDebug()<<"------------------------------------------------------------";
  49. qDebug()<<"Adapter Name:"<<interfaceItem.name();
  50. qDebug()<<"Adapter Address:"<<interfaceItem.hardwareAddress();
  51. qDebug()<<"IP Address:"<<addressEntryItem.ip().toString();
  52. qDebug()<<"IP Mask:"<<addressEntryItem.netmask().toString();
  53. }
  54. }
  55. }
  56. }
  57. }
  58. void getAdapterInfoWithWindows()
  59. {
  60. //PIP_ADAPTER_INFO结构体存储本机网卡信息,包括本地网卡、无线网卡和虚拟网卡
  61. PIP_ADAPTER_INFO pAdapterInfo=(IP_ADAPTER_INFO *) malloc(sizeof(IP_ADAPTER_INFO));
  62. ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
  63. //调用GetAdaptersInfo函数,填充pAdapterInfo指针变量,其中ulOutBufLen参数既是输入也是输出
  64. if(GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS)
  65. {
  66. //如果分配失败,释放后重新分配
  67. GlobalFree (pAdapterInfo);
  68. pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
  69. }
  70. if(GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == NO_ERROR)
  71. {
  72. while (pAdapterInfo)
  73. {
  74. //pAdapter->Description中包含"PCI"为本地网卡,pAdapter->Type是71为无线网卡
  75. if(strstr(pAdapterInfo->Description,"PCI") > 0|| pAdapterInfo->Type == 71)
  76. {
  77. //这里假设每个网卡只有一个IP
  78. char * ipAddress=pAdapterInfo->IpAddressList.IpAddress.String;
  79. char tempIpAddress[3]={
  80. '\0'};
  81. memcpy(tempIpAddress,ipAddress,3);
  82. //只显示IP以192开头的网卡信息
  83. if(strstr(tempIpAddress,"192"))
  84. {
  85. printf("------------------------------------------------------------\n");
  86. printf("Adapter Name: \t%s\n", pAdapterInfo->AdapterName);
  87. printf("Adapter Description: \t%s\n", pAdapterInfo->Description);
  88. printf("Adapter Address: \t");
  89. for (UINT i = 0; i < pAdapterInfo->AddressLength; i++)
  90. {
  91. printf("%02X%c", pAdapterInfo->Address[i],
  92. i == pAdapterInfo->AddressLength - 1 ? '\n' : '-');
  93. }
  94. printf("Adapter Type: \t%d\n", pAdapterInfo->Type);
  95. printf("IP Address: \t%s\n", pAdapterInfo->IpAddressList.IpAddress.String);
  96. printf("IP Mask: \t%s\n", pAdapterInfo->IpAddressList.IpMask.String);
  97. }
  98. }
  99. pAdapterInfo = pAdapterInfo->Next;
  100. }
  101. }
  102. else
  103. {
  104. printf("Call to GetAdaptersInfo failed.\n");
  105. }
  106. if(pAdapterInfo)
  107. {
  108. GlobalFree (pAdapterInfo);
  109. }
  110. }

发表评论

表情:
评论列表 (有 0 条评论,570人围观)

还没有评论,来说两句吧...

相关阅读