Двойные службы Bonjour при просмотре
Q: При просмотре для использования служб Bonjour CFNetSevices, NSNetServices или DNSServiceDiscovery, я иногда получаю многократные события ADD, содержащие идентичные имена службы. Почему это происходит?
A: При просмотре для использования служб Bonjour CFNetSevices, NSNetServices или DNSServiceDiscovery, я иногда получаю многократные события ADD, содержащие идентичные имена службы. Почему это происходит?
Когда Ваш компьютер имеет больше чем один сетевой интерфейс, включенный потому что, по умолчанию, Добрый день обзоры во всех активных интерфейсах, это происходит. Так, например, если Ваш компьютер будет иметь соединение Ethernet и соединение AirPort, и служба распространяется и на Ethernet и на AirPort, то Ваш обратный вызов вызовут дважды содержащий то же имя службы.
С CFNetServices и NSNetSerivces, нет никакого способа знать, на каком сетевом интерфейсе служба была обнаружена, поэтому лучше предполагать, что оба имени службы представляют ту же службу. Вы, вероятно, не хотите показывать то же имя многократно в списке служб, таким образом, необходимо сделать подсчет ссылок каждого имени службы. Каждый раз, когда Вы получаете событие ADD для имени службы, необходимо постепенно увеличить подсчет ссылок, и для каждого события REMOVE, необходимо постепенно уменьшить подсчет ссылок. Когда подсчет ссылок достигает нуля, необходимо удалить имя службы из списка браузера. Когда это прибывает время для Разрешения службы, обнаруженной на многократных сетевых интерфейсах, это не имеет никакого значения, которое CFNetServiceRef или NSNetService возражают, что Вы используете для инициирования Решения, потому что запрос Решения отправляется на каждом сетевом интерфейсе.
С более новым DNSServiceDiscovery API, расположенным в /usr/include/dns_sd.h, Ваш обратный вызов обзора возвратит сетевой интерфейс ID, соответствующий интерфейсу, в котором была обнаружена служба. Это дает Вам опцию отображения имени службы многократно вместе с дополнительной информацией, описывающей сетевой интерфейс. Например, Вы могли вывести на экран имя службы с текстом «en1» или «Аэропорт», добавленный к имени, или Вы могли просто вывести на экран значок AirPort рядом с именем службы, если бы служба была обнаружена по AirPort. Однако, если Вы используете DNSServiceDiscovery API и таким образом можете отличить службы на различные интерфейсы, он может все еще быть целесообразен показывать, что каждая служба называет только один раз (использование подхода подсчета ссылок, описанного выше), потому что это делает пользовательский интерфейс более простым.
История версии документа
| Дата | Примечания |
|---|---|
| 06.02.2004 | Новый документ, объясняющий, как работать с многократными сетевыми интерфейсами при просмотре для служб Bonjour. |