QT---Winsocket獲取網關(Gateway) 主機IP等信息


  基於WinPcap庫做開發,需要利用到局域網的默認網關地址和Mac地址,但是WinPcap實現獲取網關IP地址沒有很好的思路,可以知道的是網關的接收和發出的數據包數量一般是比局域網內的各主機要多的,可以抓包,判斷,根據這個來獲取網關的IP地址和Mac地址。不過,這不可靠。 
  很快就知道利用WinSocket里面的庫可以獲取網關的IP地址,實驗前包含必要的頭文件(

// 獲取Host IP(通過winsock2) QString PcapCommon::getHostIpByWinSock() { char hostname[256] = {0}; WSADATA wsaData; char ip[128] = {0}; // 調用Windows Sockets DLL if (WSAStartup(MAKEWORD(2,1),&wsaData)){ printf("Winsock無法初始化!\n"); WSACleanup(); return 0; } if(gethostname(hostname, sizeof(hostname)) == 0){ // 結構 struct hostent * pHost; pHost = gethostbyname(hostname); // 只取主網卡 ip BYTE *p; p =(BYTE *)pHost->h_addr; sprintf(ip,"%d.%d.%d.%d", p[0], p[1],p[2], p[3]); } return QString(ip); }
獲取完主機IP地址后,再獲取網關(Gateway)的IP地址
// 獲取本機網關(通過winsock2) QString PcapCommon::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"; }

  上面的循環是因為有多個網卡,循環列出各個網卡,思路是找到其中的一個網卡的IP地址是跟主機的IP地址是一樣的,那么就將該網卡中的網關信息返回,在這里,還可以獲取該網卡其他的信息,比如本機Mac地址,掩碼地址等,但是這里是不能獲取網關的Mac地址的,接下來就通過WinPcap來獲取IP地址是網關的IP地址的包,並得到網關的Mac地址,這樣就得到了網關的IP地址和Mac地址

  怎么用WinPcap去抓包,這里就不介紹了。可以參考WinPcap中文技術文檔:

http://www.ferrisxu.com/WinPcap/html/

測試幫助:

route print : 查看路由表信息,可以看到網關信息

這里寫圖片描述

上述的兩段代碼調試信息(程序中為了精簡,沒有打印出):

這里寫圖片描述

 
 
http://blog.csdn.net/freeape/article/details/50908911


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM