我在网上找到了一些示例代码,我试图用它来进行 CNAME 记录查找(注意我传递了一个callback
我想要运行的块):
DNSServiceQueryRecord(serviceRef, 0, 0, domainName, UInt16(kDNSServiceType_CNAME), UInt16(kDNSServiceClass_IN), callback, &mutableCompletionHandler);
DNSServiceProcessResult(serviceRef.pointee)
问题是这段代码被阻塞了,DNSServiceProcessResult(serviceRef.pointee)
并且callback
永远不会被调用。根据 Apple 的DNSServiceProcessResult文档,我需要
DNSServiceRefSockFD
与运行循环或 select() 结合使用,以确定是否存在来自服务器的响应,然后再调用此函数以处理响应而不阻塞。
所以我看了看,DNSServiceRefSockFD
发现我可以dnssd_sock_t
用DNSServiceRefSockFD(serviceRef.pointee)
. 但是现在我有了套接字,我不确定如何“将它与运行循环一起使用”作为运行循环的事件源(根据DNSServiceRefSockFD文档)。
我只是不明白这是如何工作的。我不明白如何将其dnsssd_sock_t
用作运行循环的事件源,以便我可以DNSServiceProcessResult
在正确的时间调用而不会阻塞,以便我callback
真正运行。
如果最好将套接字用作 kqueue 事件源或在 select() 循环中(如文档所述),我很好,但我也不知道该怎么做。
CoreFoundation 可能非常神秘,因此非常感谢任何帮助!
如果有更好的方法来进行 CNAME 记录查找,那么请务必分享!