Jak rozpoznać nazwy hostów i adresy hosta za pomocą programu Visual C++ .NET za pomocą funkcji DnsQuery

WPROWADZENIE

W tym artykule opisano, jak można rozpoznać nazwy hostów i adresy IP hosta za pomocą funkcji DNSQuery .

Więcej informacji

W usłudze Winsock Użyj funkcji Getaddrinfo zamiast funkcji getaddrbyname do obsługi nazw w aplikacji. Funkcja getaddrbyname została zastąpiona funkcją Getaddrinfo w celu obsługi adresowania IPv4 i IPv6. Protokół Winsock nigdy nie uwzględnia szerokich znaków, dopóki w systemie Windows Server 2003 jest dostępna nowa wersja funkcji Getaddrinfo . Nowa wersja ma nazwę Getaddrinfo. Jeśli potrzebujesz rozwiązania dla wszystkich systemów operacyjnych opartych na systemie NT, użyj funkcji DNSQuery klienta DNS w celu rozwiązania nazw hostów. Funkcja DNSQuery ma szerokie wersje, które powinny działać w systemie Microsoft Windows 2000 i nowszych systemach operacyjnych. Wykonaj poniższe czynności, aby utworzyć przykładową aplikację konsoli Win32, która ilustruje sposób korzystania z funkcji DNSQuery . Funkcja DNSQuery wysyła zapytanie do serwera DNS w celu rozwiązania nazwy hosta adres IP i odwrotnie.

  1. Uruchom program Microsoft Visual Studio .NET.

  2. W obszarze typy projektówkliknij pozycję projekty Visual C++, a następnie kliknij pozycję projekt Win32 w obszarzeSzablony.

  3. Wpisz Q831226 w poluname (nazwa ).

  4. W Kreatorze aplikacji Win32 kliknij pozycję aplikacja konsoli, kliknij pozycję pusty projekt, a następnie kliknij przyciskZakończ.

  5. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy pozycję pliki źródłowe, kliknij pozycję Dodaj, a następnie kliknij pozycję Dodaj nowy element. Dodaj plik w języku C++ (CPP) do projektu. Nadaj plikowi nazwę Q831226. cpp.

  6. Wklej poniższy kod w pliku 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. W menu projekt kliknij polecenie Właściwości.

  8. W oknie dialogowym właściwości projektu rozwiń węzeł konsolidator w obszarze Właściwości konfiguracji, kliknij pozycję wiersz polecenia, a następnie Dodaj następujące biblioteki do pola Opcje dodatkowe :

    • Ws2_32.lib

    • Dnsapi.lib

  9. Naciśnij klawisze CTRL + SHIFT + B, aby zbudować rozwiązanie.

Testowanie próbki

  • Znajdź adres IP, który odpowiada nazwie hosta: Q831226. exe-n nazwa_hosta -t A-s <adres IP serwera DNS>notatki jest symbolem zastępczym nazwy komputera, którego dotyczy kwerenda.

  • Znajdź nazwę hosta odpowiadającą adresowi IP: Q831226. exe-n xxx.xxx.xxx.xxx -t PTR-s <adres ip serwera DNS>Uwaga xxx.xxx.xxx.xxx to symbol zastępczy adresu IP komputera, którego dotyczy kwerenda.

Informacje

Aby uzyskać więcej informacji na temat wyszukiwania DNS, odwiedź następującą witrynę Microsoft Developer Network (MSDN) w sieci Web:

http://msdn2.microsoft.com/en-gb/library/ms682016.aspxAby uzyskać dodatkowe informacje, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:

164213 Opis wyszukiwań wstecznych DNS

Potrzebna dalsza pomoc?

Rozwijaj swoje umiejętności
Poznaj szkolenia
Uzyskuj nowe funkcje w pierwszej kolejności
Dołącz do niejawnych testerów firmy Microsoft

Czy te informacje były pomocne?

Dziękujemy za opinię!

Dziękujemy za opinię! Wygląda na to, że połączenie Cię z jednym z naszych agentów pomocy technicznej pakietu Office może być pomocne.

×