2012-11-30 10 views
9

LAN'ımdaki bir cihazın ana bilgisayar adını, bu LAN'daki ip adresinden çözmenin bir yolunu arıyorum.iOS adresindeki ip adresinden ana bilgisayar adını nasıl çözebilirim Objective-C

Linux'ta gethostbyaddr() işlevini kullanarak mükemmel çalışan bir program yazdım.

Bunu OS X veya iOS'de denediğimde çalışmaz.

OS X ve iOS'ta gethostbyaddr() ile ilgili bir sorun var gibi görünüyor.

Yine de, iOS'taki IP adresinden uzak makinenin ana makine adını almak için başka bir fikriniz varsa, bu benim günümü oluşturacaktır.

İlk test:

192.168.0.101 biz ana makine adı için sorguladığınız makinenin ip adresidir

Bu kullandığım koddur.

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

Bu kod linux üzerinde iyi çalışır, ancak OS X veya iOS'ta yoktur.

İkinci test Bu noktada nil geri CFHostStartInfoResolution de

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

Bu kod stucks.

Önceden Thx.

+0

Sana CFHost API ([Bu] check out istediğini düşünüyorum http://blog.toshsoft.de/index.php?/archives/5-3-Ways-to-Resolve-a-Hostname- in-iOS.html) – Jonathan

+0

CFHost API'siyle denedim, aynı problemi, ana bilgisayar adını ağdaki mevcut bir IP adresinden geri almaya çalıştığımda, istek zaman aşımına uğradı. Ancak, localhost eklentileri olan 127.0.0.1'i çözmeye çalıştığımda işe yarıyor. – taredhot

+0

sorunu çözdünüz mü? Aynı nil değerini alıyorum @taredhot –

cevap

1

Aslında tek liner. [[NSHost hostWithAddress:@"173.194.34.24"] name]

+1

Ve aslında 'gethostbyaddr' OS X/iOS üzerinde çalışmaz. Ya DNS sunucunuz yanlış ya da kodunuz, ancak teorik olarak çalışmalıdır. 192.168.0.101 host nedir? – Ecco

+0

Deneyimime ve bunu ağımın 3 aktif cihazıyla denedim, değil. NSHost hostWithAddress: 'in sadece yerel IP'ler için değil, yerel halk için olduğuna inanıyorum. OP'nin saatlerce istediğini yapmaya çalışıyorum. Ayrıca, gethostbyaddr'nin sonucu NULL, printf() OP sonunda kullanılır, bir çökme içinde biter. Başka bir yol biliyor musun? – isklikas

+0

NSHost, iOS için değil, yalnızca OSX platformunda çalışır –

İlgili konular