前面提到的DnsQueryEx方法及相关内容仅适用于Win8, 对于Win8以下版本的系统, 需要用DnsQuery这个方法.
基本大同小异, 比DnsQueryEx简单明了一些.
DnsQuery function
DnsQuery是通用DNS查询接口.像很多DNS方法一样, DnsQuery方法可以实现多种字符集编码查询,如下:
Windows 8: 如果应用程序要进行异步查询,请使用DnsQueryEx方法.
DNS_STATUS WINAPI DnsQuery(
_In_ PCTSTRl<span style="white-space:pre"> </span>pstrName,
_In_ WORD<span style="white-space:pre"> </span>wType,
_In_ DWORD<span style="white-space:pre"> </span>Options,
_Inout_opt_ PVOID<span style="white-space:pre"> </span>pExtra,
_Out_opt_ PDNS_RECORD*<span style="white-space:pre"> </span>ppQueryResultsSet,
_Out_opt_ PVOID*<span style="white-space:pre"> </span>pReserved
);
指向要查询的DNS名称(DNS name)的字符串指针.
要请求的资源记录(Resource Record)(RR)类型DNS Record Type. wType决定了ppQueryResultsSet的数据类型.例如,如果wType值为DNS_TYPE_A,ppQueryResultsSet数据类型为DNS_A_DATA.
查询配置,可以是一个或多个DNS QueryOptions的组合,配置将覆盖DNS_QUERY_STANDARD (0).
预留参数,必须置NULL.
可选参数.指向响应中RR列表的指针的指针,详请参考注意.
预留参数,必须置NULL.
成功返回ERROR_SUCCESS.失败错误码DNS_STATUS定义参阅Winerror.h
应用程序使用合法DNS名称(DNS name)和资源记录(Resource Record)(RR)类型进行查询,并根据服务所需设置查询配置选项(Options).当Options设置为DNS_QUERY_STANDARD时,使用解析器缓存,先进行UDP查询,然后如果响应截断使用TCP重试,并请求服务器代表客户端执行递归解析查询
应用程序必须调用DnsRecordListFree()方法释放返回的RR.
注意:当调用DnsQuery时, DNS服务器可能在一次查询中返回多个记录.多宿主主机,例如, 对于同一个IP可能会收到多个A记录.调用者应确保所有返回的记录都被妥善处理.
考虑一下情景,多宿主主机返回的记录需要额外的动作:一个多宿主主机调用DnsQuery_A方法进行查询,发现与第一条记录相关连的IP地址没有响应.那么应用程序应该尝试使用记录中的其他IP地址.
如果lpstrName 参数被置为NULL,那么DnsQuery函数将返回错误码INVALID_PARAMETER.