2012-11-30 14 views
9

मैं इस लैन पर अपने आईपी पते से अपने LAN में किसी डिवाइस के होस्टनाम को हल करने का एक तरीका ढूंढ रहा हूं।आईओएस में आईपी पते से होस्टनाम को हल करने का तरीका उद्देश्य-सी

मैंने सी में एक प्रोग्राम लिखा जो gethostbyaddr() फ़ंक्शन का उपयोग करके लिनक्स पर पूरी तरह से काम करता है।

जब मैंने ओएस एक्स या आईओएस पर कोशिश की तो यह काम नहीं करता है।

ऐसा लगता है कि ओएस एक्स और आईओएस में gethostbyaddr() के साथ कोई समस्या है।

वैसे भी, यदि आपके पास आईओएस में आईपी से रिमोट मशीन का होस्टनाम प्राप्त करने का एक और विचार है, तो यह मेरा दिन बना देगा।

पहला परीक्षण:

192.168.0.101 मशीन है कि हम होस्ट नाम के लिए जानना चाहते हैं का आईपी पता है

इस कोड को मैं प्रयोग किया जाता है।

#include <netdb.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 

struct hostent *he; 
struct in_addr ipv4addr; 
inet_pton(AF_INET, "192.168.0.101", &ipv4addr); 
he = gethostbyaddr(&ipv4addr, sizeof ipv4addr, AF_INET); 
printf("Host name: %s\n", he->h_name); 

यह कोड लिनक्स पर अच्छी तरह से काम करता है, लेकिन यह ओएस एक्स और आईओएस पर नहीं है।

दूसरे टेस्ट:

+ (NSArray *)hostnamesForAddress:(NSString *)address { 
    // Get the host reference for the given address. 
    struct addrinfo  hints; 
    struct addrinfo  *result = NULL; 
    memset(&hints, 0, sizeof(hints)); 
    hints.ai_flags = AI_NUMERICHOST; 
    hints.ai_family = PF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = 0; 
    int errorStatus = getaddrinfo([address cStringUsingEncoding:NSASCIIStringEncoding], NULL, &hints, &result); 
    if (errorStatus != 0) return nil; 
    CFDataRef addressRef = CFDataCreate(NULL, (UInt8 *)result->ai_addr, result->ai_addrlen); 
    if (addressRef == nil) return nil; 
    freeaddrinfo(result); 
    CFHostRef hostRef = CFHostCreateWithAddress(kCFAllocatorDefault, addressRef); 
    if (hostRef == nil) return nil; 
    CFRelease(addressRef); 
    BOOL isSuccess = CFHostStartInfoResolution(hostRef, kCFHostNames, NULL); 
    if (!isSuccess) return nil; 

    // Get the hostnames for the host reference. 
    CFArrayRef hostnamesRef = CFHostGetNames(hostRef, NULL); 
    NSMutableArray *hostnames = [NSMutableArray array]; 
    for (int currentIndex = 0; currentIndex < [(NSArray *)hostnamesRef count]; currentIndex++) { 
     [hostnames addObject:[(NSArray *)hostnamesRef objectAtIndex:currentIndex]]; 
    } 

    return hostnames; 
} 

इस कोड को इस बिंदु पर नहीं के बराबर लौटने CFHostStartInfoResolution पर stucks।

अग्रिम में Thx।

+0

मुझे लगता है कि आप CFHost API चाहते हैं, यह जांचें [यह] (http://blog.toshsoft.de/index.php?/archives/5-3-Ways-to-Resolve-a-Hostname- इन-आईओएस.html) – Jonathan

+0

मैंने सीएफएचओएस एपीआई के साथ कोशिश की, एक ही समस्या जब मैं मेजबाननाम को नेटवर्क पर किसी मौजूदा आईपी पते से पुनः प्राप्त करने का प्रयास करता हूं, तो अनुरोध का समय समाप्त हो गया। लेकिन जब मैं 127.0.0.1 को हल करने का प्रयास करता हूं जो स्थानीयहोस्ट एड्रेस है, तो यह काम करता है। – taredhot

+0

क्या आपने इस मुद्दे को हल किया? मुझे वही शून्य मूल्य मिल रहा है @taredhot –

उत्तर

1

यह वास्तव में एक लाइनर है। [[NSHost hostWithAddress:@"173.194.34.24"] name]

+1

और वास्तव में कोई कारण नहीं है 'gethostbyaddr' ओएस एक्स/आईओएस पर काम नहीं करता है। या तो आपका DNS सर्वर गलत है, या आपका कोड है, लेकिन सैद्धांतिक रूप से इसे काम करना चाहिए। 'होस्ट 192.168.0.101' क्या कहता है? – Ecco

+0

मेरे अनुभव के लिए और मैंने इसे अपने नेटवर्क के 3 सक्रिय उपकरणों के साथ करने की कोशिश की है, यह नहीं है। मेरा मानना ​​है कि 'एनएसएचओस्ट होस्टविथ एड्रेस:' केवल वैश्विक आईपी के लिए है, स्थानीय नहीं। मैं ऐसा करने की कोशिश कर रहा हूं जो ओपी घंटों के लिए चाहता है। इसके अलावा, 'gethostbyaddr' का नतीजा शून्य है, इसलिए printf() OP अंत में उपयोग करता है, एक क्रैश में समाप्त होता है। क्या आप किसी अन्य तरीके से जानते हैं? – isklikas

+0

एनएसएचओस्ट केवल ओएसएक्स मंच काम करता है, आईओएस के लिए नहीं –

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