【问题标题】:Get IPv6 DNS Server Addresses using GetAdaptersAddresses()使用 GetAdaptersAddresses() 获取 IPv6 DNS 服务器地址
【发布时间】:2021-07-14 12:38:27
【问题描述】:

我正在尝试在 C++ 中获取 DNS 服务器 IPv6 地址,我发现这篇文章展示了如何使用 GetAdaptersAddresses() 获取信息:GetAdaptersAddresses function (iphlpapi.h)。本文还提供了示例代码。通过说明,它说 IP_ADAPTER_ADDRESSES 结构的 FirstDnsServerAddress 成员是指向 IP_ADAPTER_DNS_SERVER_ADDRESS 结构的链接列表的指针。 SOCKET_ADDRESS 结构用于 IP_ADAPTER_DNS_SERVER_ADDRESS 结构。 lpSockaddr 成员指向的 SOCKADDR 结构根据选择的协议或地址族而有所不同。例如,sockaddr_in6 结构用于 IPv6 套接字地址,而 sockaddr_in4 结构用于 IPv4 套接字地址。根据这些说明,我修改了示例代码以获取 IP 地址,如下所示:

pDnServer = pCurrAddresses->FirstDnsServerAddress;
if (pDnServer) {
    for (i = 0; pDnServer != NULL; i++) {
        switch (pDnServer->Address.lpSockaddr->sa_family) {
            case AF_INET:
                if (pDnServer->Address.lpSockaddr) {
                    char* ipv4_addrstr = (char*)malloc(INET_ADDRSTRLEN * sizeof(char));
                    inet_ntop(AF_INET, (struct sockaddr_in*)pDnServer->Address.lpSockaddr->sa_data, ipv4_addrstr, INET_ADDRSTRLEN);
                    printf("IPv4 Address: %s\n", ipv4_addrstr);
                    free(ipv4_addrstr);
                }
                break;
            case AF_INET6: 
                if (pDnServer->Address.lpSockaddr) {
                    char* ipv6_addrstr = (char*)malloc(INET6_ADDRSTRLEN * sizeof(char));
                    memset(ipv6_addrstr, 0, sizeof(char) * INET6_ADDRSTRLEN);
                    inet_ntop(AF_INET6, (struct sockaddr_in6*)pDnServer->Address.lpSockaddr->sa_data, ipv6_addrstr, INET6_ADDRSTRLEN);
                    printf("IPv6 Address: %s\n", ipv6_addrstr);
                    free(ipv6_addrstr);
                }
                break;

            default:
                printf("\tAddress Family Name: Unknown\n");
                break;
        } // End switch
        pDnServer = pDnServer->Next;
    } // End for loop
        
    printf("\tNumber of DNS Server Addresses: %d\n", i);
}

代码正确获取 IPv4 DNS 服务器地址。但是,代码返回不正确的 IPv6 地址。例如,Google DNS 服务器地址是 2001:4860:4860::88882001:4860:4860::8844。如果我输入这些地址作为我的 IPv4 DNS 服务器地址,代码将返回 ::2001:4860:4860:0:0

有人知道我在这段代码中可能有什么问题吗?

【问题讨论】:

    标签: c++ c sockets dns network-programming


    【解决方案1】:

    您将错误的数据传递给inet_ntop。您应该传递 sin_addrsin6_addr 成员,具体取决于协议。

    inet_ntop(AF_INET, &((struct sockaddr_in*)pDnServer->Address.lpSockaddr)->sin_addr, ipv4_addrstr, INET_ADDRSTRLEN);
    
    inet_ntop(AF_INET6, &((struct sockaddr_in6*)pDnServer->Address.lpSockaddr)->sin6_addr, ipv6_addrstr, INET6_ADDRSTRLEN);
    

    【讨论】:

      猜你喜欢
      • 2016-05-28
      • 2013-05-18
      • 2016-11-03
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      相关资源
      最近更新 更多