首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DNS异步查找

DNS异步查找
EN

Stack Overflow用户
提问于 2013-08-30 09:26:33
回答 2查看 2.2K关注 0票数 2

有一段使用CFHostStartInfoResolution()进行DNS查找的代码。然而,这是同步的,因此在它返回之前阻塞任何东西--它是坏的,而且我也认为它会在连接弱时由于超时而导致崩溃(当连接弱时,它会安全地失败)。

所以我想异步地这样做,因为它应该在docs https://developer.apple.com/library/ios/documentation/CoreFoundation/Reference/CFHostRef/Reference/reference.html New 20190227https://developer.apple.com/documentation/cfnetwork/cfhostref中完成。

具体来说,它说:

如果您想异步解析主机。调用CFHostSetClient将客户端上下文和用户定义的回调函数与主机关联起来。然后调用CFHostScheduleWithRunLoop来调度运行循环中的主机。

然而,这让我很不爽,因为我已经很久没有编写C代码了,并且无法正确地进行回调和运行循环/线程处理。

我应该如何调用CFHostSetClient、CFHostScheduleWithRunLoop,以及如何实现这些回调?我需要启动一个新线程吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-30 10:14:45

应该是这样的

代码语言:javascript
运行
复制
CFHostSetClient(host, callbackFunction, hostContext);
CFHostScheduleWithRunLoop(host, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
CFHostStartInfoResolution(host, kCFHostAddresses, 0);

和callbackFunction

代码语言:javascript
运行
复制
void callbackFunction(CFHostRef theHost, CFHostInfoType typeInfo, const CFStreamError *error, void *info) {
    // Do something
}

你不需要启动一个新线程,系统会帮你的。

票数 1
EN

Stack Overflow用户

发布于 2019-02-26 18:55:40

实际上,从10.7开始,CFHost在macOS上就有了一个bug。在10.7之前,可以取消在第二个线程上调用CFHostCancelInfoResolution()的同步查找,但是从10.7开始,这已经不可能了(它只是不会取消查找)。我曾在2013年向苹果报告过(bug数为13672880),但尽管我确认了这一点,但到今天为止,苹果还没有对其进行修正。

然而,更有趣的是苹果公司在答复中提出的建议:

主机名解析的最佳API是DNSServiceGetAddrInfo,这是异步和可取消的。

macOS自10.11.4以来、iOS自9.3、tvOS自9.2和watchOS自2.2以来都存在这种API,但我认为这是不正确的,它肯定存在,否则苹果如何在2013年推荐它(10.11是2015年发布的)。我可以确认,这个API也存在于iOS 8和macOS 10.9上,甚至可能更早地存在于这两个系统上。

这个API在内部使用的是一个没有文档记录的异步版本的否则同步的C调用getaddrinfo(),这个版本现在在所有类似POSIX的系统上都能找到。

与其他API相比,您可以选择只检索IPv4、IPv6或这两种地址,或者让系统决定为您选择地址系列,这取决于系统目前认为可访问的地址(这是大多数其他解析API的默认设置)。

此外,如果系统有多个活动网络接口(例如电缆+ WiFi或WiFi +移动),您可以选择要使用的接口,因为可以在不同的接口上设置不同的DNS设置(不同的DNS服务器可以为相同的域名提供不同的结果)。如果不选择一个,系统将始终使用当前的默认服务器(对于大多数其他解析API来说,这是默认的)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18529436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档