2012-01-19 68 views
4

DnsQuery沒有指定要查詢的服務器的參數。另一方面,我看到this sample,它似乎已經在MSDN文檔中標記爲「reserved並且必須爲0」的參數中傳遞了IP。如何指定一個特定的DNS服務器使用DnsQuery進行查詢?

是否有某種方式來查詢特定的服務器(如nslookup呢?)或者我將不得不編寫自己的DNS客戶端(或找到一個課程庫)?

+0

它正式用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

+0

我會嘗試在調用DnsQuery之前使用DnsValidateServerStatus,它有可能會將傳遞給DnsValidateServerStatus的服務器的必要DNS記錄加載到本地DNS中緩存和DnsQuery將會簡單地重用它們。這是一個黑客攻擊,但我從來沒有嘗試過。 – bronekk

回答

5

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

+0

我不知道他們爲什麼不記錄這個:感嘆: –

+0

可能還沒有到文檔更新,Windows CE和Windows Mobile的MSDN文檔仍然提到'aipServers'。 – Appleman1234

相關問題