gpt4 book ai didi

ios - 异步 DNS 查找

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:11:19 24 4
gpt4 key购买 nike

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

所以我想异步执行此操作,就像文档中应该做的那样 https://developer.apple.com/library/ios/documentation/CoreFoundation/Reference/CFHostRef/Reference/reference.html新文档 URL 20190227:https://developer.apple.com/documentation/cfnetwork/cfhostref

具体说:

If you want to resolve the host asynchronously. call CFHostSetClient to associate your client context and user-defined callback function with the host. Then call CFHostScheduleWithRunLoop to schedule the host on a run loop.

然而,这让我望而却步,因为我已经很久没有编写 C 代码了,无法正确获得回调和运行循环/线程。

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

最佳答案

实际上 CFHost 自 macOS 10.7 以来就有一个错误。在 10.7 之前,可以取消在第二个线程上调用 CFHostCancelInfoResolution() 的同步查找,但是从 10.7 开始,这就不再可能了(它只是不会取消查找)。我在 2013 年向 Apple 报告了该问题(错误编号为 13672880),但尽管确认了这一点,Apple 至今仍未修复它。

然而更有趣的部分是 Apple 在他们的回复中建议:

The best API for host name resolution is DNSServiceGetAddrInfo and that's asynchronous and cancelable.

据记载,该 API 在 macOS 10.11.4、iOS 9.3、tvOS 9.2 和 watchOS 2.2 上存在 - 但我认为这不正确,它一定存在,否则 Apple 怎么会推荐它2013 年(10.11 于 2015 年发布)。我可以确认这个 API 也存在于 iOS 8 和 macOS 10.9 上,甚至可能更早地存在于这两个系统上。

此 API 在内部使用同步 C 调用 getaddrinfo() 的未记录的异步版本,该版本可在当今所有类似 POSIX 的系统上找到。

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

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

关于ios - 异步 DNS 查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18529436/

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