每个问题
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地址在哪里?
答案 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_INET6
或sockaddr_in6
字段,其中包含IP地址的实际字节。
例如:
sockaddr_in::sin_addr