2014-01-16 4 views
1

Наше приложение использует Bonjour для обнаружения услуг в сети. В DNSServiceResolveCallback, когда обнаружена новая служба, я отправляю сообщение в другую часть приложения, а затем переходит к подключению к вновь найденному серверу. Механизм сердечного ритма позволяет нам немедленно обнаруживать сбои подключений (например, отсоединенный кабель).Как обновить список услуг bonjour?

Такие сбои не обнаружены самим Bonjour сразу, поэтому я понимаю, что мне нужно вручную аннулировать кеш Bonjour.

Но как?

  1. Кажется, что мне нужно вызвать DNSServiceReconfirmRecord, но какие варианты я должен пройти? Тем более, что мое фамилия, rrtype и rdata должно быть? Apple предоставляет an example (см. при разрешении отказов), но я этого не понимаю.

  2. После того, как кеш Bonjour был признан недействительным, откуда я буду уведомлен, что служба больше не существует? В каком обратном вызове?

  3. Если услуга снова возвращается в сеть (сетевой кабель перегружен), будет ли я уведомлен в обратном вызове просмотра?

ответ

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, поскольку это единственный определенный.

+0

Означает ли это, что вы регулярно просматриваете (как каждые 5 секунд), создаете список обнаруженных машин и сравниваете его с предыдущим списком? Я использую * select * [как в этом примере] (http://code.google.com/p/pybonjour/), и когда машина исчезает, обратный вызов Browse не вызывается. – Charles

+0

Просмотр непрерывный. Вы в основном регистрируетесь в mDNS для получения уведомлений о новых услугах. 'if not (flags & pybonjour.kDNSServiceFlagsAdd):' in 'browse_callback' в примере выполняет то, что я описал в своем ответе. – jlujan

+0

Если вы используете эти примеры напрямую, вы должны увидеть удаление служб. Это вывод браузера и разрешение после запуска и остановки примера регистра $ python bonjour.py _test._tcp Добавлена ​​услуга; разрешение Решенное обслуживание: Полное имя = TestService._test._tcp.local. hosttarget = Ripley.local. port = 1234 Служба удалена Служба добавлена; Разрешающая способность Решенное обслуживание: Полное имя = TestService._test._tcp.local. hosttarget = Ripley.local. port = 1234 – jlujan

Смежные вопросы