Разрешение текущего адреса службы
Эта статья описывает, как использовать DNSServiceResolve
для получения информации о службе на основе ее имени введите, и домен.
Используя DNSServiceResolve
Как только у Вас есть имя, тип регистрации и домен службы, можно получить информацию о службе, такой как интерфейс (ы), в котором служба регистрируется, полное доменное имя службы, имя узла, предоставляющего услугу и содержание основной записи TXT службы, путем вызова DNSServiceResolve
.
Для разрешения имени службы к его имени хоста и порту вызвать DNSServiceResolve
. Параметры для совершения этого звонка состоят из следующего:
Неинициализированная ссылка открытия службы
Индекс интерфейса, на который Вы хотите разрешить службу; передайте значение, переданное Вашей функции обратного вызова для
DNSServiceBrowse
, или0
решать во всех доступных интерфейсахИмя службы, которое будет разрешено; передайте значение, переданное Вашей функции обратного вызова для
DNSServiceBrowse
Тип регистрации службы, которая будет разрешена; передайте значение, переданное Вашей функции обратного вызова для
DNSServiceBrowse
Домен, в котором регистрируется служба; передайте значение, переданное Вашей функции обратного вызова для
DNSServiceBrowse
Функция обратного вызова, которую нужно вызвать для предоставления информации об успешности или неуспешности разрешения
Определяемое пользователем значение контекста, которое будет передано функции обратного вызова, когда это вызовут, или
NULL
Если разрешение может быть запущено, DNSServiceResolve
инициализирует ссылку открытия службы и создает сокет, использующийся для передачи с mDNSResponder
демон. Используйте ссылку открытия службы на вызов DNSServiceRefSockFD
и получите дескриптор сокета для сокета.
Установка функции обратного вызова
Если DNSServiceResolve
безошибочные возвраты, Вы должны иметь mDNSResponder
разрешите ссылку открытия службы и выполните функцию обратного вызова, когда она получит ответ. Существует два метода для установки функции обратного вызова: асинхронно и синхронно.
Получить ответ от mDNSResponder
асинхронно, установите выполнение или a select
цикл с помощью дескриптора сокета. Цикл будет уведомлен каждый раз, когда ответ от mDNSResponder
демон становится доступным. Когда цикл указывает, что ответ доступен, вызвать DNSServiceProcessResult
и передайте ему ссылку открытия службы, инициализированную DNSServiceResolve
. DNSServiceProcessResult
вызовет функцию обратного вызова, связанную со ссылкой открытия службы. mDNSResponder
демон обеспечит ответ для каждой службы, которую он разрешает на основе на интерфейс.
Если Вы хотите выполнить функцию обратного вызова синхронно вместо того, чтобы настроить цикл выполнения или a select
цикл, можно вызвать DNSServiceResolve
и сразу вызовите DNSServiceProcessResult
. DNSServiceProcessResult
функция блокирует до mDNSResponder
у демона есть ответ, при котором времени обратный вызов указал когда DNSServiceResolve
был вызван будет вызван. Этот весь процесс должен, вероятно, быть выполнен в собственном цикле для каждой службы, которую Вы хотите разрешить.
В дополнение к ссылке открытия службы и флагам, в настоящее время не использующимся, Ваш обратный вызов вызовут со следующими параметрами:
Интерфейсный индекс, на котором была разрешена служба; используйте
if_nametoindex
семья вызовов для связи индекса с именем интерфейсаКод ошибки, указывающий, было ли разрешение успешно; если разрешение было успешно, остающиеся параметры содержат допустимые данные
Полное доменное имя службы, подходящей для передачи функциям особого назначения, берущим полное доменное имя в качестве параметра
Имя хоста машины, предоставляющей услугу, подходящую для передачи
gethostbyname
илиDNSServiceQueryRecord
получить IP-адрес узлаНомер порта в сетевом порядке байтов, на котором служба принимает соединения
Длина TXT записывает для службы
Основные TXT записывают для службы в стандартном формате записи TXT (т.е. байт длины, сопровождаемый данными, сопровождаемыми байтом длины, сопровождаемым данными, и т.д.)
Определяемая пользователем контекстная информация, переданная
DNSServiceResolve
Ваш цикл выполнения или select
цикл будет уведомлен для каждого интерфейса, в котором служба разрешена и для каждой записи TXT, связанной со службой.
Когда желаемые результаты были получены, необходимо завершить разрешение. Удалите дескриптор сокета из цикла выполнения или select
цикл и вызов DNSServiceRefDeallocate
, передача ему ссылка открытия службы, инициализированная когда DNSServiceResolve
был вызван. Ссылка открытия службы лишена законной силы, и память, связанная со ссылкой, освобождена. Сокет, лежащий в основе соединения с mDNSResponder
демон закрывается, таким образом завершая соединение Вашего приложения с демоном.