【问题标题】:How to refresh bonjour's service list?如何刷新卓悦的服务列表?
【发布时间】:2014-01-16 19:27:35
【问题描述】:

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

Bonjour 本身不会立即检测到此类故障,因此我知道我需要手动使 Bonjour 的缓存无效。

但是怎么做呢?

  1. 看来我需要调用DNSServiceReconfirmRecord,但是我应该通过哪些选项?特别是,我的 fullnamerrtyperdata 应该是什么? Apple 提供了an example(参见When Resolving Fails),但我不是很懂。

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

  3. 如果服务再次上线(网线重插),浏览回调会通知我吗?

【问题讨论】:

    标签: python networking bonjour


    【解决方案1】:

    添加服务时,您的浏览回调应该会收到 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 因为这是唯一定义的。

    【讨论】:

    • 这是否意味着您定期浏览(例如每 5 秒一次),建立一个已发现机器的列表并将其与之前的列表进行比较?我正在使用 select as in this example,当机器消失时,不会调用 Browse 回调。
    • 浏览是连续的。您基本上是在注册 mDNS 以接收新服务广播的通知。示例中browse_callback 中的if not (flags & pybonjour.kDNSServiceFlagsAdd): 正在执行我在答案中描述的操作。
    • 如果您直接使用这些示例,您应该会看到服务删除。这是浏览器的输出,并在启动和停止注册示例后解析 $ python bonjour.py _test._tcp 服务添加;解决已解决的服务:全名 = TestService._test._tcp.local。主机目标 = Ripley.local。端口 = 1234 服务已删除 服务已添加;解决已解决的服务:全名 = TestService._test._tcp.local。主机目标 = Ripley.local。端口 = 1234
    • 当服务被取消注册时,我确实看到服务被删除。但是,如果连接丢失(以太网电缆被拔出),本地 Bonjour 浏览器将不会收到通知,因为 Bonjour 会保留具有相当长 TTL 的发现者服务的本地缓存。
    • pybonjour 似乎没有从 DNSServiceReconfirmRecord 返回错误代码。
    猜你喜欢
    • 2012-08-30
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多