De functie DnsQuery gebruiken om hostnamen en hostadressen op te lossen met Visual C++ .NET
Dit artikel bevat een voorbeeld van een Win32-consoletoepassing die illustreert hoe u de DnsQuery
functie gebruikt om hostnamen en host-IP-adressen op te lossen.
Oorspronkelijke productversie: Winsock
Origineel KB-nummer: 831226
Een Voorbeeld van een Win32-consoletoepassing maken die illustreert hoe u de functie DnsQuery gebruikt
Gebruik in Winsock de getaddrinfo
functie in plaats van de getaddrbyname
functie om namen in uw toepassing te hosten. De getaddrbyname
functie is vervangen door de functie voor het getaddrinfo
verwerken van IPv4- en IPv6-adressering.
Winsock heeft tot voor kort geen rekening gehouden met brede tekens in Windows Server 2003, waar een nieuwe versie van de getaddrinfo
functie is opgenomen. De nieuwe versie heet GetAddrInfo. Als u een oplossing nodig hebt voor alle NT-besturingssystemen, gebruikt u de DNSQuery-functie VAN de DNS-client om hostnamen op te lossen. De DNSQuery
functie heeft een brede versie die moet werken op Microsoft Windows 2000 en hoger besturingssystemen.
Gebruik de volgende stappen om een voorbeeld van een Win32-consoletoepassing te maken die laat zien hoe u de DnsQuery
functie gebruikt. De DnsQuery
functie verzendt een query naar een DNS-server om de hostnaam om te zet in een IP-adres en vice versa.
Start Microsoft Visual Studio .NET.
Klik onder Projecttypen op Visual C++-projecten en klik vervolgens op Win32-project onder Sjablonen.
Typ Q831226 in het vak Naam .
Klik in de wizard Win32-toepassing op Consoletoepassing, klik op Project leegmaken en klik vervolgens op Voltooien.
Klik in Solution Explorer met de rechtermuisknop op Bronbestanden, klik op Toevoegen en klik vervolgens op Nieuw item toevoegen. Voeg een C++-bestand (.cpp) toe aan het project. Geef het bestand de naam Q831226.cpp.
Plak de volgende code in het Q831226.cpp-bestand :
#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); }
Klik in het menu Project op Eigenschappen.
Vouw in het dialoogvenster Projecteigenschappenlinker onder Configuratie-eigenschappen uit, klik op Opdrachtregel en voeg vervolgens de volgende bibliotheken toe aan het vak Aanvullende opties :
- Ws2_32.lib
- Dnsapi.lib
Druk op Ctrl+Shift+B om de oplossing te bouwen.
Het voorbeeld testen
Zoek het IP-adres dat overeenkomt met de hostnaam:
Q831226.exe -n <hostname> -t A -s <IP address of DNS server>
Opmerking
hostname is de tijdelijke aanduiding van de naam van de computer waarop een query wordt uitgevoerd.
Zoek de hostnaam die overeenkomt met het IP-adres:
Q831226.exe -n <xxx.xxx.xxx.xxx> -t PTR -s <IP address of DNS server>
Opmerking
xxx.xxx.xxx.xxx is een tijdelijke aanduiding van het IP-adres van de computer waarop een query wordt uitgevoerd.
Verwijzingen
Zie DnsQuery_A functie voor meer informatie over DNS-zoekopdrachten.