2012-01-17 14 views
1

私は、端末と掘り下げを使ってIPアドレスの背後にある名前を取得する方法を知っています。私は:LANのIPアドレスの束の後ろに名前を取得するNSHostを使用する方法?

dig @224.0.0.251 -p5353 -x 192.168.0.195 +short 

しかし、私は自分のアプリケーションでNSTaskを使いたくありません。 NSHostを使用してLAN内のIPアドレスの背後にある名前を取得するにはどうすればよいですか?私はこれを試してみましたが、それは常にnilを返し

NSHost *myHost = [NSHost hostWithAddress:@"192.168.0.195"]; 
NSLog(@"name: %@", [myHost name]); 

おかげでたくさん!

編集: これらのメソッド/関数... + [NSHost hostWithAddress:] - :

dig -x 192.168.0.195 

のgethostbyaddr(3)BSD関数 は...と同じように見えます端末でそのdigコマンドを使用すると、サーバに到達できないと言います。 (はい、私のLANにDNSサーバがありません)ので、私は戻って驚くべきではないnil

NSTaskを使用せずにdig @224.0.0.251 -p5353 -x 192.168.0.195 +short(bonjourマルチキャスト検索)をアプリで実装できるといいですね。 :)それはNSHostを使用していますが、Bonjourの-APIを使用すると、あなたが望むように動作しているようだしない

答えて

2

#import <Cocoa/Cocoa.h> 
#import <dns_sd.h> 
#import <resolv.h> 

static void callback(DNSServiceRef serviceRef, DNSServiceFlags flags, uint32_t interfaceIndex, 
        DNSServiceErrorType errorCode, const char *fullname, 
        uint16_t rrtype, uint16_t rrclass, 
        uint16_t rdlen, const void *rdata, 
        uint32_t ttl, void *context) { 

    char result[1024] = {0}; 
    dn_expand(rdata, rdata + rdlen, rdata, result, 1024); 
    NSLog(@"Found: %s", result); 
} 

int main(int argc, char const *argv[]) { 
    DNSServiceRef reverseLookupService = NULL; 

    DNSServiceErrorType error = kDNSServiceErr_NoError; 
    error = DNSServiceQueryRecord(&reverseLookupService, kDNSServiceFlagsForceMulticast, 
     kDNSServiceInterfaceIndexAny, "5.1.168.192.in-addr.arpa.", 
     kDNSServiceType_PTR, kDNSServiceClass_IN, 
     callback, NULL); 

    if (error != kDNSServiceErr_NoError) { 
     NSLog(@"Error: %d", error); 
     exit(1); 
    } 

    error = DNSServiceProcessResult(reverseLookupService); 

    DNSServiceRefDeallocate(reverseLookupService); 

    return 0; 
} 

重要な部分は、kDNSServiceFlagsForceMulticastDNSServiceQueryRecordを使用しています。この機能の詳細についてはhttps://developer.apple.com/library/mac/#documentation/Networking/Reference/DNSServiceDiscovery_CRef/dns_sd_h/index.html#//apple_ref/c/func/DNSServiceQueryRecordをご覧ください。

IPアドレスを自分自身でa​​ddr.arpa.-formatに変換する必要がありますが、それは難しくありません(オクテットは最後に「in-addr.arpa。」が付いています)。同様ですが、私はそれをテストしていません)。

resolv.hをインポートします(libresolvにリンクする必要があります)。ただし、dn_expandの場合のみです。コールバックに渡されたデータは圧縮され、dn_expandは人間が読める形式を作成します。

+0

ねえ、これは素晴らしいです。どうもありがとう!私は今、NSTaskのクラップスを通り抜けることができます:D – Daniel

関連する問題