gpt4 book ai didi

cocoa - 如何使用 NSHost 获取一堆 LAN ip 地址背后的名称?

转载 作者:行者123 更新时间:2023-12-03 17:05:51 26 4
gpt4 key购买 nike

我知道如何使用终端和挖掘来获取 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 主机WithAddress:] gethostbyaddr(3) - BSD 函数...似乎与:

dig -x 192.168.0.195

如果我在终端中使用 dig 命令,它会说无法访问服务器。 (是的,我的 LAN 中没有 DNS 服务器),所以难怪我返回nil

如果我可以在我的应用程序中实现 dig @224.0.0.251 -p5353 -x 192.168.0.195 +short (bonjour 多播查找)而无需使用 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;
}

重要的部分是将 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.- 格式,但这并不难(八位字节在末尾带有“in-addr.arpa.”)。IPv6 可能类似,但我没有测试过)。

它导入 resolv.h (并且您需要将其链接到 libresolv),但仅限于 dn_expand。传递给回调的数据被压缩,dn_expand 创建人类可读的表示。

关于cocoa - 如何使用 NSHost 获取一堆 LAN ip 地址背后的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8901651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com