2012-11-30 2 views
9

Ich suche nach einer Möglichkeit, den Hostnamen eines Geräts in meinem LAN von seiner IP-Adresse in diesem LAN aufzulösen.Wie Hostname von IP-Adresse in iOS aufzulösen Objective-C

Ich schrieb ein Programm in C, das perfekt auf Linux funktioniert mit gethostbyaddr() -Funktion.

Wenn ich das auf OS X oder iOS versuchte, funktioniert es nicht.

Es scheint ein Problem mit gethostbyaddr() in OS X und iOS.

Wie auch immer, wenn Sie eine andere Idee haben, den Hostnamen des Remote-Rechners von seiner IP in iOS zu bekommen, wird es meinen Tag machen.

Dies ist der Code, den ich verwendet:

Erster Test:

192.168.0.101 ist die IP-Adresse des Rechners, die wir für den Hostnamen abfragen.

#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); 

Dieser Code funktioniert gut unter Linux, aber nicht unter OS X und iOS.

Zweiter Test:

+ (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; 
} 

Dieser Code stuck bei CFHostStartInfoResolution Null an dieser Stelle zurück.

Danke im Voraus.

+0

Ich denke, dass Sie die CFHost API wollen, überprüfen Sie [diese] (http://blog.toshsoft.de/index.php?/archives/5-3-Ways-to-Resolve-a-Hostname- in-iOS.html) – Jonathan

+0

Ich versuchte mit CFHost API, das gleiche Problem, wenn ich versuche, den Hostnamen von einer bestehenden IP-Adresse im Netzwerk retrive, die Anfrage abgelaufen. Aber wenn ich versuche, 127.0.0.1, die die localhost Adressen ist, zu lösen, funktioniert es. – taredhot

+0

haben Sie das Problem gelöst? Ich bekomme den gleichen Nullwert @taredhot –

Antwort

1

Es ist eigentlich ein Einzeiler. [[NSHost hostWithAddress:@"173.194.34.24"] name]

+1

Und eigentlich gibt es keinen Grund, 'gethostbyaddr' funktioniert nicht unter OS X/iOS. Entweder ist Ihr DNS-Server falsch oder Ihr Code ist, aber theoretisch sollte es funktionieren. Was sagt 'host 192.168.0.101'? – Ecco

+0

Zu meiner Erfahrung und ich habe dies mit 3 aktiven Geräten meines Netzwerks versucht, ist es nicht. Ich glaube 'NSHost hostWithAddress:' ist nur für globale IPs, nicht für Einheimische. Ich habe versucht, was OP will für Stunden. Außerdem ist das Ergebnis von 'gethostbyaddr' NULL, so dass das printf() OP am Ende einen Absturz verursacht. Kennst du einen anderen Weg? – isklikas

+0

NSHost funktioniert nur OSX-Plattform, nicht für iOS –