IP_ADAPTER_ADDRESSES_LH中的IP地址在哪里

时间:2019-01-22 19:08:04

标签: c++ windows winapi

每个问题

How to get local IP address of Windows system?

@Remy Lebeau回答说GetAdaptersAddresses()是使用C ++在Windows中获取本地计算机IP地址的一种方法。

我编译了该示例,但该示例未打印出计算机的本地IP地址。我看了看该函数返回(IP_ADAPTER_ADDRESSES_LH)的结构,但惊讶地发现我没有看到任何有关实际IP地址的引用。

我的问题是,IP_ADAPTER_ADDRESSES_LH结构中的IP地址在哪里?

1 个答案:

答案 0 :(得分:2)

  

我编译了该示例,但该示例未打印出计算机的本地IP地址。

GetAdaptersAddresses()对我来说一直很好。

  

IP_ADAPTER_ADDRESSES_LH结构中的IP地址在哪里?

结构中可能有许多个IP地址,具体取决于您对IP地址的种类感兴趣-单播,任播,多播或DnsServer。对于本地分配的IP,通常只使用单播地址:

  • IP_ADAPTER_ADDRESSES_LH::FirstUnicastAddress字段指向IP_ADAPTER_UNICAST_ADDRESS_LH结构的链表,每个IP地址一个条目。使用IP_ADAPTER_UNICAST_ADDRESS_LH::Next字段来遍历列表(MSDN示例显示了这样的循环,但是它仅计算列表中的元素数,而不会打印出列表的内容)。

  • IP_ADAPTER_UNICAST_ADDRESS_LH::Address字段包含SOCKET_ADDRESS格式的实际IP地址。

  • SOCKET_ADDRESS::lpSockaddr字段是SOCKADDR*指针。您可以将其原样传递给套接字API,例如bind()

  • 如果要使用IP地址做某事(例如显示它),则必须将SOCKET_ADDRESS::lpSockAddr指针键入到sockaddr_in*sockaddr_in6*中,具体取决于有关IP地址分别是IPv4还是IPv6的信息(使用SOCKADDR::sa_family字段来确定正确的类型-AF_INET的{​​{1}},sockaddr_in的{​​{1}}) 。然后,您可以根据需要访问AF_INET6sockaddr_in6字段,其中包含IP地址的实际字节。

例如:

sockaddr_in::sin_addr