2014-01-16 54 views
1

我們的應用程序使用Bonjour來發現網絡上的服務。在DNSServiceResolveCallback中,當發現新服務時,我將消息發送到應用程序的另一部分,然後繼續連接到新找到的服務器。心跳機制使我們能夠立即檢測到連接故障(例如拔下電纜)。如何刷新bonjour的服務列表?

Bonjour本身沒有檢測到這樣的故障,所以我明白我需要手動使Bonjour的緩存失效。

但是如何?

  1. 看來我需要撥打DNSServiceReconfirmRecord,但我應該通過哪些選項?特別是,我的全名,rrtyperdata應該是什麼? Apple提供了an example(請參閱當解決失敗)但我真的不明白它。

  2. Bonjour的緩存失效後,我會在哪裏通知服務不再存在?在什麼回調?

  3. 如果服務再次重新聯機(網絡電纜重新插入),我會在瀏覽回調中收到通知嗎?

回答

2

當添加服務時,您的眉毛回調應該會收到kDNSServiceFlagsAdd。如果沒有設置標誌,我的使用足以讓服務消失。你有內部會計哪些服務已被看到?每次斷開連接時都會使整個緩存失效,這會導致相當多的網絡開銷。

這是我的扭曲的特定的包裝 ​​

的更新和修復:

您將需要查詢的記錄,以獲得正確的字段傳遞給DNSServiceReconfirmRecord。例子是here

然後嘗試

pybonjour.DNSServiceReconfirmRecord(0, 
    interfaceIndex, 
    fullname, 
    rrtype, 
    rrclass, 
    rdata) 

你將不得不繼續在相關領域的引用在你的決心/查詢回調接收。 rrtype字段是記錄的類型,通常是kDNSServiceType_SRV。 rrclass始終是kDNSServiceClass_IN,因爲這是唯一定義的。

+0

這是否意味着您定期瀏覽(如每5秒鐘一次),建立已發現機器的列表並將其與以前的列表進行比較?我使用* select * [如本例中](http://code.google.com/p/pybonjour/),當機器消失時,不會調用Browse回調。 – Charles

+0

瀏覽是連續的。您基本上正在註冊mDNS以接收新服務廣播的通知。在這個例子中''browse_callback''中的'if not(flags&pybonjour.kDNSServiceFlagsAdd):'正在做我在我的回答中描述的內容。 – jlujan

+0

如果您直接使用這些示例,則應該看到服務清除。這是瀏覽器的輸出,並在啓動和停止寄存器示例後解析 $ python bonjour.py _test._tcp 已添加服務;解決 解決的服務: fullname = TestService。_test._tcp.local。 hosttarget = Ripley.local。 端口= 1234 服務刪除 服務添加;解決 解決的服務: fullname = TestService._test._tcp.local。 hosttarget = Ripley.local。 port = 1234 – jlujan