Konak adlarını ve konak adreslerini Visual C++ .NET ile çözümlemek için DnsQuery işlevini kullanın

Bu makalede, ana bilgisayar adlarını ve konak IP'sini çözümlemek için işlevinin DnsQuery nasıl kullanılacağını gösteren bir Win32 konsol uygulaması örneği sağlanır.

Orijinal ürün sürümü: Winsock
Özgün KB numarası: 831226

DnsQuery işlevinin nasıl kullanılacağını gösteren örnek bir Win32 konsol uygulaması oluşturma

Winsock'ta, uygulamanızda adları barındırmak için işlev yerine getaddrbyname işlevini kullanıngetaddrinfo. İşlev, getaddrbyname IPv4 ve IPv6 adreslemini işlemek için işleviyle getaddrinfo değiştirildi.

Winsock, işlevin yeni bir sürümünün getaddrinfo eklendiği Windows Server 2003'te yakın zamana kadar geniş karakterleri hesaba eklemedi. Yeni sürüm GetAddrInfo olarak adlandırılır. Tüm NT tabanlı işletim sistemleri için bir çözüme ihtiyacınız varsa, ana bilgisayar adlarını çözümlemek için DNS istemcisi DNSQuery işlevini kullanın. İşlev, DNSQuery Microsoft Windows 2000 ve üzeri işletim sistemlerinde çalışması gereken geniş bir sürüme sahiptir.

İşlevin nasıl kullanılacağını DnsQuery gösteren örnek bir Win32 konsol uygulaması oluşturmak için aşağıdaki adımları kullanın. İşlev, DnsQuery ana bilgisayar adını bir IP adresine çözümlemek için DNS sunucusuna bir sorgu gönderir ve bunun tersi de geçerlidir.

  1. Microsoft Visual Studio .NET'i başlatın.

  2. Proje Türleri'nin altında Visual C++ Projeleri'ne ve ardından Şablonlar'ın altında Win32 Projesi'ne tıklayın.

  3. Ad kutusuna Q831226 yazın.

  4. Win32 Uygulaması sihirbazında Konsol Uygulaması'na tıklayın, Projeyi boşalt'a ve ardından Son'a tıklayın.

  5. Çözüm Gezgini Kaynak Dosyalar'a sağ tıklayın, Ekle'ye ve ardından Yeni Öğe Ekle'ye tıklayın. Projeye bir C++ dosyası (.cpp) ekleyin. Dosyayı Q831226.cpp olarak adlandırın.

  6. aşağıdaki kodu Q831226.cpp dosyasına yapıştırın:

    #include <winsock2.h> //winsock
    #include <windns.h> //DNS api's
    #include <stdio.h> //standard i/o
    
    //Usage of the program
    void 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. Proje menüsünde Özellikler'e tıklayın.

  8. Proje Özellikleri iletişim kutusunda, Yapılandırma Özellikleri'nin altındaki Bağlayıcı'yı genişletin, Komut Satırı'na tıklayın ve ek seçenekler kutusuna aşağıdaki kitaplıkları ekleyin:

    • Ws2_32.lib
    • Dnsapi.lib
  9. Çözümü oluşturmak için Ctrl+Shift+B tuşlarına basın.

Örneği test edin

  • Ana bilgisayar adına karşılık gelen IP adresini bulun: Q831226.exe -n <hostname> -t A -s <IP address of DNS server>

    Not

    hostname , sorgulanan bilgisayarın adının yer tutucusdur.

  • IP adresine karşılık gelen ana bilgisayar adını bulun: Q831226.exe -n <xxx.xxx.xxx.xxx> -t PTR -s <IP address of DNS server>

    Not

    xxx.xxx.xxx.xxx sorgulanan bilgisayarın IP adresinin yer tutucusdur.

Başvurular

DNS araması hakkında daha fazla bilgi için bkz. DnsQuery_A işlevi.