DnsQuery沒有指定要查詢的服務器的參數。另一方面,我看到this sample,它似乎已經在MSDN文檔中標記爲「reserved並且必須爲0」的參數中傳遞了IP。如何指定一個特定的DNS服務器使用DnsQuery進行查詢?
是否有某種方式來查詢特定的服務器(如nslookup呢?)或者我將不得不編寫自己的DNS客戶端(或找到一個課程庫)?
DnsQuery沒有指定要查詢的服務器的參數。另一方面,我看到this sample,它似乎已經在MSDN文檔中標記爲「reserved並且必須爲0」的參數中傳遞了IP。如何指定一個特定的DNS服務器使用DnsQuery進行查詢?
是否有某種方式來查詢特定的服務器(如nslookup呢?)或者我將不得不編寫自己的DNS客戶端(或找到一個課程庫)?
DnsQuery PVOID pExtra
的第4個參數接受包含要查詢的特定DNS服務器的PIP4_ARRAY
。這與DNS_QUERY_BYPASS_CACHE的第三個參數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
和指針DNS_AAAA_DATA
第五個參數PDNS_RECORD *ppQueryResultsSet
功能。雖然這仍然強迫你通過IPV4 IP地址陣列而不是IPV6。
關於對IPV6查詢的Windows版本支持,請參閱以下參考
在未來的Windows版本中,我認爲正確的方式做到這一點對於IPV6將使用 DnsQueryEx
,其第一個參數爲PDNS_QUERY_REQUEST pQueryRequest
其中包含 的成員PDNS_ADDR_ARRAY pDnsServerList;
,其中包含成員WORD Family;
,它指定DNS服務器是哪種類型的IP地址。
DnsQuery是否已經支持指向PDNS_ADDR_ARRAY的指針作爲PVOID pExtra
的參數或將在未來的Windows版本中進行修改,但我不確定,但歡迎您嘗試查看。
有關示例代碼,請參閱How to use the DnsQuery function to resolve host names and host addresses with Visual C++ .NET,正如您已經發現的那樣。
另請參閱以下similar SO Question。
我不知道他們爲什麼不記錄這個:感嘆: –
可能還沒有到文檔更新,Windows CE和Windows Mobile的MSDN文檔仍然提到'aipServers'。 – Appleman1234
它正式用DnsQueryEx記錄。看看DNS_QUERY_REQUEST參數。它允許您傳遞DNS服務器列表。嗯....看起來像這隻適用於Windows 8和Win8服務器。 Bummer :(http://msdn.microsoft.com/en-us/library/windows/desktop/hh447188%28v=vs.85%29.aspx [2]:http://msdn.microsoft.com/en- us/library/windows/desktop/hh447201%28v = vs.85%29.aspx – selbie
我會嘗試在調用DnsQuery之前使用DnsValidateServerStatus,它有可能會將傳遞給DnsValidateServerStatus的服務器的必要DNS記錄加載到本地DNS中緩存和DnsQuery將會簡單地重用它們。這是一個黑客攻擊,但我從來沒有嘗試過。 – bronekk