如何使用 DnsQuery 指定要查询的特定 DNS 服务器

How does one specify a specific DNS server to query using DnsQuery?

本文关键字:DNS 服务器 查询 何使用 DnsQuery      更新时间:2023-10-16

DnsQuery没有参数来指定要查询的服务器。另一方面,我看到了此示例,它似乎在 MSDN 文档中标记为"保留且必须为 0"的参数中传递了一个 IP。

有没有办法查询特定的服务器(就像nslookup一样?还是我必须编写自己的DNS客户端(或者当然要找到一个库(?

DnsQuery PVOID pExtra的第 4 个参数接受包含要查询的特定 DNS 服务器的PIP4_ARRAY。这与DNS_QUERY_BYPASS_CACHE的第3个参数DWORD Options相结合,以绕过解析器缓存。

这从Windows 2000开始工作,在Windows XP DnsQuery中调用该函数。称为privateNarrowToWideQuery(在dnsapi.dll中(,并将pExtra参数作为PIP4_ARRAY。

MSDN在这方面是不准确的,导致这是一个未记录的功能。在旧版本的 DnsQuery API 调用中,pExtra过去称为 aipServers

关于IPV6 AAAA记录的DNS,您可以使用第二个参数尝试该功能 WORD wType作为DNS_TYPE_AAAA,第五个参数PDNS_RECORD *ppQueryResultsSet为指向DNS_AAAA_DATA的指针。尽管这仍然会迫使您传入IPV4 IP地址阵列而不是IPV6。

有关 IPV6 查询的 Windows 版本支持,请参阅以下参考资料

  • 域名服务 (DNS(
  • Windows Vista 中的域名系统客户端行为
  • Windows
  • Vista 和 Windows Server 2008 中对 IPv6 的更改

在未来的Windows版本中,我相信IPV6的正确方法是使用。 DnsQueryEx,其第一个参数PDNS_QUERY_REQUEST pQueryRequest包含成员PDNS_ADDR_ARRAY pDnsServerList; ,其中包含指定 DNS 服务器 IP 地址类型的成员WORD Family;

DnsQuery 是否已经支持指向PDNS_ADDR_ARRAY的指针作为PVOID pExtra的参数,或者将在未来的 Windows 版本中进行修改以执行此操作,我不确定,但欢迎您尝试查看。

如你已发现的示例代码,请参阅如何使用 DnsQuery 函数通过 Visual C++ .NET 解析主机名和主机地址。

另请参阅以下类似的 SO 问题。

它有一个函数:

        PCSTR       pszName = machine.c_str(); 
        DWORD       Options = NULL; 
        PVOID       pExtra = NULL; 
        PDNS_RECORD ppQueryResults; 
        PVOID       *pReserved = NULL; 

DNS_STATUS DNS_stat = DnsQuery_A(
                pszName,
                DNS_TYPE_A,
                Options,
                pExtra,
                &ppQueryResults,
                pReserved
            );

其中 pszName 是服务器名称。