Разрешение текущего адреса службы
Эта статья описывает, как использовать 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 демон закрывается, таким образом завершая соединение Вашего приложения с демоном.