Разрешение текущего адреса службы

Эта статья описывает, как использовать DNSServiceResolve для получения информации о службе на основе ее имени введите, и домен.

Используя DNSServiceResolve

Как только у Вас есть имя, тип регистрации и домен службы, можно получить информацию о службе, такой как интерфейс (ы), в котором служба регистрируется, полное доменное имя службы, имя узла, предоставляющего услугу и содержание основной записи TXT службы, путем вызова DNSServiceResolve.

Для разрешения имени службы к его имени хоста и порту вызвать DNSServiceResolve. Параметры для совершения этого звонка состоят из следующего:

Если разрешение может быть запущено, DNSServiceResolve инициализирует ссылку открытия службы и создает сокет, использующийся для передачи с mDNSResponder демон. Используйте ссылку открытия службы на вызов DNSServiceRefSockFD и получите дескриптор сокета для сокета.

Установка функции обратного вызова

Если DNSServiceResolve безошибочные возвраты, Вы должны иметь mDNSResponder разрешите ссылку открытия службы и выполните функцию обратного вызова, когда она получит ответ. Существует два метода для установки функции обратного вызова: асинхронно и синхронно.

Получить ответ от mDNSResponder асинхронно, установите выполнение или a select цикл с помощью дескриптора сокета. Цикл будет уведомлен каждый раз, когда ответ от mDNSResponder демон становится доступным. Когда цикл указывает, что ответ доступен, вызвать DNSServiceProcessResult и передайте ему ссылку открытия службы, инициализированную DNSServiceResolve. DNSServiceProcessResult вызовет функцию обратного вызова, связанную со ссылкой открытия службы. mDNSResponder демон обеспечит ответ для каждой службы, которую он разрешает на основе на интерфейс.

Если Вы хотите выполнить функцию обратного вызова синхронно вместо того, чтобы настроить цикл выполнения или a select цикл, можно вызвать DNSServiceResolve и сразу вызовите DNSServiceProcessResult. DNSServiceProcessResult функция блокирует до mDNSResponder у демона есть ответ, при котором времени обратный вызов указал когда DNSServiceResolve был вызван будет вызван. Этот весь процесс должен, вероятно, быть выполнен в собственном цикле для каждой службы, которую Вы хотите разрешить.

В дополнение к ссылке открытия службы и флагам, в настоящее время не использующимся, Ваш обратный вызов вызовут со следующими параметрами:

Ваш цикл выполнения или select цикл будет уведомлен для каждого интерфейса, в котором служба разрешена и для каждой записи TXT, связанной со службой.

Когда желаемые результаты были получены, необходимо завершить разрешение. Удалите дескриптор сокета из цикла выполнения или select цикл и вызов DNSServiceRefDeallocate, передача ему ссылка открытия службы, инициализированная когда DNSServiceResolve был вызван. Ссылка открытия службы лишена законной силы, и память, связанная со ссылкой, освобождена. Сокет, лежащий в основе соединения с mDNSResponder демон закрывается, таким образом завершая соединение Вашего приложения с демоном.