11

この LAN 上の IP アドレスから LAN 内のデバイスのホスト名を解決する方法を探しています。

gethostbyaddr() 関数を使用して、Linux 上で完全に動作する C 言語のプログラムを作成しました。

OS X または iOS で試したところ、うまくいきませんでした。

OS X と iOS では gethostbyaddr() に問題があるようです。

とにかく、iOS の IP からリモート マシンのホスト名を取得する別のアイデアがあれば、それで一日が楽しくなります。

これは私が使用したコードです:

最初のテスト:

192.168.0.101 は、ホスト名を照会しているマシンの IP アドレスです。

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

このコードは Linux ではうまく機能しますが、OS X や iOS では機能しません。

2 番目のテスト:

+ (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 でスタックし、この時点で nil を返します。

事前にt​​hx。

4

1 に答える 1

2

それは実際にはワンライナーです。 [[NSHost hostWithAddress:@"173.194.34.24"] name]

于 2012-12-08T22:57:47.150 に答える