DnsQuery没有指定要查询的服务器的参数。另一方面,我看到了this sample,在MSDN文档中,它似乎在标记为“保留且必须为0”的参数中传递了一个IP。
是否有某种方法可以查询特定的服务器(如nslookup所做的?)或者我必须编写自己的DNS客户端(当然也可以找到一个库)?
发布于 2012-03-09 10:53:59
DNS PVOID pExtra
的第4个参数接受包含要查询的特定DnsQuery服务器的PIP4_ARRAY
。它与DNS_QUERY_BYPASS_CACHE的第三个参数DWORD Options
结合使用,以绕过解析器缓存。
这在Windows2000之后就开始起作用了,在Windows中,DnsQuery调用名为privateNarrowToWideQuery的函数(在dnsapi.dll中),并接受pExtra
参数is作为PIP4_ARRAY。
MSDN在这方面是不准确的,导致这是一个未记录的功能。在旧版本的DnsQuery应用程序接口调用中,pExtra
通常被称为aipServers
。
关于IPV6 AAAA记录的DNS,您可以尝试使用第二个参数WORD wType
作为DNS_TYPE_AAAA
,第五个参数PDNS_RECORD *ppQueryResultsSet
作为指向DNS_AAAA_DATA
的指针的函数。但这仍然会强制您传入IPV4 IP地址数组,而不是IPV6。
关于Windows版本对IPV6查询的支持,请参阅以下参考资料
在未来的Windows版本中,我相信为IPV6做这件事的正确方法是使用DnsQueryEx
,它的第一个参数是PDNS_QUERY_REQUEST pQueryRequest
,它包含一个成员PDNS_ADDR_ARRAY pDnsServerList;
,它包含成员WORD Family;
,它指定DNS服务器是哪种类型的IP地址。
我不确定DnsQuery是否已经支持将指向PDNS_ADDR_ARRAY的指针作为PVOID pExtra
的参数,或者将在未来的版本中进行修改以实现这一点,但欢迎您尝试查看。
正如您已经发现的,有关示例代码,请参阅How to use the DnsQuery function to resolve host names and host addresses with Visual C++ .NET。
另请参阅以下similar SO Question。
发布于 2019-01-13 21:43:50
它有一个函数:
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是serverName。
https://stackoverflow.com/questions/8931824
复制相似问题