Просмотр для сетевых служб
Просмотр для служб с помощью этого API довольно прост. Можно узнать, какие службы данного типа доступны в данном домене с единственным вызовом функции.
Используя DNSServiceBrowse
Для просмотра для доступных служб вызвать DNSServiceBrowse
. Параметры для совершения этого звонка состоят из следующего:
Неинициализированная ссылка открытия службы.
Индекс для интерфейса Вы хотите просмотреть; передача
0
просмотреть все доступные интерфейсы, передачу–1
просмотреть для служб на локальный узел только или передать число, представляющее интерфейс, который Вы хотите просмотреть (используютif_nametoindex
семья вызовов для получения числа).Тип регистрации службы Вы хотите просмотреть; тип регистрации является типом службы, сопровождаемым точкой, сопровождаемой протоколом (например,
_printer._tcp
).Домен для просмотра; передача
NULL
просмотреть домен (ы), указанный пользователем как приемлемый для просмотра или передать доменное имя, чтобы только просмотреть тот домен.Функция обратного вызова, которую нужно вызвать, чтобы предоставить информацию об успешности или неуспешности обзора и обеспечить результаты поиска, такой как сервис, который был найден или служба, которая больше не доступна.
Определяемое пользователем значение контекста, которое будет передано функции обратного вызова, когда это вызовут, или
NULL
.
Если обзор может быть запущен, DNSServiceBrowse
инициализирует ссылку открытия службы и создает сокет, использующийся для передачи с mDNSResponder
демон. Используйте ссылку открытия службы на вызов DNSServiceRefSockFD
и получите дескриптор сокета для сокета.
Используйте дескриптор сокета для установки цикла выполнения или a select
цикл, который укажет когда ответ от mDNSResponder
демон становится доступным. Ответ может указать, что экземпляр службы, соответствующий указанный тип, домен и интерфейс, был найден или что ранее найденный экземпляр службы больше не доступен. Когда цикл указывает что mDNSResponder
демон ответил, вызвать DNSServiceProcessResult
и передайте ему ссылку открытия службы, инициализированную DNSServiceBrowse
. DNSServiceProcessResult
вызовет функцию обратного вызова, связанную со ссылкой открытия службы.
Ваш обратный вызов вызовут со следующими параметрами:
Ссылка открытия службы, инициализированная
DNSServiceBrowse
.Флаги, предоставляющие информацию о службе, найденной или это больше не доступное и просматривающее состояние. Например,
kDNSServiceFlagsAdd
указывает, что параметр службы содержит имя найденной службы; необходимо добавить его к списку доступных служб. ЕслиkDNSServiceFlagsAdd
не установлен, служба, указанная параметром службы, больше не доступна и должна быть удалена из Вашего списка доступных служб. Состояние Browsing обозначеноkDNSServiceFlagsMoreComing
флаг. Когда это будет установлено, Вашу функцию обратного вызова вызовут снова сразу, таким образом, Вы не должны обновлять свой пользовательский интерфейс. КогдаkDNSServiceFlagsMoreComing
не установлен, Вашу функцию обратного вызова не вызовут снова сразу, таким образом, у Вас будет время для обновления пользовательского интерфейса.Индекс интерфейса, в котором была обнаружена служба.
Код ошибки, указывающий, был ли просмотр успешен; если просмотр был успешен, остающиеся параметры содержат допустимые данные.
Имя службы, найденной, если просмотр был успешен.
Тип регистрации, если просмотр был успешен.
Домен, в котором была обнаружена служба, если просмотр был успешен.
Определяемая пользователем контекстная информация, переданная
DNSServiceBrowse
.
Просмотр многократных доменов
Просмотреть в многократных доменах, или для многократных типов службы, вызова DNSServiceBrowse
для каждого домена и типа службы интереса. Ваше приложение ответственно за отслеживание ответы.
Если Ваше приложение должно оставить интерфейс браузера видимым все время, Ваше приложение работает, как iTunes и iChat делают, то Вы обычно будете вызывать DNSServiceBrowse
один раз на сеанс. Каждый раз, когда новая служба становится доступной, или существующая служба становится недоступной, данные отправляются в Вашу функцию обратного вызова, таким образом, можно просто оставить обратный вызов активным, и список служб всегда будет актуален. Эта информация обычно нечасто изменяется, таким образом, обратный вызов обычно не использует много процессорного времени.
Однако, если Вы необходимо вызвать, которых приложение не должно постоянно показывать списку доступных служб, в ситуации, таких как диалоговое окно принтера, тогда DNSServiceBrowse
и завершите просмотр, когда Вы будете закончены.
Когда Вы вызываете DNSServiceBrowse
, это инициализирует ссылку открытия службы и открывает основанное на сокете соединение с mDNSResponder
демон. Поэтому, если Вы принимаете решение деактивировать свой обратный вызов и повторить поиск по мере необходимости, убедиться вызвать DNSServiceRefDeallocate
освобождать ссылку перед вызовом DNSServiceBrowse
снова. Иначе, Вы пропустите память и сокеты для каждого поиска.
Фактический IP-адрес и порт приведенного примера службы будут изменяться более часто, чем имя службы. Каждый раз, когда Вы используете службу, необходимо разрешить текущий адрес экземпляра службы только до использования службы. Посмотрите следующий раздел, Разрешение Текущего адреса Службы.
Завершение просмотра
Для завершения просмотра удалите дескриптор сокета из цикла выполнения или select
цикл и вызов DNSServiceRefDeallocate
, передача ему ссылка открытия службы, инициализированная когда DNSServiceBrowse
был вызван. Просмотр останавливается, ссылка открытия службы лишена законной силы, и память, связанная со ссылкой, освобождена. Сокет, лежащий в основе соединения с mDNSResponder
демон закрывается, таким образом завершая соединение Вашего приложения с демоном.