2012-05-12 20 views
5

पर आईपी को हल करें मैं एक आईपी पते से होस्टनाम को हल करने का प्रयास कर रहा हूं। मैंने gethostbyaddr() और getnameinfo() का उपयोग करने का प्रयास किया है लेकिन कई मामलों में होस्टनाम बिल्कुल हल नहीं किया गया है। क्या आईपी एड्रेस को वैध होस्टनाम में बदलने का कोई बेहतर तरीका है?होस्ट नाम

char* ip = argv[1]; 
// using gethostbyaddr() 
hostent * phe = gethostbyaddr(ip, strlen(ip), AF_INET); 
if(phe) { 
    cout << phe->h_name << "\n"; 
} 

// using getnameinfo() 
char hostname[260]; 
char service[260]; 
sockaddr_in address; 
memset(&address, 0, sizeof(address)); 
address.sin_family = AF_INET; 
address.sin_addr.s_addr = inet_addr(ip); 
int response = getnameinfo((sockaddr*)&address, 
          sizeof(address), 
          hostname, 
          260, 
          service, 
          260, 
          0); 
if(response == 0) { 
    cout << hostname << "\n"; 
} 
+3

सभी आईपी पते में रिवर्स होस्ट नाम नहीं है। आपको क्या लगता है कि आईपी पते जो मेजबान नाम नहीं लौटाते हैं, उनमें से एक होना चाहिए? – Bruno

+1

@ ब्रूनो - कुछ मामलों में जब मुझे होस्टनाम नहीं मिलता है, तो मैंने टर्मिनल से 'nslookup

' चलाने की कोशिश की है और कमांड होस्टनाम लौटाता है। तो मैं सोच रहा था कि शायद इस तरह की चीज करने का एक और सटीक तरीका है। – Cyclonecode

+2

मुझे पता है कि यह कोई जवाब नहीं है लेकिन आपको getaddrinfo और getnameinfo के साथ रहना चाहिए क्योंकि वे दोनों मामलों में आईपीवी 4 और आईपीवी 6 नेटवर्क पते के लिए उपयोगी हैं। – excanoe

उत्तर

5

मैं gethostbyaddr() और getnameinfo() उपयोग करने की कोशिश की है [...]। क्या आईपी एड्रेस को वैध होस्टनाम में बदलने का कोई बेहतर तरीका है?

नहीं, getnameinfo() पसंद का तरीका है।


आप EAI_AGAIN के खिलाफ getnameinfo() का परिणाम जाँच कर सकते हैं, और अगर बराबर पुन: प्रयास करें अनुरोध।


EAI_OVERFLOW प्राप्त करने का भी मतलब यह नहीं है कि आपको कोई प्रतिक्रिया नहीं मिली है। क्या आप में परिणाम जगह ज्यादातर संभावना BTW एक EAI_OVERFLOW ... ;-)


नहीं मिलेगा 259 वर्ण उपलब्ध कराती हैं किसी भी तरह के रूप में: excanoegetaddrinfo() और getnameinfo() साथ चिपके हुए पर his comment के साथ सही है ... - gethostbyaddr() और gethostbyname() किसी भी तरह से बहिष्कृत हैं। साथ ही उनके परिणाम को संभालना जटिल है और प्रोग्रामिंग त्रुटियों को उत्तेजित करता है।

d:\temp\stack>ip 
Host: yandex.ru 

:

4

मैं Windows खेद (आप WSADATA खंड को छोड़ सकते हैं आप * nix उपयोग कर रहे हैं) का उपयोग कर रहा इस संस्करण :)

#include <stdio.h> 
    #include <stdlib.h> 
    #include <stdint.h> 

    #include <winsock2.h> 

    int main(){ 
    struct addrinfo hints; 
    struct addrinfo *res=0; 
    int  status; 

    WSADATA wsadata; 
    int statuswsadata; 
    if((statuswsadata=WSAStartup(MAKEWORD(2,2),&wsadata))!=0){ 
     printf("WSAStartup failed: %d\n",statuswsadata); 
    } 

    hints.ai_family =AF_INET; 

    status=getaddrinfo("87.250.251.11",0,0,&res); 

    { 
     char host[512],port[128]; 

     status=getnameinfo(res->ai_addr,res->ai_addrlen,host,512,0,0,0); 

     printf("Host: %s",host); 

     freeaddrinfo(res); 
    } 
    } 

के बारे में मैं इस मिल 87.250.251.11 यह मेजबान yandex.ru का नेटवर्क पता है:

C:\Users\user>ping yandex.ru 

Pinging yandex.ru [87.250.251.11] with 32 bytes of data: 
Reply from 87.250.251.11: bytes=32 time=21ms TTL=56 
Reply from 87.250.251.11: bytes=32 time=21ms TTL=56 
Reply from 87.250.251.11: bytes=32 time=21ms TTL=56 

Ping statistics for 87.250.251.11: 
    Packets: Sent = 3, Received = 3, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 21ms, Maximum = 21ms, Average = 21ms 

आशा थाई एस मदद करता है।

संबंधित मुद्दे