Регистрация и завершение службы
Когда Ваша служба запускает, необходимо зарегистрироваться в mDNSResponder
демон так, чтобы приложения могли обнаружить Вашу службу. Этот раздел обеспечивает общий обзор процесса, сопровождаемого рядом поэтапных инструкций.
Регистрация службы
Для регистрации службы вызвать DNSServiceRegister
. Параметры для совершения этого звонка состоят из следующего:
Неинициализированная ссылка открытия службы.
Индекс для интерфейса, на который Вы хотите зарегистрировать свою службу; передача
0
зарегистрироваться во всех доступных интерфейсах, передаче–1
для регистрации на локальной машине только (служба не будет доступна удаленным узлам), или передают число, представляющее интерфейс, в котором Вы хотите зарегистрироваться (используйтеif_nametoindex
семья вызовов для получения числа).Флаги, указывающие, как Вы хотите обработать конфликты имен. По умолчанию,
(
n)
автоматически добавляется к Вашему имени службы, где n является числом, если происходит конфликт имен. Для переопределения этого поведения установитеkDNSServiceFlagsNoAutoRename
флаг, который заставит Вашу регистрационную функцию обратного вызова быть вызванной так, чтобы можно было обработать конфликты имен.kDNSServiceFlagsNoAutoRename
флаг только допустим при также явном указании имени службы.Имя службы; можно указать
NULL
использовать имя компьютера в качестве имени службы.Тип регистрации службы.
Имя целевого узла SRV; обычно, Вы передадите
NULL
использовать имя хоста компьютера по умолчанию. ПередачаNULL
желаемое поведение в почти каждом случае. Однако приложения прокси могут передать явную цель SRV кроме имени хоста компьютера.Номер порта в сетевом порядке байтов, на котором служба принимает соединения. Передача
0
поскольку порт регистрирует службу заполнителя. Со службой заполнителя служба не будет обнаружена путем просмотра, но конфликт имен произойдет, если другой клиент попытается зарегистрировать то же имя. Большинство приложений не должно использовать службу заполнителя.Функция обратного вызова, которую нужно вызвать для предоставления информации об успешности или неуспешности регистрации, или
NULL
.Определяемое пользователем значение контекста, которое будет передано функции обратного вызова, когда это вызовут, или
NULL
.
Службы, требующие записей TXT также, передают необработанные данные записи TXT и длину необработанных данных как параметры. Большинство служб не нуждается в записях TXT и поэтому передает NULL
и 0
, соответственно, для этих параметров.
Вместо того, чтобы обеспечить функцию обратного вызова, можно передать NULL
, когда, Вы не будете уведомлены относительно значений по умолчанию, которые могут быть выбраны от Вашего имени, и Вы не будете уведомлены относительно никаких асинхронных ошибок, которые могут предотвратить регистрацию Вашей службы. Если Вы передаете NULL
для этого параметра Вы не можете передать kDNSServiceFlagsNoAutoRename
как флаговый параметр. Можно вычеркнуть из списка службу, регистрирующуюся без функции обратного вызова нормальным способом путем вызова DNSServiceRefDeallocate
.
Если регистрация может быть запущена, DNSServiceRegister
инициализирует ссылку открытия службы и создает сокет, использующийся для передачи с mDNSResponder
демон. Используйте ссылку открытия службы на вызов DNSServiceRefSockFD
и получите дескриптор сокета для ссылки службы.
Установите выполнение или select
цикл с помощью дескриптора сокета. Когда цикл указывает что mDNSResponder
ответ демона доступен, вызвать DNSServiceProcessResult
и передайте ему ссылку открытия службы, инициализированную DNSServiceRegister
. DNSServiceProcessResult
вызовет функцию обратного вызова, связанную со ссылкой открытия службы.
Вместо того, чтобы настроить цикл выполнения или a select
цикл, можно вызвать DNSServiceRegister
и сразу вызовите DNSServiceProcessResult
. DNSServiceProcessResult
функция блокирует до mDNSResponder
у демона есть ответ, при котором времени обратный вызов указал когда DNSServiceRegister
был вызван (если таковые имеются), будет вызван.
В дополнение к ссылке открытия службы и флагам, в настоящее время не использующимся, Ваш обратный вызов вызовут со следующими параметрами:
Код ошибки, указывающий, была ли регистрация успешна; если регистрация была успешна, остающиеся параметры содержат допустимые данные
Имя службы, как передано
DNSServiceRegister
или имя, выбранное еслиNULL
был переданDNSServiceRegister
как имя службыТип регистрации, как передано
DNSServiceRegister
Домен, в котором была зарегистрирована служба
Определяемая пользователем контекстная информация, переданная
DNSServiceRegister
Если комбинация имени службы, типа регистрации и доменного имени привела к полному доменному имени, которое уже находится в локальном использовании, и Вы указали kDNSServiceFlagsNoAutoRename
, необходимо будет освободить ссылку открытия службы, выбрать другое имя службы и попробовать еще раз, пока локально уникальное имя не может быть зарегистрировано.
После успешной регистрации о Вашей службе объявляют локальной сети, и ее информация о доступе (IP-адрес, порт, и т.д.) может быть найдена с помощью, многоадресно передает DNS, или по имени или путем просмотра для служб. Используя инициализированную ссылку открытия службы, можно связаться с mDNSResponder
демон для добавления записи на информацию о регистрации для службы обновите добавленную запись или удалите добавленную запись, в то время как работает служба. Однако Вы никогда не должны будете, вероятно, вносить изменения в свою информацию о регистрации, потому что Добрый день обрабатывает общие падежи, такие как пробуждение, сон, закрытие и изменение IP-адресов.
Редкое исключение было бы потребностью обновить текстовую запись, связанную со службой. Если бы текстовое поле содержит имя очереди, например, и смены имени очереди, необходимо было бы обновить текстовую запись для службы.
Необходимо сохранить дескриптор сокета на цикле выполнения или select
цикл, пока Вы ожидаете, что будет вызвана Ваша функция обратного вызова.
Завершение регистрации службы
Для завершения регистрации службы удалите дескриптор сокета из цикла выполнения или select
цикл и вызов DNSServiceRefDeallocate
, передача ему ссылка открытия службы, инициализированная, когда была зарегистрирована Ваша служба. В дополнение к лишению законной силы ссылки открытия службы и освобождению памяти, связанной с ним, вычеркнуты из списка любые добавленные ресурсные записи, и их ссылки лишены законной силы. Сокет, лежащий в основе соединения с mDNSResponder
демон закрывается, таким образом завершая соединение Вашего приложения с демоном.