Cocoa 如何使用NSHost获取一组LAN ip地址后面的名称?

Cocoa 如何使用NSHost获取一组LAN ip地址后面的名称?,cocoa,dns,dig,nshost,Cocoa,Dns,Dig,Nshost,我知道如何使用终端和dig获取ip地址后面的名称。即: dig @224.0.0.251 -p5353 -x 192.168.0.195 +short 但是,我不想在应用程序中使用NSTask。 如何使用NSHost获取局域网内ip地址后面的名称?我尝试了这个,但它总是返回零: 非常感谢 编辑: 这些方法/功能。。。 +[NSHost hostWithAddress:] gethostbyaddr(3)-一个BSD函数 …似乎与以下内容相同: dig -x 192.168.0.195 如果我

我知道如何使用终端和dig获取ip地址后面的名称。即:

dig @224.0.0.251 -p5353 -x 192.168.0.195 +short
但是,我不想在应用程序中使用NSTask。 如何使用NSHost获取局域网内ip地址后面的名称?我尝试了这个,但它总是返回零:

非常感谢

编辑: 这些方法/功能。。。 +[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
(你好,多播查找),而不必使用NSTask,那就太好了。:)

它不使用
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;
}
#导入
#进口
#进口
静态无效回调(DNSServiceRef serviceRef、DNSServiceFlags、uint32_t interfaceIndex、,
DNSServiceErrorType错误代码,常量字符*全名,
uint16_t rrtype,uint16_t rrclass,
uint16_t rdlen,const void*rdata,
uint32_t ttl,无效*上下文){
字符结果[1024]={0};
dn_扩展(rdata,rdata+rdlen,rdata,result,1024);
NSLog(@“找到:%s”,结果);
}
int main(int argc,char const*argv[]{
DNSServiceRef reverseLookupService=NULL;
DNSServiceErrorType error=KDNServiceerr\u NoError;
错误=DNSServiceQueryRecord(&reverseLookupService,kDNSServiceFlagsForceMulticast,
kDNSServiceInterfaceIndexAny,“地址arpa中的5.1.168.192.”,
kDNSServiceType_PTR,kDNSServiceClass_IN,
回调,空);
if(错误!=kDNSServiceErr\u NoError){
NSLog(@“错误:%d”,错误);
出口(1);
}
错误=DNSServiceProcessResult(reverseLookupService);
DNSServiceRefDeallocate(反向LookupService);
返回0;
}
重要的部分是将
DNSServiceQueryRecord
kDNSServiceFlagsForceMulticast
一起使用。有关此函数的更多信息,请参阅

您必须将IP地址转换为in-addr.arpa.-自己格式化,但这并不难(八位字节与最后的“in-addr.arpa.”相反。IPv6可能类似,但我没有测试过)


它导入
resolv.h
(您需要将其链接到libresolv),但仅用于
dn\u expand
。传递到回调的数据被压缩,并且
dn\u expand
创建了一个人类可读的表示形式。

嘿,这非常有效。谢谢!我现在可以通过NSTask废话:D
#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;
}