Kuidas DnsQuery funktsiooni abil saate lahendada hosti nimed ja hosti aadressid Visual C++ .NET

SISSEJUHATUS

Selles artiklis kirjeldatakse, kuidas DNSQuery funktsiooni abil saate lahendada hosti nimed ja hosti IP-aadressid.

Lisateave

Winsock, kasutage getaddrinfo funktsiooni asemel getaddrbyname funktsiooni hosti nimed oma taotluse. Getaddrbyname funktsioon asendati selle getaddrinfo funktsiooni IPv4 ja IPv6 adresseerimise töötlemiseks. Winsock kunagi arvestatud lai tähemärki kuni hiljuti Windows Server 2003, kus on lisatud getaddrinfo funktsiooni uus versioon. Uus versioon nimega getaddrinfo. Kui vajate lahendust kõigile NT-põhistele operatsioonisüsteemidega, kasutage hosti nimede lahendamiseks DNS-i kliendi DNSQuery funktsiooni. DNSQuery funktsioon on lai versioon, mis peaks töötama Microsoft Windows 2000 ja uuemad operatsioonisüsteemid. Kasutage järgmisi samme, et luua näidis Win32 konsooli rakendus, mis illustreerib, kuidas kasutada DNSQuery funktsiooni. DNSQuery funktsioon saadab päringu DNS server lahendada HOSTI nime IP-aadress ja vastupidi.

  1. Käivitage Microsoft Visual Studio .NET.

  2. Projekti tüübid, klõpsake Visual C++ projektidja klõpsake Win32 projekti allMallid.

  3. Tippige väljalenimiQ831226 .

  4. Win32 rakenduse viisardi klõpsake konsooli rakendus, klõpsake tühja projektija seejärel klõpsake nuppuFinish.

  5. Lahenduste Explorer, paremklõpsake allikas faile, klõpsake nuppu Lisajaklõpsake Lisa uus üksus. Lisage projekti C++ faili (. cpp). Nimetage fail Q831226. cpp.

  6. Kleepige järgmine kood Q831226. cpp faili:

    #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. Klõpsake menüü ProjectAtribuudid.

  8. Projekti atribuutide dialoogiboksis laiendage Linker all Configuration Properties, klõpsake käsuridaja lisage järgmised teegid täiendavad suvandid kasti:

    • Ws2_32.lib

    • Dnsapi.lib

  9. Lahenduse ehitamiseks vajutage klahvikombinatsiooni CTRL + SHIFT + B.

Proovi proovile

  • Leidke IP-aadress, mis vastab hosti nimi: Q831226. exe-n hostname -t A-s < IP-aadressi DNS-serveri >Märkus hostname on arvuti nimi, mis on päringu kohatäide.

  • Leidke hosti nimi, mis vastab IP-aadress: Q831226. exe-n xxx.xxx.xxx.xxx -t PTR-s < IP-aadress DNS-i server >Märkus xxx.xxx.xxx.xxx on IP-aadressi kohatäide arvuti, mis on päringu.

Viited

DNS-i otsingu kohta lisateabe saamiseks külastage järgmist Microsoft Developer Networki (MSDN) veebisaiti:

http://msdn2.microsoft.com/en-gb/library/ms682016.aspxLisateabe saamiseks klõpsake Microsofti teabebaasi (Knowledge Base) artikli kuvamiseks järgmist artiklinumbrit:

164213 kirjeldus DNS-i pöördotsingud

Kas vajate veel abi?

Täiendage oma oskusi
Tutvuge koolitusmaterjalidega
Kasutage uusi funktsioone enne teisi
Liitu Microsofti Insideri programmis osalejad

Kas sellest teabest oli abi?

Täname tagasiside eest!

Täname tagasiside eest! Tundub, et võiksime teid kokku viia ühega meie Office'i tugiagentidest, kes aitab teil probleemi lahendada.

×