1. 程式人生 > >qt獲取IP、閘道器地址

qt獲取IP、閘道器地址

最近由於專案需要使用socket通訊,要獲取閘道器地址,於是上網搜了一下
首先我們要新增iphlpapi.lib庫,從而獲得windows下一些基本的網路連線資訊。

函式 作用
GetNumberOfInterfaces() 獲取當前的網路介面數目
GetIfTable() 得到所有網路介面的資訊
GetIpAddrTable() 獲取ip到網路介面
GetIpNetTable() IP到網絡卡地址的對映
GetTcpTable() 獲取當前TCP連線狀況
GetUdpTable() 獲取當前UDP連線狀況
GetIpStatistics()GetIcmpStatistics() GetTcpStatistics() GetUdpStatistics() 得到當前各協議的主要引數和資訊
GetAdapterIndex() GetAdaptersInfo() GetAdaptersAddresses() 得到關於網絡卡的資訊
AddIPAddress() 設定IP
SendARP() 傳送一個arp請求,獲得一個實體地址所對應的IP地址

LIBS += -L(lib所在目錄) -l(lib庫名,不要字尾)
如下所示:

LIBS += -LF
:/MyProgram/QT_DSP531Project/ -lIPHLPAPI

完成以上的操作,就可以指定.lib檔案了。其實說穿了很簡單,就是把.lib隨便放到一個目錄下,然後告訴工程,你的.lib放到哪裡了,叫什麼名字。

新增完庫後,呼叫程式碼:

#include <Qstring>
#include <QList>
#include <winsock2.h>
#include <QNetworkInterface>
#include <iphlpapi.h>//或者#pragma comment(lib, "iphlpapi.lib")
QString getHostIpByWinSock() //獲取本機IP地址 { QString IP; QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses(); for (int i = 0; i < ipAddressesList.size(); ++i) { if (ipAddressesList.at(i) != QHostAddress::LocalHost && ipAddressesList.at(i).toIPv4Address()) { // 如果這個地址不是127.0.0.1,並且是IPv4的地址,就將其賦值給IP,並結束for迴圈 IP = ipAddressesList.at(i).toString(); break; } } // 如果IP為空,則將其賦值為127.0.0.1 if (IP.isEmpty()) IP = QHostAddress(QHostAddress::LocalHost).toString(); return IP; } QString getGateway() //獲取閘道器地址 { PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO(); unsigned long stSize = sizeof(IP_ADAPTER_INFO); int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize); if (ERROR_BUFFER_OVERFLOW == nRel){ // ERROR_BUFFER_OVERFLOW:記憶體空間不夠 // 釋放原來的記憶體空間 delete pIpAdapterInfo; // 重新申請記憶體空間用來儲存所有網絡卡資訊 pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize]; // 再次呼叫GetAdaptersInfo nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize); } if (ERROR_SUCCESS == nRel){ while (pIpAdapterInfo){ switch(pIpAdapterInfo->Type){ case MIB_IF_TYPE_OTHER: break; case MIB_IF_TYPE_ETHERNET: break; case MIB_IF_TYPE_TOKENRING: break; case MIB_IF_TYPE_FDDI: break; case MIB_IF_TYPE_PPP: break; case MIB_IF_TYPE_LOOPBACK: break; case MIB_IF_TYPE_SLIP: break; default: break; } for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++) if (i < pIpAdapterInfo->AddressLength-1){ } else{ } // 多個網絡卡、多個IP IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList); do{ if(QString(pIpAddrString->IpAddress.String) == getHostIpByWinSock()){ return QString(pIpAdapterInfo->GatewayList.IpAddress.String); } pIpAddrString=pIpAddrString->Next; } while (pIpAddrString); pIpAdapterInfo = pIpAdapterInfo->Next; } } //釋放記憶體空間 if (pIpAdapterInfo){ delete pIpAdapterInfo; } return "0.0.0.0"; }

親測成功!
這裡寫圖片描述