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.
Microsoft Visual Studio .NET'i başlatın.
Proje Türleri'nin altında Visual C++ Projeleri'ne ve ardından Şablonlar'ın altında Win32 Projesi'ne tıklayın.
Ad kutusuna Q831226 yazın.
Win32 Uygulaması sihirbazında Konsol Uygulaması'na tıklayın, Projeyi boşalt'a ve ardından Son'a tıklayın.
Çö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.
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); }
Proje menüsünde Özellikler'e tıklayın.
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
Çö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.