我们的应用程序使用Bonjour来发现网络上的服务。在DNSServiceResolveCallback中,当发现新服务时,我正在向应用程序的另一部分发送消息,然后继续连接到新找到的服务器。心跳机制允许我们立即检测连接故障(例如拔掉电缆)。
Bonjour本身并未立即检测到此类故障,因此我理解我需要手动使Bonjour的缓存无效。
但是怎么样?
我似乎需要拨打DNSServiceReconfirmRecord,但我应该通过哪些选项?特别是,我的全名, rrtype 和 rdata 应该是什么? Apple提供an example(参见解决失败时),但我真的不明白。
在Bonjour的缓存失效后,我将在哪里通知服务不再存在?在什么回调?
如果服务再次重新联机(网络电缆重新插入),我是否会在浏览回调中收到通知?
答案 0 :(得分:2)
添加服务时,眉毛回调应该会收到kDNSServiceFlagsAdd。如果没有设置标志,我的用途就足以假设服务消失了。您是否已经看到了哪些服务的内部会计?每次断开连接时都会使整个缓存失效会导致相当多的网络开销。
这是我扭曲的特定包装 https://github.com/jlujan/twistpybonjour/blob/master/twistbonjour.py
更新并修复:
您需要查询记录以获取传递给DNSServiceReconfirmRecord的正确字段。示例是here
然后尝试
pybonjour.DNSServiceReconfirmRecord(0,
interfaceIndex,
fullname,
rrtype,
rrclass,
rdata)
您必须保留对解析/查询回调中收到的相关字段的引用。 rrtype字段是记录的类型,通常是kDNSServiceType_SRV。 rrclass始终是kDNSServiceClass_IN,因为这是唯一定义的。