2010-10-22 142 views
1

如何獲取系統的IP地址?如何獲取系統的IP地址

我想要的IP地址,我可以做ipconfig/bin/ifconfig

+3

什麼IP地址 - 內部網絡或計算機通過互聯網連接的?如果內置多個網卡會怎麼樣? – 2010-10-22 13:53:54

+1

更重要的是,IPv4還是IPv6? – MSalters 2010-10-22 14:03:37

+1

很多時候,當有人說「我想**系統的** IP地址」時,他的整個設計都是錯誤的。您**必須**假設系統可以有0到N個IP地址。其他一切都是錯誤的。 – ereOn 2010-10-22 14:59:50

回答

4

後看到你的意思是「IP地址」 - 在Win32中使用GetAdapterAddresses。那裏有示例代碼。

這有點令人費解,因爲您首先調用API必須查看您需要多少內存,然後再次調用具有所需內存塊的相同API。然後,您必須按照示例所示遍歷該內存塊中返回的結構列表。什麼你最終鑼去是這樣的:

的SOCKET_ADDRESS結構在IP_ADAPTER_ADDRESSES結構 由AdapterAddresses 參數指向使用 。在Microsoft Windows 軟件開發工具包(SDK) 發佈的Windows Vista和更高版本, 的頭文件組織 改變,SOCKET_ADDRESS 結構在Ws2def.h 頭文件自動爲 由包括定義Winsock2.h標頭 文件。在平臺SDK發佈的 Windows Server 2003和Windows XP, SOCKET_ADDRESS結構是 在Winsock2.h標頭 文件中聲明。爲了使用 IP_ADAPTER_ADDRESSES結構, Winsock2.h頭文件必須包含在Iphlpapi.h頭文件 之前的 。

在這一點上,你可以打電話給WSAAddressToString字符串IZE多數民衆贊成召開SOCKET_ADDRESS結構內部的IP地址,不管是IPv6或IPv4。

+0

您可以在第一時間傳遞合理的價值(例如4KB),這將爲您節省第二次通話時間。 – MSalters 2010-10-22 14:05:56

+0

@ MSalters - yes - 另一種方法是嘗試使用sizeof(struct)的一些適當倍數 - 大多數機器不會有超過10個網絡適配器。 – 2010-10-22 14:07:47

+0

這取決於。在我工作的地方,有更多的10卡適配器是相當普遍的(至少在某些服務器上)。 – ereOn 2010-10-22 15:02:53

0

如果您在防火牆後面,想知道你的公網IP地址,你可以使用一個HTTP客戶端庫刮像this one這樣的網頁(有一個只是以文本/純文本的形式返回IP地址,但我現在找不到它)。

+0

在C++中? (15個字符) – 2010-10-22 13:55:01

+0

謝謝@The ...不正確閱讀標籤是我的一個壞習慣。 – 2010-10-22 13:56:00

+0

[我知道你的意思](http://stackoverflow.com/questions/3962395/really-simple-programming-languages/3963880#3963880「不讀thouroghly」):) – Default 2010-10-22 14:00:07

0

對於本地IP地址,您可以使用winsock。看看this example

如果您使用winsock,請確保在項目中添加適當的庫。例如,我必須在VS 2008中添加Ws2_32.lib

0
// Requires that WSAStartup has been called 
std::vector<std::string> GetIPAddresses(const std::string& hostname) 
{ 
    std::vector<std::string> result; 

    // We use getaddrinfo (gethostbyname has been deprecated) 
    struct addrinfo hints = {0}; 
    hints.ai_family = AF_UNSPEC; // Want both IPv4 and IPv6 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 

    struct addrinfo *paddrinfo = NULL; 

    if (getaddrinfo(hostname.c_str(), NULL, &hints, &paddrinfo)!=0) 
     return result; // Something is wrong, empty list returned 

    // The machine can have multiple IP addresses (IPv4, IPv6, etc.) 
    for(struct addrinfo *ptr=paddrinfo; ptr != NULL ;ptr=ptr->ai_next) 
    { 
     // inet_ntop is not available for all versions of Windows, we implement our own 
     char ipaddress[NI_MAXHOST] = {0}; 
     if (ptr->ai_family == AF_INET) 
     { 
      if (getnameinfo(ptr->ai_addr, sizeof(struct sockaddr_in), ipaddress, _countof(ipaddress)-1, NULL, 0, NI_NUMERICHOST)==0) 
       result.push_back(std::string(ipaddress)); 
     } 
     else if (ptr->ai_family == AF_INET6) 
     { 
      if (getnameinfo(ptr->ai_addr, sizeof(struct sockaddr_in6), ipaddress, _countof(ipaddress)-1, NULL, 0, NI_NUMERICHOST)==0) 
       result.push_back(std::string(ipaddress)); 
     } 
    } 

    freeaddrinfo(paddrinfo); 

    return result; 
}