有一段使用CFHostStartInfoResolution()进行DNS查找的代码。然而,这是同步的,因此在它返回之前阻塞任何东西--它是坏的,而且我也认为它会在连接弱时由于超时而导致崩溃(当连接弱时,它会安全地失败)。
所以我想异步地这样做,因为它应该在docs https://developer.apple.com/library/ios/documentation/CoreFoundation/Reference/CFHostRef/Reference/reference.html New 20190227:https://developer.apple.com/documentation/cfnetwork/cfhostref中完成。
具体来说,它说:
如果您想异步解析主机。调用CFHostSetClient将客户端上下文和用户定义的回调函数与主机关联起来。然后调用CFHostScheduleWithRunLoop来调度运行循环中的主机。
然而,这让我很不爽,因为我已经很久没有编写C代码了,并且无法正确地进行回调和运行循环/线程处理。
我应该如何调用CFHostSetClient、CFHostScheduleWithRunLoop,以及如何实现这些回调?我需要启动一个新线程吗?
发布于 2013-08-30 10:14:45
应该是这样的
CFHostSetClient(host, callbackFunction, hostContext);
CFHostScheduleWithRunLoop(host, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
CFHostStartInfoResolution(host, kCFHostAddresses, 0);和callbackFunction
void callbackFunction(CFHostRef theHost, CFHostInfoType typeInfo, const CFStreamError *error, void *info) {
// Do something
}你不需要启动一个新线程,系统会帮你的。
发布于 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来说,这是默认的)。
https://stackoverflow.com/questions/18529436
复制相似问题