se utilizează funcția DnsQuery pentru a rezolva nume de gazdă și adrese gazdă cu Visual C++ .NET


INTRODUCERE


Acest articol descrie se utilizează funcția DNSQuery pentru a rezolva nume de gazdă și gazdă adrese IP.

Mai multe informații


În Winsock, utilizați funcția getaddrinfo în loc de funcția getaddrbyname pentru a găzdui nume în aplicația. Funcția getaddrbyname a fost înlocuită de funcția getaddrinfo pentru a gestiona adresarea IPv4 și IPv6. Winsock nu a reprezentat pentru caractere largi până de curând în Windows Server 2003 în cazul în care o nouă versiune a funcției getaddrinfo este inclus. Noua versiune este numit getaddrinfo. Dacă aveți nevoie de o soluție pentru toate sistemele de operare bazate pe NT, utilizați funcția DNS client DNSQuery pentru a rezolva nume de gazdă. Funcția DNSQuery are o versiune largă care ar trebui să funcționeze pe Microsoft Windows 2000 și sistemele de operare mai recente. Utilizați pașii următori pentru a crea o aplicație de consolă Win32 eșantion care ilustrează modul de utilizare a funcției DNSQuery . Funcția DNSQuery trimite o interogare la un server DNS pentru a rezolva nume de sign-in de gazdă la o adresă IP și vice-versa.
  1. Porniți Microsoft Visual Studio .NET.
  2. Sub tipuri de proiect, faceți clic pe Visual C++ proiecte, și apoi faceți clic pe Win32 Project subșabloane.
  3. Tastați Q831226 în casetanume .
  4. În Expertul de aplicație Win32, faceți clic pe consola de aplicații, faceți clic pe proiect gol, și apoi faceți clic peTerminare.
  5. În exploratorul de soluții, faceți clic dreapta pe fișiere sursă, faceți clic pe Adăugare, apoi faceți clic pe Adăugare element nou. Adăugați un fișier C++ (. CPP) la proiect. Denumiți fișierul Q831226. CPP.
  6. Lipiți următorul cod în fișierul 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. În meniul de proiect , faceți clic pe Proprietăți.
  8. În caseta de dialog Proprietăți proiect , extindeți linker sub Proprietăți de configurare, faceți clic pe linia de comandă, apoi adăugați următoarele biblioteci la Opțiuni suplimentare cutie:
    • Ws2_32.lib
    • Dnsapi.lib
  9. Apăsați Ctrl + Shift + B pentru a construi soluția.

Testați proba

  • Găsiți adresa IP care corespunde cu numele gazdei: Q831226. exe-n hostname -t a-s < adresa IP a serverului DNS >Notă hostname este substituentul numelui computerului care este interogată.
  • Găsiți numele de gazdă care corespunde adresei IP: Q831226. exe-n xxx.xxx.xxx.xxx -t ptr-s < adresa IP a serverului DNS >Notă xxx.xxx.xxx.xxx este un substituent al adresei IP a computerului care este interogată.

Referințe


Pentru mai multe informații despre DNS căutare, vizitați următorul site Web Microsoft Developer Network (MSDN):Pentru informații suplimentare, faceți clic pe următorul număr de articol pentru a vedea articolul în baza de cunoștințe Microsoft:
164213 Descriere a DNS Reverse lookups