如何刷新bonjour的服务清单?

时间:2014-01-16 19:27:35

标签: python networking bonjour

我们的应用程序使用Bonjour来发现网络上的服务。在DNSServiceResolveCallback中,当发现新服务时,我正在向应用程序的另一部分发送消息,然后继续连接到新找到的服务器。心跳机制允许我们立即检测连接故障(例如拔掉电缆)。

Bonjour本身并未立即检测到此类故障,因此我理解我需要手动使Bonjour的缓存无效。

但是怎么样?

  1. 我似乎需要拨打DNSServiceReconfirmRecord,但我应该通过哪些选项?特别是,我的全名 rrtype rdata 应该是什么? Apple提供an example(参见解决失败时),但我真的不明白。

  2. 在Bonjour的缓存失效后,我将在哪里通知服务不再存在?在什么回调?

  3. 如果服务再次重新联机(网络电缆重新插入),我是否会在浏览回调中收到通知?

1 个答案:

答案 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,因为这是唯一定义的。