De functie DnsQuery gebruiken om host-namen en host-adressen op te lossen met Visual C++ .NET

Inleiding

In dit artikel wordt uitgelegd hoe u de functie DNSQuery gebruikt om hostnamen en host-IP-adressen op te lossen.

Meer informatie

In Winsock kunt u de functie getaddrinfo in plaats van de getaddrbyname -functie gebruiken om namen in de toepassing te hosten. De functie getaddrbyname is vervangen door de getaddrinfo -functie voor het verwerken van IPv4-en IPv6-adressen. Winsock vernieuwt 2003 vóór de nieuwe versie van de functie getaddrinfo een nieuwe versie van de optie voor brede tekens. De nieuwe versie heeft de naam GetAddrInfo. Als u een oplossing voor alle besturingssystemen op basis van NT hebt, gebruikt u de functie DNS client DNSQuery om hostnames op te lossen. De functie DNSQuery heeft een brede versie die moet werken met Microsoft Windows 2000 en latere besturingssystemen. Voer de volgende stappen uit als u een voorbeeld van een Win32-consoletoepassing wilt maken waarin wordt getoond hoe u de functie Dnsquery kunt gebruiken. Met de functie Dnsquery wordt een query verzonden naar een DNS-server om de hostnaam op te lossen in een IP-adres en vice versa.

  1. Start Microsoft Visual Studio .NET.

  2. Klik onder project typenop Visual C++-projectenen klik vervolgens op Win32 project ondersjablonen.

  3. Typ Q831226 in het vaknaam .

  4. Klik in de wizard Win32-toepassing op console toepassing, klik op leeg projecten klik vervolgens opVoltooien.

  5. Klik in Solution Explorer met de rechtermuisknop op bronbestanden, klik op toevoegenen klik vervolgens op Nieuw item toevoegen. Een C++-bestand (. cpp) toevoegen aan het project. Geef het bestand de naam Q831226. cpp.

  6. Plak de volgende code in het bestand Q831226. cpp:

    #include <winsock2.h>  //winsock#include <windns.h>   //DNS api's#include <stdio.h>    //standard i/o//Usage of the programvoid 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);}
  7. Klik in het menu project op Eigenschappen.

  8. In het dialoogvenster project eigenschappen vouwt u koppeling onder configuratie-eigenschappenuit, klikt u op opdrachtregelen voegt u de volgende bibliotheken toe aan het vak extra opties :

    • Ws2_32.lib

    • Dnsapi.lib

  9. Druk op CTRL + SHIFT + B om de oplossing te maken.

Een steekproef testen

  • Het IP-adres zoeken dat overeenkomt met de host name: Q831226. exe-n hostname -t A-s <IP-adres van de DNS-server>notitie hostname is de tijdelijke aanduiding van de naam van de computer waarop de query wordt uitgevoerd.

  • De host-naam zoeken die overeenkomt met het IP-adres: Q831226. exe-n xxx.xxx.xxx.xxx -t PTR-s <IP-adres van de DNS-server>Note xxx.xxx.xxx.xxx is een tijdelijke aanduiding van het IP-adres van de computer waarop wordt gevraagd.

Verwijzingen

Ga naar de volgende MSDN-website (Microsoft Developer Network) voor meer informatie over het zoeken van DNS:

http://msdn2.microsoft.com/en-gb/library/ms682016.aspxKlik op het volgende artikelnummer in de Microsoft Knowledge Base voor meer informatie:

164213 Beschrijving van DNS reverse lookups

Meer hulp nodig?

Uw vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Microsoft insiders

Was deze informatie nuttig?

Bedankt voor uw feedback.

Hartelijk dank voor uw feedback! Het lijkt ons een goed idee om u in contact te brengen met een van onze Office-ondersteuningsagenten.

×