Как указать конкретный DNS-сервер для запроса с использованием DnsQuery? - PullRequest
6 голосов
/ 19 января 2012

DnsQuery не имеет параметра, указывающего сервер, который требуется запросить. С другой стороны, я видел этот образец , который, кажется, передал IP в параметре, помеченном как "зарезервированный и должен быть 0" в документации MSDN.

Есть ли какой-нибудь способ сделать запрос к определенному серверу (как это делает nslookup?) Или мне придется написать свой собственный DNS-клиент (или, конечно, найти библиотеку)?

Ответы [ 2 ]

7 голосов
/ 09 марта 2012

4-й аргумент DnsQuery PVOID pExtra принимает PIP4_ARRAY, содержащий конкретные DNS-серверы для запроса. Это объединено с 3-м аргументом DWORD Options DNS_QUERY_BYPASS_CACHE, чтобы обойти кэш распознавателя.

Это работает с Windows 2000, и в Windows XP DnsQuery вызывает функцию называется privateNarrowToWideQuery (в dnsapi.dll) и принимает аргумент pExtra как PIP4_ARRAY.

MSDN является неточным в этом отношении, в результате чего это недокументированная функция. В более старых версиях DnsQuery API Call pExtra раньше назывался aipServers.

Что касается DNS записей IPA6 AAAA, вы можете попробовать функцию со вторым аргументом. WORD wType как DNS_TYPE_AAAA и пятый аргумент PDNS_RECORD *ppQueryResultsSet как указатель на DNS_AAAA_DATA. Хотя это все же заставляет вас передавать массив IPv4-адресов, а не IPV6.

Относительно поддержки версий Windows для запросов IPV6 см. Следующие ссылки

В будущих версиях Windows, я считаю, правильный способ сделать это для IPV6 будет использовать DnsQueryEx, с его первым аргументом PDNS_QUERY_REQUEST pQueryRequest, который содержит элемент PDNS_ADDR_ARRAY pDnsServerList;, содержащий элемент WORD Family;, который указывает тип IP-адреса DNS-сервера.

Независимо от того, поддерживает ли DnsQuery указатель на PDNS_ADDR_ARRAY в качестве аргумента PVOID pExtra или будет изменен в будущих версиях Windows, я не уверен, но вы можете попробовать и посмотреть.

См. Как использовать функцию DnsQuery для разрешения имен хостов и адресов хостов с помощью Visual C ++ .NET для примера кода, как вы уже обнаружили.

См. Также аналогичный вопрос SO .

0 голосов
/ 13 января 2019

Для этого есть функция:

        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 - имя сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...