0

我在网上找到了一些示例代码,我试图用它来进行 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_tDNSServiceRefSockFD(serviceRef.pointee). 但是现在我有了套接字,我不确定如何“将它与运行循环一起使用”作为运行循环的事件源(根据DNSServiceRefSockFD文档)。

我只是不明白这是如何工作的。我不明白如何将其dnsssd_sock_t用作运行循环的事件源,以便我可以DNSServiceProcessResult在正确的时间调用而不会阻塞,以便我callback真正运行。

如果最好将套接字用作 kqueue 事件源或在 select() 循环中(如文档所述),我很好,但我也不知道该怎么做。

CoreFoundation 可能非常神秘,因此非常感谢任何帮助!

如果有更好的方法来进行 CNAME 记录查找,那么请务必分享!

4

1 回答 1

0

请参阅我对https://gist.github.com/fikeminkel/a9c4bc4d0348527e8df3690e242038d3的评论

第一段回答了如何在不阻塞的情况下调用回调。

于 2018-03-12T17:52:36.440 回答