我如何获得系统的IP地址

时间:2010-10-22 13:49:49

标签: c++ windows

如何获取系统的IP地址。

我想要在执行ipconfig/bin/ifconfig

之后看到的IP地址

6 个答案:

答案 0 :(得分:4)

您的意思是“IP地址” - 在Win32中使用GetAdapterAddresses。那里有示例代码。

这有点令人费解,因为您首先调用API必须查看您需要多少内存,然后使用所需的内存块再次调用相同的API。然后,您必须遍历该内存块中返回的结构列表,如示例所示。你最终会得到的是:

  

使用SOCKET_ADDRESS结构   在IP_ADAPTER_ADDRESSES结构中   AdapterAddresses指出   参数。在Microsoft Windows上   软件开发套件(SDK)   发布于Windows Vista及更高版本,   头文件的组织有   改变了和SOCKET_ADDRESS   结构在Ws2def.h中定义   头文件是自动的   包含在Winsock2.h头文件中   文件。在发布的Platform SDK上   Windows Server 2003和Windows XP,   SOCKET_ADDRESS结构是   在Winsock2.h头文件中声明   文件。为了使用   IP_ADAPTER_ADDRESSES结构,   Winsock2.h头文件必须是   包含在Iphlpapi.h标题之前   文件。

此时,您可以调用WSAAddressToString来串联SOCKET_ADDRESS结构中的IP地址,无论是IPv6还是IPv4。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果您位于防火墙后面且想知道您的公共IP地址,您可以使用HTTP客户端库来抓取this one之类的网页(有一个只返回IP地址为text / plain,但我现在找不到它。)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分: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;
}