2012-01-17 103 views
1

我知道如何使用終端獲取IP地址後面的名字並進行挖掘。 I.e:如何使用NSHost獲取一堆局域網IP地址的名字?

dig @224.0.0.251 -p5353 -x 192.168.0.195 +short 

但是,我不想在我的應用程序中使用NSTask。 如何使用NSHost獲取局域網內IP地址的名稱?我想這一點,但它總是返回

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

非常感謝!

編輯: 這些方法/函數... + [NSHost hostWithAddress:] gethostbyaddr(3) - 甲BSD函數 ...似乎是相同:

dig -x 192.168.0.195 

如果我在終端中使用這個dig命令,它說沒有服務器可以到達。 (是的,我的局域網中沒有DNS服務器),所以難怪我回到

如果我可以在我的應用中實現dig @224.0.0.251 -p5353 -x 192.168.0.195 +short(bonjour多播查找)而無需使用NSTask,那將是一件好事。 :)

回答

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

的重要組成部分,是用DNSServiceQueryRecordkDNSServiceFlagsForceMulticast。查看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。」的。相似,但我沒有測試過)。

它會導入resolv.h(並且您需要將它鏈接到libresolv),但僅限於dn_expand。傳遞給回調函數的數據被壓縮,並且dn_expand創建一個可讀的表示。

+0

嘿,這很好。非常感謝!我現在可以通過NSTask廢話:D – Daniel 2012-04-11 20:25:19