Использование функции DnsQuery для разрешения имен узлов и адресов узлов с помощью Visual C++ .NET
В этой статье представлен пример консольного приложения Win32 DnsQuery
, в котором показано, как использовать функцию для разрешения имен узлов и IP-адресов узлов.
Исходная версия продукта: Winsock
Исходный номер базы знаний: 831226
Создание примера консольного приложения Win32, иллюстрирующий использование функции DnsQuery
В Winsock используйте функцию getaddrinfo
вместо функции getaddrbyname
для размещения имен в приложении. Функция getaddrbyname
была заменена функцией getaddrinfo
для обработки адресов IPv4 и IPv6.
Winsock никогда не использовал расширенные символы до недавнего времени в Windows Server 2003 getaddrinfo
, где включена новая версия функции. Новая версия называется GetAddrInfo. Если требуется решение для всех операционных систем на основе NT, используйте функцию DNS-клиента DNSQuery для разрешения имен узлов. Функция DNSQuery
имеет широкую версию, которая должна работать в Операционных системах Microsoft Windows 2000 и более поздних версий.
Выполните следующие действия, чтобы создать пример консольного приложения Win32, иллюстрирующий использование функции DnsQuery
. Функция DnsQuery
отправляет запрос на DNS-сервер для разрешения имени узла на IP-адрес и наоборот.
Запустите Microsoft Visual Studio .NET.
В разделе "Типы проектов" щелкните "Проекты Visual C++", а затем выберите " Проект Win32" в разделе "Шаблоны".
Введите Q831226 в поле "Имя ".
В мастере приложений Win32 щелкните " Консольное приложение", выберите "Пустой проект" и нажмите кнопку "Готово".
В Обозреватель решений щелкните правой кнопкой мыши исходные файлы, нажмите кнопку "Добавить" и выберите команду "Добавить новый элемент". Добавьте файл C++ (CPP) в проект. Приведите имя файла Q831226.cpp.
Вставьте следующий код в файл Q831226.cpp :
#include <winsock2.h> //winsock #include <windns.h> //DNS api's #include <stdio.h> //standard i/o //Usage of the program void Usage(char *progname) { fprintf(stderr,"Usage\n%s -n [HostName|IP Address] -t [Type] -s [DnsServerIp]\n",progname); fprintf(stderr,"Where:\n\t\"HostName|IP Address\" is the name or IP address of the computer "); fprintf(stderr,"of the record set being queried\n"); fprintf(stderr,"\t\"Type\" is the type of record set to be queried A or PTR\n"); fprintf(stderr,"\t\"DnsServerIp\"is the IP address of DNS server (in dotted decimal notation)"); fprintf(stderr,"to which the query should be sent\n"); exit(1); } void ReverseIP(char* pIP) { char seps[] = "."; char *token; char pIPSec[4][4]; int i=0; token = strtok( pIP, seps); while( token != NULL ) { /* While there are "." characters in "string"*/ sprintf(pIPSec[i],"%s", token); /* Get next "." character: */ token = strtok( NULL, seps ); i++; } sprintf(pIP,"%s.%s.%s.%s.%s", pIPSec[3],pIPSec[2],pIPSec[1],pIPSec[0],"IN-ADDR.ARPA"); } // the main function void __cdecl main(int argc, char* argv[]) { DNS_STATUS status; //Return value of DnsQuery_A() function. PDNS_RECORD pDnsRecord; //Pointer to DNS_RECORD structure. PIP4_ARRAY pSrvList = NULL; //Pointer to IP4_ARRAY structure. WORD wType; //Type of the record to be queried. char* pOwnerName; //Owner name to be queried. char pReversedIP[255];//Reversed IP address. char DnsServIp[255]; //DNS server ip address. DNS_FREE_TYPE freetype; freetype = DnsFreeRecordListDeep; IN_ADDR ipaddr; if (argc > 4) { for (int i = 1; i < argc; i++) { if ((argv[i][0] == '-') || (argv[i][0] == '/')) { switch (tolower(argv[i][1])) { case 'n': pOwnerName = argv[++i]; break; case 't': if (!stricmp(argv[i + 1], "A")) wType = DNS_TYPE_A; //Query host records to resolve a name. else if (!stricmp(argv[i + 1], "PTR")) { //pOwnerName should be in "xxx.xxx.xxx.xxx" format if (strlen(pOwnerName) <= 15) { //You must reverse the IP address to request a Reverse Lookup //of a host name. sprintf(pReversedIP, "%s", pOwnerName); ReverseIP(pReversedIP); pOwnerName = pReversedIP; wType = DNS_TYPE_PTR; //Query PTR records to resolve an IP address } else { Usage(argv[0]); } } else Usage(argv[0]); i++; break; case 's': // Allocate memory for IP4_ARRAY structure. pSrvList = (PIP4_ARRAY)LocalAlloc(LPTR, sizeof(IP4_ARRAY)); if (!pSrvList) { printf("Memory allocation failed \n"); exit(1); } if (argv[++i]) { strcpy(DnsServIp, argv[i]); pSrvList->AddrCount = 1; pSrvList->AddrArray[0] = inet_addr(DnsServIp); //DNS server IP address break; } default: Usage(argv[0]); break; } } else Usage(argv[0]); } } else Usage(argv[0]); // Calling function DnsQuery to query Host or PTR records status = DnsQuery(pOwnerName, //Pointer to OwnerName. wType, //Type of the record to be queried. DNS_QUERY_BYPASS_CACHE, // Bypasses the resolver cache on the lookup. pSrvList, //Contains DNS server IP address. &pDnsRecord, //Resource record that contains the response. NULL); //Reserved for future use. if (status) { if (wType == DNS_TYPE_A) printf("Failed to query the host record for %s and the error is %d \n", pOwnerName, status); else printf("Failed to query the PTR record and the error is %d \n", status); } else { if (wType == DNS_TYPE_A) { //convert the Internet network address into a string //in Internet standard dotted format. ipaddr.S_un.S_addr = (pDnsRecord->Data.A.IpAddress); printf("The IP address of the host %s is %s \n", pOwnerName, inet_ntoa(ipaddr)); // Free memory allocated for DNS records. DnsRecordListFree(pDnsRecord, freetype); } else { printf("The host name is %s \n", (pDnsRecord->Data.PTR.pNameHost)); // Free memory allocated for DNS records. DnsRecordListFree(pDnsRecord, freetype); } } LocalFree(pSrvList); }
В меню "Проект " щелкните "Свойства".
В диалоговом окне "Свойства проекта" разверните компоновщик в разделе "Свойства конфигурации", щелкните командную строку и добавьте следующие библиотеки в поле "Дополнительные параметры":
- Ws2_32.lib
- Dnsapi.lib
Нажмите клавиши CTRL+SHIFT+B, чтобы создать решение.
Тестирование примера
Найдите IP-адрес, соответствующий имени узла:
Q831226.exe -n <hostname> -t A -s <IP address of DNS server>
Примечание.
имя узла — это заполнитель имени запрашиваемого компьютера.
Найдите имя узла, соответствующее IP-адресу:
Q831226.exe -n <xxx.xxx.xxx.xxx> -t PTR -s <IP address of DNS server>
Примечание.
xxx.xxx.xxx.xxx является заполнителем IP-адреса запрашиваемого компьютера.
Ссылки
Дополнительные сведения о поиске DNS см. в DnsQuery_A функции.
Обратная связь
Отправить и просмотреть отзыв по