1

ターミナルを使用してIPアドレスの背後にある名前を取得して掘り下げる方法を知っています。すなわち:

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:] gethostbyaddr(3)-BSD関数...次と同じようです:

dig -x 192.168.0.195

ターミナルでそのdigコマンドを使用すると、サーバーに到達できなかったと表示されます。(はい、LANにDNSサーバーがありません)ので、nilに戻るのも不思議ではありません。

dig @224.0.0.251 -p5353 -x 192.168.0.195 +shortNSTaskを使用せずにアプリに(bonjourマルチキャストルックアップ)を実装できれば素晴らしいと思います。:)

4

1 に答える 1

2

を使用しませんNSHostが、Bonjour-APIを使用し、希望どおりに機能するようです。

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

重要な部分はで使用DNSServiceQueryRecordすることkDNSServiceFlagsForceMulticastです。この関数の詳細については、 https://developer.apple.com/library/mac/#documentation/Networking/Reference/DNSServiceDiscovery_CRef/dns_sd_h/index.html#//apple_ref/c/func/DNSServiceQueryRecordを参照してください。

IPアドレスを自分でin-addr.arpa.-formatに変換する必要がありますが、それは難しいことではありません(オクテットは、最後に「in-addr.arpa。」が付いた逆引きです。IPv6もおそらく似ていますが、私はテストしていません)。

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

于 2012-04-10T16:13:39.857 に答える