2012-11-30 62 views
9

Tôi đang tìm cách giải quyết tên máy chủ của một thiết bị trong mạng LAN từ địa chỉ IP của nó trên mạng LAN này.cách phân giải tên máy chủ từ địa chỉ IP trong iOS Mục tiêu-C

Tôi đã viết một chương trình trong C hoạt động hoàn hảo trên Linux bằng cách sử dụng hàm gethostbyaddr().

Khi tôi thử trên OS X hoặc iOS, tính năng này không hoạt động.

Dường như có sự cố với gethostbyaddr() trong OS X và iOS.

Dù sao, nếu bạn có ý tưởng khác để nhận tên máy chủ từ xa từ IP của nó trong iOS, nó sẽ làm cho ngày của tôi.

Đây là mã tôi đã sử dụng:

Đầu tiên kiểm tra:

192.168.0.101 là địa chỉ ip của máy mà chúng tôi đang truy vấn cho hostname.

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

Mã này hoạt động tốt trên Linux nhưng không hoạt động trên OS X hoặc iOS.

thử nghiệm thứ hai: stucks

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

Mã này tại CFHostStartInfoResolution trở về con số không vào thời điểm này.

Thx trước.

+0

Tôi nghĩ bạn muốn có API CFHost, hãy xem [this] (http://blog.toshsoft.de/index.php?/archives/5-3-Ways-to-Resolve-a-Hostname- trong-iOS.html) – Jonathan

+0

Tôi đã thử với CFHost API, cùng một vấn đề khi tôi cố gắng truy xuất lại tên máy chủ từ một địa chỉ IP hiện có trên mạng, yêu cầu đã hết thời gian chờ. Nhưng khi tôi cố gắng giải quyết 127.0.0.1 đó là add localhost, nó hoạt động. – taredhot

+0

bạn có giải quyết được sự cố không? Tôi nhận được cùng một giá trị nil @taredhot –

Trả lời

1

Nó thực sự là một lớp lót. [[NSHost hostWithAddress:@"173.194.34.24"] name]

+1

Và thực sự không có lý do gì 'gethostbyaddr' không hoạt động trên OS X/iOS. Máy chủ DNS của bạn sai, hoặc mã của bạn, nhưng về mặt lý thuyết nó sẽ hoạt động. 'Host 192.168.0.101' nói gì? – Ecco

+0

Với kinh nghiệm của tôi và tôi đã thử điều này với 3 thiết bị hoạt động của mạng của tôi, nó không phải là. Tôi tin rằng 'NSHost hostWithAddress:' chỉ dành cho IP toàn cầu, chứ không phải là người dân địa phương. Tôi đã cố gắng làm những gì OP muốn trong nhiều giờ. Ngoài ra, kết quả của 'gethostbyaddr' là NULL, do đó printf() OP sử dụng ở cuối, kết thúc trong một sự cố. Bạn có biết cách nào khác không? – isklikas

+0

NSHost chỉ hoạt động trên nền tảng OSX chứ không phải cho iOS –

Các vấn đề liên quan