根据这个问题:
How to get local IP address of Windows system?
@Remy回答说,GetAdaptersAddresses()是使用C++获取Windows中本地计算机的IP地址的一种方式。
我编译了这个例子,这个例子没有打印出机器的本地IP地址。我查看了函数返回(IP_ADAPTER_ADDRESSES_LH)的结构,并惊讶地发现我没有看到任何对实际IP地址所在位置的引用。
我的问题是,IP_ADAPTER_ADDRESSES_LH结构中的IP地址在哪里?
发布于 2019-01-22 19:42:10
我编译了这个例子,这个例子没有打印出机器的本地IP地址。
GetAdaptersAddresses()一直对我很好。
IP_ADAPTER_ADDRESSES_LH结构中的IP地址在哪里?
结构中可能有许多IP地址,这取决于您感兴趣的IP地址类型-- Unicast、Anycast、Multicast或DnsServer。对于本地分配的IP,通常只使用Unicast地址:
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() )。sockaddr_in*或sockaddr_in6*的sockaddr_in*指针或sockaddr_in6*指针,这取决于IP地址分别是IPv4还是IPv6 (使用SOCKADDR::sa_family字段确定正确的类型-- AF_INET for sockaddr_in,AF_INET6 for sockaddr_in6)。然后,您可以根据需要访问sockaddr_in::sin_addr或sockaddr_in6::sin6_addr字段,其中包含IP地址的实际字节。例如:
PIP_ADAPTER_ADDRESSES pAddresses = ...; // allocate buffer as needed...
ULONG ulSize = ...; // size of allocated buffer...
if (GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_FRIENDLY_NAME, NULL, pAddresses, &ulSize) == 0)
{
for (PIP_ADAPTER_UNICAST_ADDRESS_LH *pAddress = pAddresses->FirstUnicastAddress;
pAddress != NULL;
pAddress = pAddress->Next)
{
SOCKADDR *pSockAddr = pAddress->Address.lpSockaddr;
switch (pSockAddr->sa_family)
{
case AF_INET: {
sockaddr_in *pInAddr = (sockaddr_in*) pSockAddr;
// use pInAddr->sin_addr as needed...
break;
}
case AF_INET6: {
sockaddr_in6 *pIn6Addr = (sockaddr_in6*) pSockAddr;
// use pIn6Addr->sin6_addr as needed...
break;
}
}
}
}
// free pAddresses as needed ...https://stackoverflow.com/questions/54314901
复制相似问题