qt獲取IP、閘道器地址
阿新 • • 發佈:2019-02-19
最近由於專案需要使用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";
}
親測成功!