Como usar a função DnsQuery para resolver nomes de host e endereços de host com o Visual C++ .NET


INTRODUÇÃO


Este artigo descreve como usar a função DnsQuery para resolver nomes de host e endereços IP de host.

Mais Informações


No Winsock, use a função Getaddrinfo em vez da função função para nomes de host em seu aplicativo. A função função foi substituída pela função Getaddrinfo para lidar com endereçamento IPv4 e IPv6. Winsock nunca contabilizou caracteres largos até recentemente no Windows Server 2003 onde uma nova versão da função Getaddrinfo está incluída. A nova versão é chamada Getaddrinfo. Se você precisar de uma solução para todos os sistemas operacionais baseados em NT, use a função DnsQuery do cliente DNS para resolver nomes de host. A função DnsQuery tem uma versão ampla que deve funcionar no Microsoft Windows 2000 e sistemas operacionais posteriores. Use as seguintes etapas para criar um aplicativo de console do Win32 de exemplo que ilustra como usar a função DnsQuery . A função DnsQuery envia uma consulta para um servidor DNS para resolver o nome do host para um endereço IP e vice-versa.
  1. Inicie o Microsoft Visual Studio .NET.
  2. Em tipos de projeto, clique em projetos do Visual C++e, em seguida, clique em projeto Win32 emmodelos.
  3. Digite Q831226 na caixanome .
  4. No assistente de aplicativo Win32, clique em aplicativo de console, clique em projeto vazioe, em seguida, clique emconcluir.
  5. No Solution Explorer, clique com o botão direito do mouse em arquivos de origem, clique em Adicionare clique em Adicionar novo item. Adicione um arquivo C++ (. cpp) para o projeto. Nomeie o arquivo Q831226. cpp.
  6. Cole o seguinte código no ficheiro 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. No menu Project , clique em Propriedades.
  8. Na caixa de diálogo Propriedades do projeto , expanda vinculador em Propriedades de configuração, clique em linha de comandoe, em seguida, adicione as seguintes bibliotecas à caixa de Opções adicionais :
    • Ws2_32.lib
    • Dnsapi.lib
  9. Pressione Ctrl + Shift + B para compilar a solução.

Teste a amostra

  • Localize o endereço IP que corresponde ao nome do host: Q831226. exe-n hostname -t a-s < endereço IP do servidor DNS >Note hostname é o espaço reservado do nome do computador que está sendo consultado.
  • Localize o nome do host que corresponde ao endereço IP: Q831226. exe-n xxx.xxx.xxx.xxx -t PTR-s < endereço IP do servidor DNS >Observação xxx.xxx.xxx.xxx é um espaço reservado do endereço IP do computador que está sendo consultado.

Referências


Para obter mais informações sobre a pesquisa de DNS, visite o seguinte site da Web Microsoft Developer Network (MSDN):Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
164213 descrição do DNS Reverse lookups