如何获取系统的IP地址

问题描述:

如何获取系统的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

后看到你的意思是“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

你的问题不是很具体,但这应该帮助:

http://www.codeguru.com/forum/showthread.php?t=233261

如果您在防火墙后面,想知道你的公网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

如果您可以访问.NET Framework(托管C++),则可以使用System.Net.Dns.GetHostAddress方法。请参阅此处了解更多信息:http://msdn.microsoft.com/en-us/library/system.net.dns.gethostaddresses.aspx 实际上,您可以获得一组IP地址,因为一个域名可以对应多个IP。

对于本地IP地址,您可以使用winsock。看看this example

如果您使用winsock,请确保在项目中添加适当的库。例如,我必须在VS 2008中添加Ws2_32.lib

// 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; 
}