首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IP_ADAPTER_ADDRESSES_LH中的ip地址在哪里?

IP_ADAPTER_ADDRESSES_LH中的ip地址在哪里?
EN

Stack Overflow用户
提问于 2019-01-22 19:08:03
回答 1查看 670关注 0票数 0

根据这个问题:

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地址在哪里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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() )。
  • 如果要对IP地址执行某些操作(如显示IP地址),则必须键入指向sockaddr_in*sockaddr_in6*sockaddr_in*指针或sockaddr_in6*指针,这取决于IP地址分别是IPv4还是IPv6 (使用SOCKADDR::sa_family字段确定正确的类型-- AF_INET for sockaddr_inAF_INET6 for sockaddr_in6)。然后,您可以根据需要访问sockaddr_in::sin_addrsockaddr_in6::sin6_addr字段,其中包含IP地址的实际字节。

例如:

代码语言:javascript
复制
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 ...
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54314901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档