Ссылка открытия C службы DNS
Наследование
Не применимый
Соответствует
Не применимый
Оператор импорта
Не применимый не применимый
Включенные заголовки
<sys/types.h>
<sys/types.h>
"Tiano.h"
<windows.h>
<stdint.h>
<dispatch/dispatch.h>
-
Отображает исходный порт локального сокета UDP, открытого для отправки запроса DNS процессу ID приложения, инициировавшего разрешение DNS.
Объявление
Objective C
DNSServiceErrorType DNSServiceGetPID ( uint16_t srcport, int32_t *pid );
Параметры
srcport
Исходный порт (в сетевом порядке байтов) сокета UDP, создававшегося mDNSResponder для отправки запроса DNS на проводе.
pid
Обработайте ID приложения, запустившего определение имен, инициировавшее mDNSResponder для отправки запроса на проводе. Если srcport не может быть отображен, значение может быть-1.
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе, илиkDNSServiceErr_ServiceNotRunning
если не работает демон. Если возвращаемое значение имеет ошибку, значение изодромного с предварением не определено. -
Получает указанное свойство службы.
Объявление
Objective C
DNSServiceErrorType DNSServiceGetProperty ( const char *property, /* Requested property (e.g. {@ link kDNSServiceProperty_DaemonVersion}) */ void *result, /* Pointer to place to store result */ uint32_t *size /* size of result location */ );
Параметры
property
Требуемое свойство. В настоящее время единственное определенное свойство
kDNSServiceProperty_DaemonVersion
.result
Поместите для хранения результата. Для получения DaemonVersion это должно быть адресом uint32_t.
size
Указатель на uint32_t, содержащий размер расположения результата. Для получения DaemonVersion это должно быть sizeof (uint32_t). По возврату uint32_t обновляется к размеру возвращенных данных. Для DaemonVersion возвращенный размер всегда sizeof (uint32_t), но будущие свойства могли быть определены который результаты размера возвращаемой переменной.
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе, илиkDNSServiceErr_ServiceNotRunning
если не работает демон (или «системная служба» на Windows).
-
Читает ответ от демона, вызывая надлежащий обратный вызов приложения.
Объявление
Objective C
DNSServiceErrorType DNSServiceProcessResult ( DNSServiceRef sdRef );
Параметры
sdRef
DNSServiceRef, инициализированный любым из вызовов DNSService, берущих параметр обратного вызова.
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе, иначе возвращает код ошибки, указывающий произошедший определенный отказ.Обсуждение
Этот вызов блоки до ответа демона принимается. Использовать
DNSServiceRefSockFD
в сочетании с циклом выполнения или выбором () для определения присутствия ответа от сервера прежде, чем вызвать эту функцию для обработки ответа без блокирования. Вызовите эту функцию в любой точке, если приемлемо блокировать, пока ответ демона не наступает. Обратите внимание на то, что клиент ответственен за обеспечение этогоDNSServiceProcessResult
вызывается каждый раз, когда существует ответ от демона - демон может завершить его соединение с клиентом, не обрабатывающим ответы демона. -
Завершает соединение с демоном и освобождает память, связанную с DNSServiceRef.
Объявление
Objective C
void DNSServiceRefDeallocate ( DNSServiceRef sdRef );
Параметры
sdRef
DNSServiceRef инициализируется любым из вызовов DNSService.
Обсуждение
Любые службы или записи, зарегистрированные в этом DNSServiceRef, будут вычеркнуты из списка. Любой Обзор, Решение или операции Query, вызванные с этой ссылкой, будут завершены.
Примечание: Если базовый сокет ссылки используется в цикле выполнения или выборе () вызов, это должен быть удаленный BEFORE
DNSServiceRefDeallocate
вызывается, поскольку эта функция закрывает сокет ссылки.Примечание: Если ссылка была инициализирована с
DNSServiceCreateConnection
, любой DNSRecordRefs, создаваемый через эту ссылку, будет лишен законной силы этим вызовом - ресурсные записи вычеркнуты из списка, и их DNSRecordRefs не может использоваться в последующих функциях. Точно так же, если ссылка была инициализирована сDNSServiceRegister
, и дополнительная ресурсная запись была добавлена к службе черезDNSServiceAddRecord
, DNSRecordRef, создаваемый добавить вызовом, лишен законной силы, когда эта функция вызвана - DNSRecordRef не может использоваться в последующих функциях.Примечание: Этот вызов должен использоваться только с DNSServiceRef, определенным этим API.
-
Доступы, лежащие в основе домена Unix, снабжают сокетом для инициализированного DNSServiceRef.
Объявление
Objective C
int DNSServiceRefSockFD ( DNSServiceRef sdRef );
Параметры
sdRef
DNSServiceRef инициализируется любым из вызовов DNSService.
Возвращаемое значение
Базовый дескриптор сокета DNSServiceRef, или-1 на ошибке.
Обсуждение
Реализация Открытия Службы DNS использует этот сокет для передачи между клиентом и mDNSResponder демоном. Приложение не ДОЛЖНО непосредственно читать из или писать в этот сокет. Доступ к сокету предоставлен так, чтобы это могло использоваться в качестве kqueue источника события, источника события CFRunLoop, в выборе () цикл, и т.д. Когда базовая подсистема управления событиями (kqueue/select/CFRunLoop и т.д.) указывает клиенту, что данные доступны для чтения на сокете, клиент должен вызвать
DNSServiceProcessResult
, который извлечет ответ демона из сокета и передаст его надлежащему обратному вызову приложения. При помощи цикла выполнения или выбора (), следует из демона, может быть обработан асинхронно. Также клиент может принять решение разветвить поток и иметь его вызов цикла «DNSServiceProcessResult (касательно)»; ЕслиDNSServiceProcessResult
вызывается, когда никакие данные не будут доступны для чтения на сокете, оно блокирует, пока данные действительно не становятся доступными, и затем обрабатывают данные и возвращаются к вызывающей стороне. Когда данные поступают в сокет, клиент ответственен за вызов DNSServiceProcessResult (касательно) своевременно - если клиент позволяет большой задолженности данных расти, демон может завершить соединение.
-
Запросы для IP-адреса имени хоста или при помощи Многоадресной передачи или при помощи Одноадресной передачи DNS.
Объявление
Objective C
DNSServiceErrorType DNSServiceGetAddrInfo ( DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceProtocol protocol, const char *hostname, DNSServiceGetAddrInfoReply callBack, void *context /* may be NULL */ );
Параметры
sdRef
Указатель на неинициализированный DNSServiceRef. Если вызов успешно выполняется тогда, он инициализирует DNSServiceRef, возвраты
kDNSServiceErr_NoError
, и запрос начинается и продлится неопределенно, пока клиент не завершает запрос путем передачи этого DNSServiceRefDNSServiceRefDeallocate
.flags
kDNSServiceFlagsForceMulticast
илиkDNSServiceFlagsLongLivedQuery
. ПередачаkDNSServiceFlagsLongLivedQuery
создать «долгосрочный» одноадресный запрос к одноадресной передаче сервер DNS, реализующий протокол. Этот флаг не имеет никакого эффекта на локальные для ссылки многоадресные запросы.interfaceIndex
Интерфейс, по которому можно выпустить запрос. Передача 0 причин запрос, который будет отправлен во всех активных интерфейсах через Многоадресную передачу или основном интерфейсе через Одноадресную передачу.
protocol
Передача в
kDNSServiceProtocol_IPv4
искать адреса IPv4, илиkDNSServiceProtocol_IPv6
искать адреса IPv6 или обоих для поиска обоих видов. Если никакой флаг не будет установлен, то система применит интеллектуальную эвристику, которая (в настоящее время) является, что это попытается искать обоих, кроме:*, Если «имя хоста» является глобальной одноадресной передачей имя хоста DNS (т.е. не «.local». имя), но этот узел не имеет никакого routable адреса IPv6, тогда вызов не попытается искать адреса IPv6 для «имени хоста», так как любые адреса, которые это нашло, вряд ли будут иметь любое применение так или иначе. Точно так же, если этот узел не будет иметь никакого routable адреса IPv4, то вызов не попытается искать адреса IPv4 для «имени хоста».
hostname
Полностью определенное доменное имя узла, который будет запрошен для.
callBack
Функция, которую вызовут, когда запрос успешно выполняется или перестал работать асинхронно.
context
Указатель контекста приложения, передающийся функции обратного вызова (может быть NULL).
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе (любые последующие, асинхронные ошибки поставлены обратному вызову), иначе возвращает код ошибки, указывающий произошедшую ошибку.
Типичная вызывающая последовательность для парсинга записи TXT - что-то как:
Получите данные записи TXT в DNSServiceResolve
обратный вызов
if (TXTRecordContainsKey(txtLen, txtRecord, "key")) then do something
val1ptr = TXTRecordGetValuePtr(txtLen, txtRecord, "key1", &len1);
val2ptr = TXTRecordGetValuePtr(txtLen, txtRecord, "key2", &len2);
...
memcpy(myval1, val1ptr, len1);
memcpy(myval2, val2ptr, len2);
...
return;
Если Вы хотите сохранить значения после возврата из DNSServiceResolve
обратный вызов, тогда необходимо скопировать данные в собственное хранение с помощью memcpy () или подобный, как показано в примере выше.
Если по некоторым причинам необходимо проанализировать запись TXT, Вы создали себя с помощью функций конструкции записи TXT выше, то можно сделать то использование вызовы TXTRecordGetBytesPtr и TXTRecordGetLength: TXTRecordGetValue (TXTRecordGetLength (x), TXTRecordGetBytesPtr (x), ключ, &len);
Большинство приложений только выбирает ключи, о которых они знают от TXT, записывают и игнорируют остальных. Однако некоторые средства отладки хотят выбрать и вывести на экран все ключи. Чтобы сделать это, используйте TXTRecordGetCount () и TXTRecordGetItemAtIndex () вызовы.
-
Создайте соединение делегата с демоном, позволяющим эффективную регистрацию многократных отдельных записей.
Объявление
Objective C
DNSServiceErrorType DNSServiceCreateDelegateConnection ( DNSServiceRef *sdRef, int32_t pid, uuid_t uuid );
Параметры
sdRef
Указатель на неинициализированный DNSServiceRef. Освобождение ссылки (через DNSServiceRefDeallocate ()) разъединяет соединение и вычеркивает из списка все записи, зарегистрированные на этом соединении.
pid
Обработайте ID делегата
uuid
UUID делегата
Обратите внимание на то, что только один из этих двух параметров (изодромный с предварением или uuid) может быть указан. Если изодромный с предварением нуль, uuid, как будет предполагаться, будет допустимым значением; иначе изодромный с предварением будет использоваться.
Возвращаемое значение
Возвраты kDNSServiceErr_NoError на успехе, иначе возвращает код ошибки, указывающий определенный отказ, произошедший (когда DNSServiceRef не инициализируется). kDNSServiceErr_NotAuth возвращается, чтобы указать, что обработка вызовов не имеет прав для использования этого API.
-
Позволяет Вам планировать DNSServiceRef на последовательную очередь отгрузки для получения асинхронных обратных вызовов.
Объявление
Objective C
DNSServiceErrorType DNSServiceSetDispatchQueue ( DNSServiceRef service, dispatch_queue_t queue );
Параметры
service
DNSServiceRef, выделенный и возвратившийся к приложению, когда приложение вызывает один из API DNSService.
queue
очередь отгрузки, где будет запланирован обратный вызов приложения
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе. ВозвратыkDNSServiceErr_NoMemory
если это не может создать источник отгрузки ВозвратыkDNSServiceErr_BadParam
если параметрический усилитель службы недопустим, или параметрический усилитель очереди недопустимОбсуждение
Это - ответственность клиента гарантировать, что работает предоставленная очередь отгрузки.
Типовое приложение, использующее CFRunLoopRun или dispatch_main на его основном потоке, будет обычно планировать DNSServiceRefs на свою основную очередь (который всегда является последовательной очередью), использование «DNSServiceSetDispatchQueue (sdref, dispatch_get_main_queue ())»;
Если будет ошибка во время обработки событий, то обратный вызов приложения вызовут с кодом ошибки. Для общих соединений каждый подчиненный DNSServiceRef получит свой собственный ошибочный обратный вызов. В настоящее время эти ошибочные обратные вызовы только происходят, если mDNSResponder демон вручную завершается или отказывает, и код ошибки в этом случае
kDNSServiceErr_ServiceNotRunning
. Приложение должно вызвать DNSServiceRefDeallocate для освобождения DNSServiceRef, когда это получает такой код ошибки. Эти ошибочные обратные вызовы редки и не должны обычно происходить на машинах клиента, но код приложения должен быть записан защитно для обработки таких ошибочных обратных вызовов корректно, если они происходят.После использования DNSServiceSetDispatchQueue на DNSServiceRef, вызывая DNSServiceProcessResult на том же DNSServiceRef приведет к неопределенному поведению и должен избежаться.
Как только приложение успешно планирует DNSServiceRef на последовательное использование очереди отгрузки DNSServiceSetDispatchQueue, оно не может удалить DNSServiceRef из очереди отгрузки или использовать DNSServiceSetDispatchQueue во второй раз для планирования DNSServiceRef на различную последовательную очередь отгрузки. После того, как запланированный на очередь отгрузки DNSServiceRef поставит события той очереди, пока приложение больше не потребует, чтобы работа и завершила его использование DNSServiceRefDeallocate.
-
Позволяет Вам определять, содержит ли данная Запись TXT указанный ключ.
Объявление
Objective C
int TXTRecordContainsKey ( uint16_t txtLen, const void *txtRecord, const char *key );
Параметры
txtLen
Размер полученной Записи TXT.
txtRecord
Указатель на полученные байты Записи TXT.
key
Завершенная нулем строка ASCII, содержащая ключевое имя.
Возвращаемое значение
Возвраты 1, если Запись TXT содержит указанный ключ. Иначе, это возвращается 0.
-
Возвращает число ключей, сохраненных в Записи TXT.
Объявление
Objective C
uint16_t TXTRecordGetCount ( uint16_t txtLen, const void *txtRecord );
Параметры
txtLen
Размер полученной Записи TXT.
txtRecord
Указатель на полученные байты Записи TXT.
Возвращаемое значение
Возвращает общее количество ключей в Записи TXT.
Обсуждение
Количество может использоваться с TXTRecordGetItemAtIndex () для итерации через ключи.
-
Позволяет Вам получать ключевое имя и указатель значения, учитывая индекс в Запись TXT.
Объявление
Objective C
DNSServiceErrorType TXTRecordGetItemAtIndex ( uint16_t txtLen, const void *txtRecord, uint16_t itemIndex, uint16_t keyBufLen, char *key, uint8_t *valueLen, const void **value );
Параметры
txtLen
Размер полученной Записи TXT.
txtRecord
Указатель на полученные байты Записи TXT.
itemIndex
Индекс в Запись TXT.
keyBufLen
Размер строкового предоставляемого буфера.
key
Строковый буфер раньше хранил ключевое имя. По возврату буфер содержит завершенную нулем струну до, дающую ключевое имя. Ключи DNS-SD TXT обычно являются 9 символами или меньше. Для содержания максимального возможного ключевого имени буфер должен быть 256 байтов длиной.
valueLen
На выводе, будет установлен в размер данных «значения».
value
На выводе *значение установлено указать на расположение в байтах Записи TXT, содержащее данные значения.
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе. ВозвратыkDNSServiceErr_NoMemory
если keyBufLen слишком короток. ВозвратыkDNSServiceErr_Invalid
если индекс больше, чем TXTRecordGetCount ()-1.Обсуждение
Юридический индекс оценивает диапазон от нуля до TXTRecordGetCount ()-1. Также возможно выполнить итерации через ключи в записи TXT путем простого вызова TXTRecordGetItemAtIndex () неоднократно, начала с индексного нуля и увеличения до TXTRecordGetItemAtIndex () возвраты
kDNSServiceErr_Invalid
.По возврату:
Для ключей без значения *устанавливается в NULL значение, и *valueLen является нулем.
Для ключей с пустым значением *значением является не-NULL, и *valueLen является нулем.
Для ключей с непустым значением *значением является не-NULL, и *valueLen является ненулевым.
-
Позволяет Вам получать значение для данного ключа от Записи TXT.
Объявление
Objective C
const void * TXTRecordGetValuePtr ( uint16_t txtLen, const void *txtRecord, const char *key, uint8_t *valueLen );
Параметры
txtLen
Размер полученной Записи TXT
txtRecord
Указатель на полученные байты Записи TXT.
key
Завершенная нулем строка ASCII, содержащая ключевое имя.
valueLen
На выводе, будет установлен в размер данных «значения».
Возвращаемое значение
Возвраты NULL, если ключ не существует в этой записи TXT или существует без значения (для дифференциации между этими двумя случаями используют TXTRecordContainsKey ()). Указатель возвратов на расположение в байтах Записи TXT, если ключ существует с пустым или непустым значением. Для пустого значения valueLen будет нулем. Для непустого значения valueLen будет длиной данных значения.
-
Создает новый пустой TXTRecordRef, ссылающийся на указанное хранение.
Объявление
Objective C
void TXTRecordCreate ( TXTRecordRef *txtRecord, uint16_t bufferLen, void *buffer );
Параметры
txtRecord
Указатель на неинициализированный TXTRecordRef.
bufferLen
Размер хранения обеспечил в «буферном» параметре.
buffer
Дополнительное предоставленное вызывающую сторону хранение раньше содержало данные TXTRecord. Это хранение должно остаться допустимым столько, сколько TXTRecordRef.
Обсуждение
Если буферным параметром будет NULL, или указанный размер ресурса хранения не является достаточно большим для удержания клавиши впоследствии добавленное использование TXTRecordSetValue (), то дополнительная память будет добавлена по мере необходимости с помощью malloc ().
На некоторых платформах, когда память является низкой, malloc () может перестать работать. В этом случае TXTRecordSetValue () возвратится
kDNSServiceErr_NoMemory
, и это состояние ошибки должно будет быть обработано как надлежащее вызывающей стороной.Можно избежать потребности обработать это состояние ошибки, если Вы гарантируете, что хранение, которое Вы первоначально обеспечиваете, является достаточно большим для содержания всех пар ключ/значение, которые должны быть добавлены к записи. Вызывающая сторона может предварительно вычислить точную длину, требуемую для всех пар ключ/значение быть добавленной, или просто обеспечить буфер фиксированного размера, который, как известно заранее, был достаточно большим.
Ключ (только для ключа) без значений требует (1 + длина ключа) байтов.
Ключ с пустым значением требует (1 + длина ключа + 1) байтов.
Ключ с непустым значением требует (1 + длина ключа + 1 + длина значения).
Для большинства приложений DNS-SD записи TXT обычно - меньше чем 100 байтов, таким образом, в большинстве случаев простой 256-байтовый буфер фиксированного размера будет более, чем достаточен.
Рекомендуемые пределы размера для DNS-SD Записи TXT обсуждены в dns-sd.org
Примечание: Когда передающие параметры к и от этих TXT записывают APIs, ключевое имя не включает '=' символ. '=' символ является разделителем между ключом и значением в на-проводном формате пакета; это не часть или ключа или значения.
-
Высвобождает средства, связанные с записью TXT.
Объявление
Objective C
void TXTRecordDeallocate ( TXTRecordRef *txtRecord );
Параметры
txtRecord
TXTRecordRef, инициализированный путем вызова TXTRecordCreate ().
Обсуждение
Высвобождает любые средства, выделенные в ходе подготовки Записи TXT использование TXTRecordCreate ()/TXTRecordSetValue ()/TXTRecordRemoveValue (). Владение буфера, предоставленного в TXTRecordCreate (), возвращается к клиенту.
-
Позволяет Вам получать указатель на необработанные байты в TXTRecordRef.
Объявление
Objective C
const void * TXTRecordGetBytesPtr ( const TXTRecordRef *txtRecord );
Параметры
txtRecord
TXTRecordRef, инициализированный путем вызова TXTRecordCreate ().
Возвращаемое значение
Возвращает указатель на необработанные байты в TXTRecordRef, которому можно передать непосредственно
DNSServiceRegister
или кDNSServiceUpdateRecord
. -
Позволяет Вам определять длину необработанных байтов в TXTRecordRef.
Объявление
Objective C
uint16_t TXTRecordGetLength ( const TXTRecordRef *txtRecord );
Параметры
txtRecord
TXTRecordRef, инициализированный путем вызова TXTRecordCreate ().
Возвращаемое значение
Возвращает размер необработанных байтов в TXTRecordRef, которому можно передать непосредственно
DNSServiceRegister
или кDNSServiceUpdateRecord
. Возвраты 0, если TXTRecordRef пуст. -
Удаляет ключ из TXTRecordRef.
Объявление
Objective C
DNSServiceErrorType TXTRecordRemoveValue ( TXTRecordRef *txtRecord, const char *key );
Параметры
txtRecord
TXTRecordRef, инициализированный путем вызова TXTRecordCreate ().
key
Ключевое имя. Это значение должно быть строкой ASCII, существующей в TXTRecordRef.
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе. ВозвратыkDNSServiceErr_NoSuchKey
если «ключ» не существует в TXTRecordRef. -
Добавляет ключ (дополнительно со значением) к TXTRecordRef.
Объявление
Objective C
DNSServiceErrorType TXTRecordSetValue ( TXTRecordRef *txtRecord, const char *key, uint8_t valueSize, /* may be zero */ const void *value /* may be NULL */ );
Параметры
txtRecord
TXTRecordRef, инициализированный путем вызова TXTRecordCreate ().
key
Завершенная нулем строка, только содержащая печатаемые значения ASCII (0x20-0x7E), исключая '=' (0x3D). Ключи должны быть 9 символами или меньше (не подсчет завершающегося нуля).
valueSize
Размер значения.
value
Любое двоичное значение. Для значений, представляющих текстовые данные, UTF-8 является рекомендуемый STRONGLY. Для значений, представляющих текстовые данные, valueSize не должен включать завершающийся нуль (если таковые имеются) в конце строки. ЕСЛИ НОЛЬ, тогда «ключ» будет добавлен без значения. Если не-NULL, но valueSize будет нулем, то «ключ =» будет добавлен с пустым значением.
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе. ВозвратыkDNSServiceErr_Invalid
если «ключевая» строка содержит запрещенные символы. ВозвратыkDNSServiceErr_NoMemory
если добавление этого ключа превысило бы доступное хранение.Обсуждение
Если «ключ» уже будет существовать в TXTRecordRef, то текущая стоимость будет заменена новым значением. Ключи могут существовать в четырех состояниях относительно данной записи TXT: - отсутствующий (ключ не появляется вообще) - Настоящее без значения («ключ» кажется одним) - Дарят пустое значение («ключ =», появляется в записи TXT) - Дарят непустое значение («key=value», появляется в записи TXT), для получения дополнительной информации отсылают к «Синтаксису данных для DNS-SD Записи TXT» в dns-sd.org
DNSServiceCreateConnection
, DNSServiceRegisterRecord
, DNSServiceReconfirmRecord
(большинство приложений не будет использовать их),
-
Создает соединение с демоном, позволяя эффективную регистрацию многократных отдельных записей.
Объявление
Objective C
DNSServiceErrorType DNSServiceCreateConnection ( DNSServiceRef *sdRef );
Параметры
sdRef
Указатель на неинициализированный DNSServiceRef. Освобождение ссылки (через
DNSServiceRefDeallocate
) разъединяет соединение и вычеркивает из списка все записи, зарегистрированные на этом соединении.Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе, иначе возвращает код ошибки, указывающий определенный отказ, произошедший (когда DNSServiceRef не инициализируется). -
Дает демону команду проверять законность ресурсной записи, которая, кажется, устарела (например, потому что соединение TCP к отказавшей цели службы).
Объявление
Objective C
DNSServiceErrorType DNSServiceReconfirmRecord ( DNSServiceFlags flags, uint32_t interfaceIndex, const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata );
Параметры
flags
Не в настоящее время используемый.
interfaceIndex
Указывает интерфейс рассматриваемой записи. Вызывающая сторона должна указать интерфейс. Этот API (проектом) вызывает увеличенный сетевой трафик, таким образом, это требует, чтобы вызывающая сторона была точна, о котором должна быть подтверждена запись. Не возможно передать нуль для интерфейсного индекса для выполнения «подстановочного» подтверждения, где *все* подтверждено соответствие записей.
fullname
Полное доменное имя ресурсной записи.
rrtype
Тип ресурсной записи (например.
kDNSServiceType_PTR
,kDNSServiceType_SRV
, и т.д.).rrclass
Класс ресурсной записи (обычно
kDNSServiceClass_IN
).rdlen
Длина, в байтах, ресурсной записи rdata.
rdata
Сырые данные rdata ресурсной записи.
-
Регистрирует отдельную ресурсную запись на связанном DNSServiceRef.
Объявление
Objective C
DNSServiceErrorType DNSServiceRegisterRecord ( DNSServiceRef sdRef, DNSRecordRef *RecordRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, DNSServiceRegisterRecordReply callBack, void *context /* may be NULL */ );
Параметры
sdRef
DNSServiceRef, инициализированный
DNSServiceCreateConnection
.RecordRef
Указатель на неинициализированный DNSRecordRef. После succesfull завершения этого вызова это касательно может быть передано
DNSServiceUpdateRecord
илиDNSServiceRemoveRecord
. (Чтобы вычеркнуть из списка записи ALL, зарегистрированные на единственном связанном DNSServiceRef и освободить каждый из их соответствующих DNSServiceRecordRefs, вызватьDNSServiceRefDeallocate
).flags
Возможные значения
kDNSServiceFlagsShared
илиkDNSServiceFlagsUnique
(см. определения типа флага для подробных данных).interfaceIndex
Если ненулевой, указывает интерфейс, в котором можно зарегистрировать запись (индекс для данного интерфейса определяется через if_nametoindex () семья вызовов.) Передача 0 причин запись, которая будет зарегистрирована во всех интерфейсах. См. «Константы для указания интерфейсного индекса» для большего количества подробных данных.
fullname
Полное доменное имя ресурсной записи.
rrtype
Числовой тип ресурсной записи (например.
kDNSServiceType_PTR
,kDNSServiceType_SRV
, и т.д.).rrclass
Класс ресурсной записи (обычно
kDNSServiceClass_IN
)rdlen
Длина, в байтах, rdata.
rdata
Указатель на сырые данные rdata, как это должно появиться в записи DNS.
ttl
Время жизни ресурсной записи, в секундах. Большинство клиентов должно передать 0, чтобы указать, что система должна выбрать разумное значение по умолчанию.
callBack
Функция, которую вызовут, когда результат найден, или если вызов асинхронно перестал работать (например, из-за конфликта имен.)
context
Указатель контекста приложения, передающийся функции обратного вызова (может быть NULL).
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе (любые последующие, асинхронные ошибки поставлены обратному вызову), иначе возвращает код ошибки, указывающий ошибку, произошедшую (обратный вызов никогда не вызывается, и DNSRecordRef не инициализируется).Обсуждение
Обратите внимание на то, что конфликты имен, происходящие для записей, зарегистрированных через этот вызов, должны быть обработаны клиентом в обратном вызове.
-
Выпуски ресурсы соединений P2P связались с экземпляром службы.
Объявление
Objective C
DNSServiceErrorType PeerConnectionRelease ( DNSServiceFlags flags, const char *name, const char *regtype, const char *domain );
Обсуждение
Когда служба разрешена по интерфейсу P2P, соединение принесено до коллеги, распространяющей экземпляр службы. Этот вызов освободит ресурсы, связанные с тем соединением. В то время как обзор для типа службы все еще работает, Обратите внимание на то, что ссылка на экземпляр службы будет только сохраняться mDNSResponder демоном. Таким образом последовательность вызовов для обнаружения решите, и затем завершитесь, соединение, связанное с приведенным примером службы P2P, было бы:
DNSServiceRef BrowseRef, ResolveRef; DNSServiceBrowse (&BrowseRef...)//обзор для всех экземпляров службы DNSServiceResolve (&ResolveRef...)//разрешение экземпляра службы создает//соединение с удаленным устройством, распространяя ту службу DNSServiceRefDeallocate (ResolveRef)//Остановка решение, не закрывающее одноранговое подключение
//Свяжитесь с равноправным приложением.
PeerConnectionRelease ()//выпускают соединение с удаленным устройством для указанного экземпляра службы
DNSServiceRefDeallocate (BrowseRef)//останавливают обзор//, Дальнейшие вызовы к PeerConnectionRelease () не будут иметь никакого влияния начиная с//, экземпляр службы к отношению однорангового подключения только сохраняется//mDNSResponder демон, в то время как работает обзор.
флаги: Не в настоящее время используемый.
имя: имя экземпляра службы, который будет разрешен, как сообщается
DNSServiceBrowseReply
обратный вызов.regtype: тип экземпляра службы, который будет разрешен, как сообщается
DNSServiceBrowseReply
обратный вызов.домен: домен экземпляра службы, который будет разрешен, как сообщается
DNSServiceBrowseReply
обратный вызов.возвращаемое значение: Возвраты
kDNSServiceErr_NoError
на произошедшей успехе или ошибке.
-
Добавляет запись на зарегистрированную службу.
Объявление
Objective C
DNSServiceErrorType DNSServiceAddRecord ( DNSServiceRef sdRef, DNSRecordRef *RecordRef, DNSServiceFlags flags, uint16_t rrtype, uint16_t rdlen, const void *rdata, uint32_t ttl );
Параметры
sdRef
DNSServiceRef, инициализированный
DNSServiceRegister
.RecordRef
Указатель на неинициализированный DNSRecordRef. После succesfull завершения этого вызова это касательно может быть передано
DNSServiceUpdateRecord
илиDNSServiceRemoveRecord
. Если вышеупомянутый DNSServiceRef передаетсяDNSServiceRefDeallocate
, RecordRef также лишен законной силы и не может использоваться далее.flags
В настоящее время игнорируемый, зарезервированный для будущего использования.
rrtype
Тип записи (например.
kDNSServiceType_TXT
,kDNSServiceType_SRV
, и т.д.).rdlen
Длина, в байтах, rdata.
rdata
Сырые данные rdata, чтобы содержаться в добавленной ресурсной записи.
ttl
Время жизни ресурсной записи, в секундах. Большинство клиентов должно передать 0, чтобы указать, что система должна выбрать разумное значение по умолчанию.
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе, иначе возвращает код ошибки, указывающий ошибку, произошедшую (RecordRef не инициализируется).Обсуждение
Имя записи совпадет с именем зарегистрированной службы. Запись может позже быть обновлена или вычеркнута из списка путем передачи RecordRef, инициализированного этой функцией к
DNSServiceUpdateRecord
илиDNSServiceRemoveRecord
.Обратите внимание на то, что DNSServiceAddRecord/UpdateRecord/RemoveRecord *НЕ* ориентированы на многопотоковое исполнение относительно единственного DNSServiceRef. Если Вы планируете иметь многократные потоки в своей программе, одновременно добавляют, обновляют или удаляют записи из того же DNSServiceRef, то это - ответственность вызывающей стороны использовать блокировку mutext или принять подобные надлежащие меры предосторожности для сериализации тех вызовов.
-
Регистрирует службу.
Объявление
Objective C
DNSServiceErrorType DNSServiceRegister ( DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *name, /* may be NULL */ const char *regtype, const char *domain, /* may be NULL */ const char *host, /* may be NULL */ uint16_t port, /* In network byte order */ uint16_t txtLen, const void *txtRecord, /* may be NULL */ DNSServiceRegisterReply callBack, /* may be NULL */ void *context /* may be NULL */ );
Параметры
sdRef
Указатель на неинициализированный DNSServiceRef. Если вызов успешно выполняется тогда, он инициализирует DNSServiceRef, возвраты
kDNSServiceErr_NoError
, и регистрация останется активной неопределенно, пока клиент не завершит ее путем передачи этого DNSServiceRefDNSServiceRefDeallocate
.interfaceIndex
Если ненулевой, указывает интерфейс, на который можно зарегистрировать службу (индекс для данного интерфейса определяется через if_nametoindex () семья вызовов.) Большинство приложений передаст 0 для регистрации во всех доступных интерфейсах. См. «Константы для указания интерфейсного индекса» для большего количества подробных данных.
flags
Указывает поведение переименования на конфликте имен (большинство приложений передаст 0). См. определения флага выше для подробных данных.
name
Если не-NULL, указывает имя службы, которое будет зарегистрировано. Большинство приложений не укажет имя, когда имя компьютера используется (это имя передается клиенту через обратный вызов). Если имя указано, это должны быть 1-63 байта текста UTF-8. Если имя будет более длинным, чем 63 байта, то это будет автоматически усеченным к юридической длине, если флаг NoAutoRename не будет установлен, когда
kDNSServiceErr_BadParam
будет возвращен.regtype
Тип службы, сопровождаемый протоколом, разделенным точкой (например, «_ftp. _ tcp»). Тип службы должен быть подчеркиванием, сопровождаемым 1-15 символами, которые могут быть буквами, цифрами или дефисами. Транспортный протокол должен быть «_tcp» или «_udp». Новые типы службы должны быть зарегистрированы в http://www .dns-sd.org/ServiceTypes.html.
Дополнительные подтипы основного типа службы (где тип службы определил подтипы) следуют за основным типом службы в списке разделенных запятой значений без дополнительных пробелов, например, «_primarytype. _ tcp, _subtype1, _subtype2, _subtype3» Подтипы обеспечивают механизм для отфильтрованного просмотра: клиент, просматривающий для «_primarytype. _ tcp» обнаружит все экземпляры этого типа; клиент, просматривающий для «_primarytype. _ tcp, _subtype2» обнаружит только те экземпляры, зарегистрированные в «_subtype2» в их списке зарегистрированных подтипов.
Механизм подтипа может быть проиллюстрирован с некоторыми примерами с помощью dns-sd инструмента командной строки:
% dns-sd-R Простой _test. _ tcp «» 1001 и % dns-sd-R Лучше _test. _ tcp, HasFeatureA «» 1002 и % dns-sd-R Лучший _test. _ tcp, HasFeatureA, HasFeatureB «» 1003 и
Теперь: % dns-sd-B _test. _ tcp # найдет все три % служб dns-sd-B _test. _ tcp, HasFeatureA # находит «Лучше» и «Лучший» % dns-sd-B _test. _ tcp, HasFeatureB # находит только «Лучше всего»
Метки подтипа могут быть 63 байта длиной, и могут содержать любые восемь - разрядные значения байта, включая нулевые байты. Однако вследствие природы использования Струны до базировал API, стандартный выход DNS должен использоваться для точек ('. '), запятые ('',), наклонные черты влево (' \') и нулевые байты, как показано ниже:
% dns-sd-R Тест '_test. _ tcp, s\.one, s \, два, s \\три, s\000four' локальные 123
Когда служба будет зарегистрирована, все клиенты, просматривающие для зарегистрированного типа («regtype»), обнаружат его. Если открытие должно быть ограничено меньшей группой известных коллег, служба может быть зарегистрирована в дополнительных данных (идентификатор группы), который известен только меньшей группе коллег. Идентификатор группы должен следовать за основным типом службы с помощью двоеточия (»: «) как разделитель. Если подтипы также присутствуют, это должно быть дано перед подтипом как показано ниже.
% dns-sd-R _test1 _http. _ tcp:mygroup1 локальный 1 001%-й dns-sd-R _test2 _http. _ tcp:mygroup2 локальный 1 001%-й dns-sd-R _test3 _http. _ tcp:mygroup3, HasFeatureA локальные 1001
Теперь: % dns-sd-B _http. _ tcp: «mygroup1» # обнаружит только test1% dns-sd-B _http. _ tcp: «mygroup2» # обнаружит только test2% dns-sd-B _http. _ tcp: «mygroup3», HasFeatureA # обнаружит только test3
Путем указания информации о группе только обнаружены элементы той группы.
Сам идентификатор группы не представляется ясный. Только хеш идентификатора группы отправляется, и клиенты обнаруживают их анонимно. Идентификатор группы может быть 256 байтов длиной и может содержать любые восемь битовых значений кроме запятой, которой нужно оставить.
domain
Если не-NULL, указывает домен, на который можно распространить службу. Большинство приложений не укажет домен, вместо этого автоматически регистрирующийся в домене (ах) по умолчанию.
host
Если не-NULL, указывает имя целевого узла SRV. Большинство приложений не укажет узел, вместо этого автоматически с помощью имени (ен) хоста машины по умолчанию. Обратите внимание на то, что указание узла не-NULL НЕ создает запись адреса для того узла - приложение ответственно за обеспечение, что надлежащая запись адреса существует, или создание его через
DNSServiceRegisterRecord
.port
Порт, в сетевом порядке байтов, на котором служба принимает соединения. Передайте 0 для службы «заполнителя» (т.е. служба, которая не будет обнаружена путем просмотра, но вызовет конфликт имен, если другой клиент попытается зарегистрировать то же самое имя). Большинство клиентов не будет использовать службы заполнителя.
txtLen
Длина txtRecord, в байтах. Если txtRecord является NULL, должен быть нуль.
txtRecord
TXT записывают rdata. Не-NULL txtRecord MUST быть должным образом отформатированным DNS запись TXT, т.е. <байт длины> <данные> <байт длины> <данные>... Передача NULL для txtRecord позволяется как синоним для txtLen=1, txtRecord = «», т.е. это создает запись TXT длины один содержащий единственную пустую строку. RFC 1035 не позволяет записи TXT содержать *нуль* строки, таким образом, единственной пустой строкой является самый маленький юридический DNS запись TXT. Как с другими параметрами, вызов DNSServiceRegister копирует txtRecord данные; например, если Вы выделили хранение для txtRecord параметра с malloc () тогда, можно безопасно освободить ту память прямо после возвратов вызова DNSServiceRegister.
callBack
Функция, которую вызовут, когда регистрация завершается или асинхронно перестала работать. Клиент MAY передает NULL для обратного вызова - клиент, НЕ будет уведомлен относительно значений по умолчанию, выбранных от своего лица, и клиент НЕ будет уведомлен относительно никаких асинхронных ошибок (например, из ошибок памяти, и т.д.), который может предотвратить регистрацию службы. Если обратным вызовом является NULL, клиент может НЕ передать флаг NoAutoRename. Клиент может все еще вычеркнуть из списка службу в любое время через
DNSServiceRefDeallocate
.context
Указатель контекста приложения, передающийся функции обратного вызова (может быть NULL).
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе (любые последующие, асинхронные ошибки поставлены обратному вызову), иначе возвращает код ошибки, указывающий ошибку, произошедшую (обратный вызов никогда не вызывается, и DNSServiceRef не инициализируется). -
Удаляет запись, ранее добавленную к набору служебной книжки через
DNSServiceAddRecord
, или вычеркните из списка запись, зарегистрированную индивидуально черезDNSServiceRegisterRecord
.Объявление
Objective C
DNSServiceErrorType DNSServiceRemoveRecord ( DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags );
Параметры
sdRef
DNSServiceRef, инициализированный
DNSServiceRegister
(если удаляемая запись была зарегистрирована черезDNSServiceAddRecord
) илиDNSServiceCreateConnection
(если удаляемая запись была зарегистрирована черезDNSServiceRegisterRecord
).RecordRef
DNSRecordRef, инициализированный успешным вызовом к
DNSServiceAddRecord
илиDNSServiceRegisterRecord
.flags
В настоящее время игнорируемый, зарезервированный для будущего использования.
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе, иначе возвращает код ошибки, указывающий произошедшую ошибку. -
Обновляет зарегистрированную ресурсную запись.
Объявление
Objective C
DNSServiceErrorType DNSServiceUpdateRecord ( DNSServiceRef sdRef, DNSRecordRef RecordRef, /* may be NULL */ DNSServiceFlags flags, uint16_t rdlen, const void *rdata, uint32_t ttl );
Параметры
sdRef
DNSServiceRef, инициализированный
DNSServiceRegister
илиDNSServiceCreateConnection
.RecordRef
DNSRecordRef, инициализированный
DNSServiceAddRecord
, или NULL для обновления основной записи txt службы.flags
В настоящее время игнорируемый, зарезервированный для будущего использования.
rdlen
Длина, в байтах, нового rdata.
rdata
Новый rdata, который будет содержаться в обновленной ресурсной записи.
ttl
Время жизни обновленной ресурсной записи, в секундах. Большинство клиентов должно передать 0, чтобы указать, что система должна выбрать разумное значение по умолчанию.
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе, иначе возвращает код ошибки, указывающий произошедшую ошибку.Обсуждение
Запись должна или быть:
- Основная txt запись службы зарегистрировалась через
DNSServiceRegister
- Запись добавила к зарегистрированной службе через
DNSServiceAddRecord
- Отдельная запись, зарегистрированная
DNSServiceRegisterRecord
-
Обзоры для доступных служб.
Объявление
Objective C
DNSServiceErrorType DNSServiceBrowse ( DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *regtype, const char *domain, /* may be NULL */ DNSServiceBrowseReply callBack, void *context /* may be NULL */ );
Параметры
sdRef
Указатель на неинициализированный DNSServiceRef. Если вызов успешно выполняется тогда, он инициализирует DNSServiceRef, возвраты
kDNSServiceErr_NoError
, и работа обзора будет работать неопределенно, пока клиент не завершит ее путем передачи этого DNSServiceRefDNSServiceRefDeallocate
.flags
В настоящее время игнорируемый, зарезервированный для будущего использования.
interfaceIndex
Если ненулевой, указывает интерфейс, в котором можно просмотреть для служб (индекс для данного интерфейса определяется через if_nametoindex () семья вызовов.) Большинство приложений передаст 0 для просмотра во всех доступных интерфейсах. См. «Константы для указания интерфейсного индекса» для большего количества подробных данных.
regtype
Тип службы, просматриваемый для сопровождаемого протоколом, разделенным точкой (например, «_ftp. _ tcp»). Транспортный протокол должен быть «_tcp» или «_udp». Клиент может дополнительно указать единственный подтип для выполнения отфильтрованного просмотра: например, просмотр для «_primarytype. _ tcp, _subtype» обнаружит только те экземпляры «_primarytype. _ tcp», которые были зарегистрированы, указав «_subtype» в их списке зарегистрированных подтипов. Кроме того, идентификатор группы может также быть указан перед подтипом, например, _primarytype. _ tcp:GroupID, который обнаружит только элементы, регистрирующие службу в GroupID. Дополнительную информацию см. в DNSServiceRegister.
domain
Если не-NULL, указывает домен, на котором можно просмотреть для служб. Большинство приложений не укажет домен, вместо этого просматривающий на домене (ах) по умолчанию.
callBack
Функция, которую вызовут, когда экземпляр службы, просматриваемой для, найден, или если вызов асинхронно перестал работать.
context
Указатель контекста приложения, передающийся функции обратного вызова (может быть NULL).
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе (любые последующие, асинхронные ошибки поставлены обратному вызову), иначе возвращает код ошибки, указывающий ошибку, произошедшую (обратный вызов не вызывается, и DNSServiceRef не инициализируется). -
Объявление
Objective C
DNSServiceErrorType DNSServiceResolve ( DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *name, const char *regtype, const char *domain, DNSServiceResolveReply callBack, void *context /* may be NULL */ );
Параметры
sdRef
Указатель на неинициализированный DNSServiceRef. Если вызов успешно выполняется тогда, он инициализирует DNSServiceRef, возвраты
kDNSServiceErr_NoError
, и работа решения будет работать неопределенно, пока клиент не завершит ее путем передачи этого DNSServiceRefDNSServiceRefDeallocate
.flags
Указание
kDNSServiceFlagsForceMulticast
заставит запрос выполняться с локальным для ссылки запросом mDNS, даже если имя будет очевидно нелокальным именем (т.е. имя, не заканчивающееся в «.local».)interfaceIndex
Интерфейс, на который можно разрешить службу. Если этот вызов решения в результате в настоящее время активного
DNSServiceBrowse
работа, тогда interfaceIndex должен быть индексом, сообщил в обратном вызове DNSServiceBrowseReply. Если этот вызов решения использует информацию, ранее сохраненную (например, в предпочтительном файле) для более позднего использования, то используйте interfaceIndex 0, потому что желаемая служба может теперь быть достижимой через различный физический интерфейс. См. «Константы для указания интерфейсного индекса» для большего количества подробных данных.name
Имя экземпляра службы, который будет разрешен, как сообщается
DNSServiceBrowseReply
обратный вызов.regtype
Тип экземпляра службы, который будет разрешен, как сообщается
DNSServiceBrowseReply
обратный вызов.domain
Домен экземпляра службы, который будет разрешен, как сообщается
DNSServiceBrowseReply
обратный вызов.callBack
Функция, которую вызовут, когда результат найден, или если вызов асинхронно перестал работать.
context
Указатель контекста приложения, передающийся функции обратного вызова (может быть NULL).
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе (любые последующие, асинхронные ошибки поставлены обратному вызову), иначе возвращает код ошибки, указывающий ошибку, произошедшую (обратный вызов никогда не вызывается, и DNSServiceRef не инициализируется).
-
Запрос для произвольной записи DNS.
Объявление
Objective C
DNSServiceErrorType DNSServiceQueryRecord ( DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *fullname, uint16_t rrtype, uint16_t rrclass, DNSServiceQueryRecordReply callBack, void *context /* may be NULL */ );
Параметры
sdRef
Указатель на неинициализированный DNSServiceRef. Если вызов успешно выполняется тогда, он инициализирует DNSServiceRef, возвраты
kDNSServiceErr_NoError
, и работа запроса будет работать неопределенно, пока клиент не завершит ее путем передачи этого DNSServiceRefDNSServiceRefDeallocate
.flags
kDNSServiceFlagsForceMulticast
илиkDNSServiceFlagsLongLivedQuery
. ПередачаkDNSServiceFlagsLongLivedQuery
создать «долгосрочный» одноадресный запрос к одноадресной передаче сервер DNS, реализующий протокол. Этот флаг не имеет никакого эффекта на локальные для ссылки многоадресные запросы.interfaceIndex
Если ненулевой, указывает интерфейс, по которому можно выпустить запрос (индекс для данного интерфейса определяется через if_nametoindex () семья вызовов.) Передача 0 причин имя, которое будет запрошено для во всех интерфейсах. См. «Константы для указания интерфейсного индекса» для большего количества подробных данных.
fullname
Полное доменное имя ресурсной записи, которая будет запрошена для.
rrtype
Числовой тип ресурсной записи, которая будет запрошена для (например.
kDNSServiceType_PTR
,kDNSServiceType_SRV
, и т.д.).rrclass
Класс ресурсной записи (обычно
kDNSServiceClass_IN
).callBack
Функция, которую вызовут, когда результат найден, или если вызов асинхронно перестал работать.
context
Указатель контекста приложения, передающийся функции обратного вызова (может быть NULL).
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе (любые последующие, асинхронные ошибки поставлены обратному вызову), иначе возвращает код ошибки, указывающий ошибку, произошедшую (обратный вызов никогда не вызывается, и DNSServiceRef не инициализируется).
-
Запрашивает порт, отображающийся в шлюзе NAT, отображающем порт на локальной машине к внешнему порту на NAT.
Объявление
Objective C
DNSServiceErrorType DNSServiceNATPortMappingCreate ( DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceProtocol protocol, /* TCP and/or UDP */ uint16_t internalPort, /* network byte order */ uint16_t externalPort, /* network byte order */ uint32_t ttl, /* time to live in seconds */ DNSServiceNATPortMappingReply callBack, void *context /* may be NULL */ );
Параметры
sdRef
Указатель на неинициализированный DNSServiceRef. Если вызов успешно выполняется тогда, он инициализирует DNSServiceRef, возвраты
kDNSServiceErr_NoError
, и туземное отображение порта продлится неопределенно, пока клиент не завершит запрос отображения порта путем передачи этого DNSServiceRefDNSServiceRefDeallocate
.flags
В настоящее время игнорируемый, зарезервированный для будущего использования.
interfaceIndex
Интерфейс, в котором можно создать отображения порта в шлюзе NAT. Передача 0 причин запрос отображения порта, который будет отправлен в основном интерфейсе.
protocol
Для запроса отображения порта передайте в
kDNSServiceProtocol_UDP
, илиkDNSServiceProtocol_TCP
, или (kDNSServiceProtocol_UDP | kDNSServiceProtocol_TCP) для отображения обоих. Локальный номер порта прослушивания должен также быть указан в internalPort параметре. Чтобы просто обнаружить внешний IP-адрес шлюза NAT передайте нуль для протокола, internalPort, externalPort и ttl.internalPort
Номер порта в сетевом порядке байтов на локальной машине, прислушивающейся к пакетам.
externalPort
Требуемый внешний порт в сетевом порядке байтов в шлюзе NAT, который требуется отобразить на внутренний порт. Передайте 0, если Вы не заботитесь, какой внешний порт выбран для Вас.
ttl
Требуемый период восстановления отображения порта NAT, в секундах. Если клиентская машина разрушит, перенесет сбой питания, будет разъединена от сети или перенесет некоторую другую неудачную сдачу в аренду, заставляющую его неожиданно исчезнуть, явно не удаляя ее отображения порта NAT, то шлюз NAT соберет «мусор» старые устаревшие отображения порта NAT, когда истечет их время жизни. Запрос короткого TTL заставляет такие осиротевшие отображения быть собранными «мусор» более быстро, но использует системные ресурсы и сетевую пропускную способность с частыми пакетами возобновления, чтобы препятствовать отображению истекать. Запрос длинного TTL более эффективен в сети, но в случае клиента, исчезающего, устаревшие отображения порта NAT не будут собраны «мусор» как быстро. Большинство клиентов должно передать 0 для использования значения по умолчанию в масштабе всей системы.
callBack
Функция, которую вызовут, когда запрос отображения порта успешно выполняется или перестал работать асинхронно.
context
Указатель контекста приложения, передающийся функции обратного вызова (может быть NULL).
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе (любые последующие, асинхронные ошибки поставлены обратному вызову), иначе возвращает код ошибки, указывающий произошедшую ошибку.Если Вы фактически не хотите порт, отображенный, и просто вызываете API, потому что Вы хотите узнать NAT's, внешний IP-адрес (например, для дисплея UI) тогда передает нуль для протокола, internalPort, externalPort и ttl.
Обсуждение
NAT должен поддерживать или NAT-PMP или UPnP IGD для этого API для создания успешного отображения. Обратите внимание на то, что этот API в настоящее время поддерживает адреса/отображения IPv4 только. Если шлюз NAT поддерживает PCP и возвращает адрес IPv6 (неправильно, так как этот API в частности запрашивает адреса IPv4), обратный вызов DNSServiceNATPortMappingReply вызывается с errorCode kDNSServiceErr_NATPortMappingUnsupported.
Отображение порта будет возобновлено неопределенно до выходов клиентского процесса, или явно завершает запрос отображения порта путем вызова
DNSServiceRefDeallocate
. Клиентский обратный вызов будет вызван, сообщая клиенту внешнего IP-адреса шлюза NAT и внешнего порта, выделенного для этого клиента. Клиент должен тогда записать этот внешний IP-адрес и порт с помощью любого механизма службы каталогов, который это использует, чтобы позволить коллегам соединиться с ним. (Клиентские рекламные услуги с помощью Глобального DNS-SD не должны использовать этот API; когда клиент вызываетDNSServiceRegister
Отображения NAT автоматически создаются, и внешний IP-адрес и порт для службы зарегистрированы в глобальном DNS. Только клиенты, использующие некоторый механизм каталога кроме Глобального DNS-SD, должны использовать этот API для явного отображения их собственных портов.)Возможно, что клиентский обратный вызов можно было вызвать многократно, например если IP-адрес шлюза NAT изменяется, или если изменение конфигурации приводит к различному внешнему порту, отображаемому для этого клиента. Во время жизни любого долгосрочного отображения порта клиент должен быть подготовлен обработать эти уведомления об изменениях в среде и должен обновить ее зарегистрированный адрес и/или порт как надлежащие.
Примечание: Существует два необычных аспекта того, как DNSServiceNATPortMappingCreate API работает, которые были преднамеренно разработаны, чтобы помочь упростить клиентский код:
1. Когда машина не находится позади шлюза NAT, это не ошибка запросить отображение NAT. В другом NAT, отображающем APIs, если Вы запрашиваете, отображение NAT и машина не находятся позади шлюза NAT, тогда API возвращает код ошибки - это не может получить Вас отображение NAT, если нет никакого шлюза NAT. DNSServiceNATPortMappingCreate API придерживается другого мнения. Разработка, нужно ли Вам отображение NAT, может быть хитрой и неочевидной, особенно на машине с многократными интерфейсами активной сети. Вместо того, чтобы заставлять каждый клиент воссоздать эту логику для решения, требуется ли отображение NAT, PortMapping API выполняет ту работу для Вас. Если клиент вызывает PortMapping API, когда машина уже имеет routable общедоступный IP-адрес, то вместо того, чтобы жаловаться на это и дать ошибку, PortMapping API просто вызывает Ваш обратный вызов, давая общедоступный адрес машины и Ваш собственный номер порта. Это означает, что Вы не должны писать код, чтобы выяснить, должен ли Ваш клиент вызвать PortMapping API - просто вызывают его так или иначе, и если это не было необходимо, никакой вред не причинен: - если машина уже будет иметь routable общедоступный IP-адрес, то Ваш обратный вызов будет просто вызван, давая Ваш собственный адрес и порт.
- Если отображение NAT будет требоваться и получаться, то Ваш обратный вызов будет вызван, давая Вам внешний адрес и порт.
- Если отображение NAT будет требоваться, но не получаться из локального шлюза NAT, или машина не имеет никакого сетевого соединения, то Ваш обратный вызов будет вызван, давая нулевой адрес и порт.
2. В другом NAT, отображающем APIs, если портативный компьютер помещен в сон и разбужен в новой сети, это - задание клиента, чтобы заметить это и выяснить, требуется ли отображение NAT в новой сети, и выполните новый запрос отображения NAT при необходимости. DNSServiceNATPortMappingCreate API делает это для Вас, автоматически. Клиент просто должен выполнить один вызов к PortMapping API, и его обратный вызов будет вызван любое время отображающиеся изменения состояния. Эта точка дополнений свойства (1) выше. Если бы клиент не выполнял запрос отображения NAT просто, потому что он решил, что каждый не требовался в тот определенный момент своевременно, то клиент должен будет тогда контролировать для изменений состояния сети, чтобы определить, стал ли порт NAT, отображающийся позже, необходимым. Путем безусловной подачи с просьбой отображения NAT, даже когда отображение NAT, чтобы не быть необходимым, PortMapping API тогда начнет наблюдать изменения состояния сети от имени клиента, и если NAT, отображающийся позже, становится необходимым, это автоматически создаст отображение NAT и сообщит клиенту с новым обратным вызовом, дающим новую адресную информацию и информацию порта.
-
Связывает трехчастное доменное имя (как возвращено вышеупомянутыми обратными вызовами) в должным образом оставленное полное доменное имя.
Объявление
Objective C
DNSServiceErrorType DNSServiceConstructFullName ( char *const fullName, const char *const service, /* may be NULL */ const char *const regtype, const char *const domain );
Параметры
fullName
Указатель на буфер это, где должно быть написано получающееся полное доменное имя. Буфер должен быть
kDNSServiceMaxDomainName
(1009) байты в длине для размещения самого долгого юридического доменного имени без переполнения буфера.service
Имя службы - любых точек или наклонных черт влево нельзя оставить. Может быть NULL (для построения имени записи PTR, например, «_ftp._tcp.apple.com».).
regtype
Тип службы, сопровождаемый протоколом, разделенным точкой (например, «_ftp. _ tcp»).
domain
Доменное имя, например, «apple.com».. Литеральных точек или наклонных черт влево, если таковые имеются, нужно оставить, например, «1st\. Floor.apple.com».
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
(0) на успехе,kDNSServiceErr_BadParam
на ошибке.Обсуждение
Обратите внимание на то, что обратные вызовы в вышеупомянутых функциях ALREADY ESCAPE представляют в виде строки в случае необходимости.
-
Перечисляет домены, рекомендующиеся для регистрации и просмотра.
Объявление
Objective C
DNSServiceErrorType DNSServiceEnumerateDomains ( DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceDomainEnumReply callBack, void *context /* may be NULL */ );
Параметры
sdRef
Указатель на неинициализированный DNSServiceRef. Если вызов успешно выполняется тогда, он инициализирует DNSServiceRef, возвраты
kDNSServiceErr_NoError
, и работа перечисления будет работать неопределенно, пока клиент не завершит ее путем передачи этого DNSServiceRefDNSServiceRefDeallocate
.flags
Возможные значения:
kDNSServiceFlagsBrowseDomains
перечислить домены, рекомендуемые для просмотра.kDNSServiceFlagsRegistrationDomains
перечислить домены, рекомендуемые для регистрации.interfaceIndex
Если ненулевой, указывает интерфейс, в котором можно искать домены. (индекс для данного интерфейса определяется через if_nametoindex () семья вызовов.) Большинство приложений передаст 0 для перечисления доменов во всех интерфейсах. См. «Константы для указания интерфейсного индекса» для большего количества подробных данных.
callBack
Функция, которую вызовут, когда домен найден или вызов асинхронно, перестала работать.
context
Указатель контекста приложения, передающийся функции обратного вызова (может быть NULL).
Возвращаемое значение
Возвраты
kDNSServiceErr_NoError
на успехе (любые последующие, асинхронные ошибки поставлены обратному вызову), иначе возвращает код ошибки, указывающий ошибку, произошедшую (обратный вызов не вызывается, и DNSServiceRef не инициализируется).Обсуждение
Перечисление MUST быть отмененным через
DNSServiceRefDeallocate
когда не должно быть найдено больше доменов.Обратите внимание на то, что имена возвратились, (как весь DNS-SD) строки UTF-8 и оставлены с помощью стандартных правил выхода DNS. (См. «Примечания по Имени DNS, Выходящему» ранее в этом файле для большего количества подробных данных.) Графический браузер, выводящий на экран иерархическое представление с древовидной структурой, должен сократить имена в пустых точках, чтобы привести к отдельным меткам, затем de-escape каждая метка согласно правилам выхода, и затем вывести на экран получающийся текст UTF-8.
-
Обратный вызов для обработки результатов предыдущего вызова к
DNSServiceGetAddrInfo
.Объявление
Objective C
typedef void ( *DNSServiceGetAddrInfoReply) ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *hostname, const struct sockaddr *address, uint32_t ttl, void *context );
Параметры
sdRef
DNSServiceRef, инициализированный
DNSServiceGetAddrInfo
.flags
Возможные значения
kDNSServiceFlagsMoreComing
иkDNSServiceFlagsAdd
.interfaceIndex
Интерфейс, которому принадлежат ответы.
errorCode
Будет
kDNSServiceErr_NoError
на успехе, иначе укажет произошедший отказ. Если errorCode является ненулевым, другие параметры не определены.hostname
Полностью определенное доменное имя узла, который будет запрошен для.
address
IPv4 или адрес IPv6.
ttl
Если клиент хочет кэшировать результат по причинам производительности, TTL указывает, сколько времени клиент может законно содержать на этот результат в секундах. После того, как TTL истекает, клиент должен считать результат больше не действительным, и если он требует этих данных снова, он должен быть повторно выбран с новым запросом. Конечно, это только применяется к клиентам, отменяющим асинхронную работу, когда они получают результат. Клиенты, оставляющие асинхронное выполнение работы, могут безопасно предположить, что данные остаются допустимыми, пока они не получают другой обратный вызов, говоря им иначе.
context
Указатель контекста, переданный выноске.
DNSServiceCreateConnection
, DNSServiceRegisterRecord
, DNSServiceReconfirmRecord
(большинство приложений не будет использовать их),
-
Обратный вызов для обработки результатов предыдущего вызова к
DNSServiceRegisterRecord
.Объявление
Objective C
typedef void ( *DNSServiceRegisterRecordReply) ( DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, void *context );
Параметры
sdRef
Связанный DNSServiceRef, инициализированный
DNSServiceCreateConnection
.RecordRef
DNSRecordRef, инициализированный
DNSServiceRegisterRecord
. Если вышеупомянутый DNSServiceRef передаетсяDNSServiceRefDeallocate
, этот DNSRecordRef лишен законной силы и не может использоваться далее.flags
В настоящее время неиспользованный, зарезервированный для будущего использования.
errorCode
Будет
kDNSServiceErr_NoError
на успехе, иначе укажет отказ, произошедший (включая конфликты имен.) Если errorCode является ненулевым, другие параметры не определены.context
Указатель контекста, переданный выноске.
-
Обработчик для результатов предыдущего вызова к
DNSServiceRegister
.Объявление
Objective C
typedef void ( *DNSServiceRegisterReply) ( DNSServiceRef sdRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, void *context );
Параметры
sdRef
DNSServiceRef, инициализированный
DNSServiceRegister
.flags
Когда имя будет успешно зарегистрировано, обратный вызов будет вызван с
kDNSServiceFlagsAdd
флаг установлен. Когда Глобальный DNS-SD используется, для единственной службы возможно получить больше чем один обратный вызов успеха (например, один в «локальном» многоадресном домене DNS и другом в глобальном одноадресном домене DNS). Если успешно зарегистрированное имя позже перенесет конфликт имен или подобную проблему и должно будет быть вычеркнуто из списка, то обратный вызов будет вызван сkDNSServiceFlagsAdd
флаг не набор. Обратный вызов *не* вызван в случае, где вызывающая сторона явно завершает регистрацию службы путем вызова DNSServiceRefDeallocate (касательно);errorCode
Будет
kDNSServiceErr_NoError
на успехе, иначе укажет отказ, произошедший (включая конфликты имен, еслиkDNSServiceFlagsNoAutoRename
флаг использовался при регистрации.) Если errorCode является ненулевым, другие параметры не определены.name
Если приложение не указывало имя в, имя службы зарегистрировалось (
DNSServiceRegister
, это указывает, какое имя было автоматически выбрано).regtype
Тип службы зарегистрировался, когда это было передано выноске.
domain
Домен, на котором была зарегистрирована служба (если приложение не указывало домен в
DNSServiceRegister
, это указывает домен по умолчанию, на котором служба была зарегистрирована).context
Указатель контекста, переданный выноске.
-
Обратный вызов для обработки результатов предыдущих вызовов к DNSServiceBrowse.
Объявление
Objective C
typedef void ( *DNSServiceBrowseReply) ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *serviceName, const char *regtype, const char *replyDomain, void *context );
Параметры
sdRef
DNSServiceRef, инициализированный
DNSServiceBrowse
.flags
Возможные значения
kDNSServiceFlagsMoreComing
иkDNSServiceFlagsAdd
. См. определения флага для подробных данных.interfaceIndex
Интерфейс, в котором распространена служба. Этот индекс должен быть передан
DNSServiceResolve
при разрешении службы.errorCode
Будет
kDNSServiceErr_NoError
(0) на успехе, иначе укажет произошедший отказ. Если errorCode является ненулевым, другие параметры не определены.serviceName
Обнаруженное имя службы. Это имя должно быть выведено на экран пользователю и сохранено для последующего использования в
DNSServiceResolve
вызвать.regtype
Тип службы, который обычно является (но не всегда) тем же, когда был передан
DNSServiceBrowse
. Один случай, где обнаруженный тип службы может не совпасть с требуемым типом службы, при использовании подтипов: клиент может хотеть просмотреть для только тех ftp-серверов, позволяющих анонимные соединения. Клиент передаст строку «_ftp. _ tcp, _anon» кDNSServiceBrowse
, но тип службы, это обнаружено, просто «_ftp. _ tcp». regtype для каждого обнаруженного экземпляра службы должен быть сохранен вместе с именем, так, чтобы это могло быть переданоDNSServiceResolve
когда позже разрешена служба.replyDomain
Домен обнаруженного экземпляра службы. Это может или может не совпасть с доменом, переданным
DNSServiceBrowse
. Домен для каждого обнаруженного экземпляра службы должен быть сохранен вместе с именем, так, чтобы это могло быть переданоDNSServiceResolve
когда позже разрешена служба.context
Указатель контекста, переданный выноске.
-
Объявление
Objective C
typedef void ( *DNSServiceResolveReply) ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullname, const char *hosttarget, uint16_t port, /* In network byte order */ uint16_t txtLen, const unsigned char *txtRecord, void *context );
Параметры
sdRef
DNSServiceRef, инициализированный
DNSServiceResolve
.flags
Возможные значения:
kDNSServiceFlagsMoreComing
interfaceIndex
Интерфейс, в котором была разрешена служба.
errorCode
Будет
kDNSServiceErr_NoError
(0) на успехе, иначе укажет произошедший отказ. Если errorCode является ненулевым, другие параметры не определены.fullname
Доменное имя полного сервиса, в форме <servicename>. <протокол>. <домен>. (Этого имени оставляют, соблюдая стандартные правила DNS, делая его подходящим для передачи стандартной системе DNS APIs, такие как res_query (), или к функциям специального назначения включенный в этот API, берущий fullname параметры. См. «Примечания по Имени DNS, Выходящему» ранее в этом файле для большего количества подробных данных.)
hosttarget
Целевое имя хоста машины, предоставляющей услугу. Это имя может быть передано функциям как gethostbyname () для идентификации IP-адреса узла.
port
Порт, в сетевом порядке байтов, на котором соединения приняты для этой службы.
txtLen
Длина записи txt, в байтах.
txtRecord
Основная запись txt службы, в стандарте txt формат записи.
context
Указатель контекста, переданный выноске.
Примечание: В более ранних версиях этого заголовочного файла txtRecord параметр был объявлен «символом константы *», Это неправильно, так как это содержит байты длины, которые являются значениями в диапазоне от 0 до 255, не-128 к +127. В зависимости от Ваших параметров компилятора это изменение может вызвать предупреждения несоответствия со знаком/без знака. Они должны быть фиксированы путем обновления собственного определения функции обратного вызова для соответствия исправленной функциональной подписи с помощью «константу символ без знака *txtRecord». Внесение этого изменения может также исправить непреднамеренные ошибки в Вашей функции обратного вызова, где это, возможно, неправильно интерпретировало байт длины со значением 250 как являющийся-6 вместо этого, с различными плохими последствиями в пределах от неправильной работы к катастрофическим отказам программного обеспечения. Если необходимо поддержать переносимый код, который скомпилирует чисто и со старыми и с новыми версиями этого заголовочного файла, необходимо обновить определение функции обратного вызова для использования корректного значения без знака, и затем в месте, куда Вы передаете свою функцию обратного вызова
DNSServiceResolve
, используйте бросок для устранения предупреждения компилятора, например:DNSServiceResolve (sd, флаги, индекс, имя, regtype, домен, (DNSServiceResolveReply) MyCallback, контекст);
Это гарантирует, что Ваш код компилирует чисто без предупреждений (и что еще более важно, работает правильно), и со старым заголовком и с новой исправленной версией.
Обсуждение
Разрешите имя службы, обнаруженное через
DNSServiceBrowse
к имени целевого узла, номеру порта и записи txt.Примечание: Приложения не должны использовать
DNSServiceResolve
исключительно для записи txt, контролирующей - использованиеDNSServiceQueryRecord
вместо этого, поскольку это более эффективно для этой задачи.Примечание: Когда желаемые результаты были возвращены, клиент, MUST завершает решение путем вызова
DNSServiceRefDeallocate
.Примечание:
DNSServiceResolve
ведет себя правильно для типичных служб, имеющих единственную запись SRV и единственную запись TXT. Разрешить нестандартные службы с многократным SRV или записями TXT,DNSServiceQueryRecord
должен использоваться.
-
Обратный вызов для обработки результатов предыдущего вызова к
DNSServiceQueryRecord
.Объявление
Objective C
typedef void ( *DNSServiceQueryRecordReply) ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context );
Параметры
sdRef
DNSServiceRef, инициализированный
DNSServiceQueryRecord
.flags
Возможные значения
kDNSServiceFlagsMoreComing
иkDNSServiceFlagsAdd
. Флаг Add НЕ установлен для записей PTR с ttl 0, т.е. события «Remove».interfaceIndex
Интерфейс, в котором был разрешен запрос (индекс для данного интерфейса определяется через if_nametoindex () семья вызовов). См. «Константы для указания интерфейсного индекса» для большего количества подробных данных.
errorCode
Будет
kDNSServiceErr_NoError
на успехе, иначе укажет произошедший отказ. Если errorCode является ненулевым, другие параметры не определены.fullname
Полное доменное имя ресурсной записи.
rrtype
Тип ресурсной записи (например.
kDNSServiceType_PTR
,kDNSServiceType_SRV
, и т.д.).rrclass
Класс ресурсной записи (обычно
kDNSServiceClass_IN
).rdlen
Длина, в байтах, ресурсной записи rdata.
rdata
Сырые данные rdata ресурсной записи.
ttl
Если клиент хочет кэшировать результат по причинам производительности, TTL указывает, сколько времени клиент может законно содержать на этот результат в секундах. После того, как TTL истекает, клиент должен считать результат больше не действительным, и если он требует этих данных снова, он должен быть повторно выбран с новым запросом. Конечно, это только применяется к клиентам, отменяющим асинхронную работу, когда они получают результат. Клиенты, оставляющие асинхронное выполнение работы, могут безопасно предположить, что данные остаются допустимыми, пока они не получают другой обратный вызов, говоря им иначе.
context
Указатель контекста, переданный выноске.
-
Обратный вызов для обработки ответа от предыдущего вызова до
DNSServiceNATPortMappingReply
.Объявление
Objective C
typedef void ( *DNSServiceNATPortMappingReply) ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, uint32_t externalAddress, /* four byte IPv4 address in network byte order */ DNSServiceProtocol protocol, uint16_t internalPort, /* In network byte order */ uint16_t externalPort, /* In network byte order and may be different than the requested port */ uint32_t ttl, /* may be different than the requested ttl */ void *context );
Параметры
sdRef
DNSServiceRef, инициализированный
DNSServiceNATPortMappingCreate
.flags
В настоящее время неиспользованный, зарезервированный для будущего использования.
interfaceIndex
Интерфейс, через который достигнут шлюз NAT.
errorCode
Будет
kDNSServiceErr_NoError
на успехе. БудетkDNSServiceErr_DoubleNAT
когда шлюз NAT находится самостоятельно позади одного или более уровней NAT, когда другие параметры имеют определенные значения. Для других отказов, укажет отказ, произошедший, и другие параметры не определены.externalAddress
Четырехбайтовый адрес IPv4 в сетевом порядке байтов.
protocol
Будет
kDNSServiceProtocol_UDP
илиkDNSServiceProtocol_TCP
или оба.internalPort
Порт на отображенной локальной машине.
externalPort
Фактический внешний порт в отображенном шлюзе NAT. Это, вероятно, будет отличаться, чем требуемый внешний порт.
ttl
Время жизни отображения порта NAT создается на шлюзе. Это управляет, как быстро устаревшие отображения будут собраны «мусор», если клиентская машина разрушит, перенесет сбой питания, будет разъединена от сети или перенесет некоторую другую неудачную сдачу в аренду, заставляющую его исчезать, явно не удаляя ее отображение порта NAT. Возможно, что значение ttl будет отличаться от требуемого значения ttl.
context
Указатель контекста, переданный выноске.
Обсуждение
NAT должен поддерживать или NAT-PMP или протокол UPnP IGD для этого API для создания успешного отображения.
-
Обратный вызов для обработки результатов предыдущего вызова к
DNSServiceEnumerateDomains
.Объявление
Objective C
typedef void ( *DNSServiceDomainEnumReply) ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *replyDomain, void *context );
Параметры
sdRef
DNSServiceRef, инициализированный
DNSServiceEnumerateDomains
.flags
interfaceIndex
Указывает интерфейс, в котором существует домен. (Индекс для данного интерфейса определяется через if_nametoindex () семья вызовов.)
errorCode
Будет
kDNSServiceErr_NoError
(0) на успехе, иначе указывает отказ, произошедший (другие параметры не определены, если errorCode является ненулевым).replyDomain
Имя домена.
context
Указатель контекста передал DNSServiceEnumerateDomains.
Посмотрите раздел Overview выше для документации уровня заголовка.
-
Объявление
Objective C
typedef int32_t DNSServiceErrorType;
Обсуждение
Описание типа для ошибочного типа Службы DNS.
Оператор импорта
-
Объявление
Objective C
typedef uint32_t DNSServiceFlags;
Обсуждение
Описание типа для флагов Службы DNS.
Оператор импорта
-
Объявление
Objective C
typedef uint32_t DNSServiceProtocol;
Обсуждение
Описание типа для протокола Службы DNS.
Оператор импорта
-
Непрозрачный внутренний тип данных, представляющий DNS-SD запись TXT.
Объявление
Objective C
typedef union _TXTRecordRef_t { char PrivateData[16]; char *ForceNaturalAlignment; } TXTRecordRef;
Оператор импорта
Посмотрите раздел Overview выше для документации уровня заголовка.
-
Объявление
Objective C
#define kDNSServiceInterfaceIndexAny 0 #define kDNSServiceInterfaceIndexLocalOnly ((uint32_t)-1) #define kDNSServiceInterfaceIndexP2P ((uint32_t)-3) #define kDNSServiceInterfaceIndexUnicast ((uint32_t)-2)
Константы
-
kDNSServiceInterfaceIndexAny
Определенные интерфейсные индексы идентифицируются через 32-разрядное целое без знака, возвращенное if_nametoindex () семья вызовов.
Если клиент передает 0 для интерфейсного индекса, означающего, «делают правильную вещь», (в настоящее время) означающую, «если имя находится в mDNS локальном многоадресном домене (например, 'локальный'. '254.169.in-addr.arpa'. '{8,9, A, B}.E.F.ip6.arpa'.) тогда многоадресно переданный во всех применимых интерфейсах, иначе отправьте через одноадресную передачу к надлежащему серверу DNS». Обычно, большинство клиентов будет использовать 0 для интерфейсного индекса для автоматического получения разумного поведения по умолчанию.
Если клиент передает положительный интерфейсный индекс, то для многоадресных имен, который указывает, чтобы сделать работу только в том одном интерфейсе. Поскольку одноадресные имена, интерфейсный индекс проигнорирован, если также не установлен kDNSServiceFlagsForceMulticast.
Если клиент передает
kDNSServiceInterfaceIndexLocalOnly
при регистрации службы тогда та служба будет найдена *только* другими локальными клиентами на той же машине, просматривающими использованиеkDNSServiceInterfaceIndexLocalOnly
илиkDNSServiceInterfaceIndexAny
. Если у клиента есть 'частная' служба, доступная только для других процессов, работающих на той же машине, это позволяет клиенту распространять ту службу в пути, таким образом, что это непреднамеренно не появляется в обслуживании списки на всех других машинах в сети.Если клиент передает
kDNSServiceInterfaceIndexLocalOnly
когда просмотр тогда его найдет *все* записи зарегистрированный на той же самой локальной машине. Клиенты, явно желающие обнаружить *только*, службы LocalOnly могут выполнить, это путем проверки interfaceIndex каждой службы сообщило ихDNSServiceBrowseReply
функция обратного вызова и отбрасывание тех, где интерфейсный индекс неkDNSServiceInterfaceIndexLocalOnly
.kDNSServiceInterfaceIndexP2P
значимо только в Обзоре, QueryRecord, Регистре и операциях Resolve. Это не должно использоваться в другом APIs DNSService.- Если
kDNSServiceInterfaceIndexP2P
передаетсяDNSServiceBrowse
илиDNSServiceQueryRecord
, это ограничивает работу P2P.- Если kDNSServiceInterfaceIndexP2P передается DNSServiceRegister, он отображается внутренне на kDNSServiceInterfaceIndexAny с набором kDNSServiceFlagsIncludeP2P.
- Если
kDNSServiceInterfaceIndexP2P
передаетсяDNSServiceResolve
, это отображается внутренне наkDNSServiceInterfaceIndexAny
сkDNSServiceFlagsIncludeP2P
набор, потому что разрешение службы P2P может создать и/или включить интерфейс, индекс которого не известен априорно. Обратный вызов решения укажет индекс интерфейса, через который можно получить доступ к службе.Если приложения передают
kDNSServiceInterfaceIndexAny
кDNSServiceBrowse
илиDNSServiceQueryRecord
, они должны установитьkDNSServiceFlagsIncludeP2P
флаг для включения P2P. В этом случае, если экземпляр службы или запрашиваемая запись будут найдены по P2P, то укажет получающееся событие ADDkDNSServiceInterfaceIndexP2P
как интерфейсный индекс. -
kDNSServiceInterfaceIndexLocalOnly
Определенные интерфейсные индексы идентифицируются через 32-разрядное целое без знака, возвращенное if_nametoindex () семья вызовов.
Если клиент передает 0 для интерфейсного индекса, означающего, «делают правильную вещь», (в настоящее время) означающую, «если имя находится в mDNS локальном многоадресном домене (например, 'локальный'. '254.169.in-addr.arpa'. '{8,9, A, B}.E.F.ip6.arpa'.) тогда многоадресно переданный во всех применимых интерфейсах, иначе отправьте через одноадресную передачу к надлежащему серверу DNS». Обычно, большинство клиентов будет использовать 0 для интерфейсного индекса для автоматического получения разумного поведения по умолчанию.
Если клиент передает положительный интерфейсный индекс, то для многоадресных имен, который указывает, чтобы сделать работу только в том одном интерфейсе. Поскольку одноадресные имена, интерфейсный индекс проигнорирован, если также не установлен kDNSServiceFlagsForceMulticast.
Если клиент передает
kDNSServiceInterfaceIndexLocalOnly
при регистрации службы тогда та служба будет найдена *только* другими локальными клиентами на той же машине, просматривающими использованиеkDNSServiceInterfaceIndexLocalOnly
илиkDNSServiceInterfaceIndexAny
. Если у клиента есть 'частная' служба, доступная только для других процессов, работающих на той же машине, это позволяет клиенту распространять ту службу в пути, таким образом, что это непреднамеренно не появляется в обслуживании списки на всех других машинах в сети.Если клиент передает
kDNSServiceInterfaceIndexLocalOnly
когда просмотр тогда его найдет *все* записи зарегистрированный на той же самой локальной машине. Клиенты, явно желающие обнаружить *только*, службы LocalOnly могут выполнить, это путем проверки interfaceIndex каждой службы сообщило ихDNSServiceBrowseReply
функция обратного вызова и отбрасывание тех, где интерфейсный индекс неkDNSServiceInterfaceIndexLocalOnly
.kDNSServiceInterfaceIndexP2P
значимо только в Обзоре, QueryRecord, Регистре и операциях Resolve. Это не должно использоваться в другом APIs DNSService.- Если
kDNSServiceInterfaceIndexP2P
передаетсяDNSServiceBrowse
илиDNSServiceQueryRecord
, это ограничивает работу P2P.- Если kDNSServiceInterfaceIndexP2P передается DNSServiceRegister, он отображается внутренне на kDNSServiceInterfaceIndexAny с набором kDNSServiceFlagsIncludeP2P.
- Если
kDNSServiceInterfaceIndexP2P
передаетсяDNSServiceResolve
, это отображается внутренне наkDNSServiceInterfaceIndexAny
сkDNSServiceFlagsIncludeP2P
набор, потому что разрешение службы P2P может создать и/или включить интерфейс, индекс которого не известен априорно. Обратный вызов решения укажет индекс интерфейса, через который можно получить доступ к службе.Если приложения передают
kDNSServiceInterfaceIndexAny
кDNSServiceBrowse
илиDNSServiceQueryRecord
, они должны установитьkDNSServiceFlagsIncludeP2P
флаг для включения P2P. В этом случае, если экземпляр службы или запрашиваемая запись будут найдены по P2P, то укажет получающееся событие ADDkDNSServiceInterfaceIndexP2P
как интерфейсный индекс. -
kDNSServiceInterfaceIndexP2P
Определенные интерфейсные индексы идентифицируются через 32-разрядное целое без знака, возвращенное if_nametoindex () семья вызовов.
Если клиент передает 0 для интерфейсного индекса, означающего, «делают правильную вещь», (в настоящее время) означающую, «если имя находится в mDNS локальном многоадресном домене (например, 'локальный'. '254.169.in-addr.arpa'. '{8,9, A, B}.E.F.ip6.arpa'.) тогда многоадресно переданный во всех применимых интерфейсах, иначе отправьте через одноадресную передачу к надлежащему серверу DNS». Обычно, большинство клиентов будет использовать 0 для интерфейсного индекса для автоматического получения разумного поведения по умолчанию.
Если клиент передает положительный интерфейсный индекс, то для многоадресных имен, который указывает, чтобы сделать работу только в том одном интерфейсе. Поскольку одноадресные имена, интерфейсный индекс проигнорирован, если также не установлен kDNSServiceFlagsForceMulticast.
Если клиент передает
kDNSServiceInterfaceIndexLocalOnly
при регистрации службы тогда та служба будет найдена *только* другими локальными клиентами на той же машине, просматривающими использованиеkDNSServiceInterfaceIndexLocalOnly
илиkDNSServiceInterfaceIndexAny
. Если у клиента есть 'частная' служба, доступная только для других процессов, работающих на той же машине, это позволяет клиенту распространять ту службу в пути, таким образом, что это непреднамеренно не появляется в обслуживании списки на всех других машинах в сети.Если клиент передает
kDNSServiceInterfaceIndexLocalOnly
когда просмотр тогда его найдет *все* записи зарегистрированный на той же самой локальной машине. Клиенты, явно желающие обнаружить *только*, службы LocalOnly могут выполнить, это путем проверки interfaceIndex каждой службы сообщило ихDNSServiceBrowseReply
функция обратного вызова и отбрасывание тех, где интерфейсный индекс неkDNSServiceInterfaceIndexLocalOnly
.kDNSServiceInterfaceIndexP2P
значимо только в Обзоре, QueryRecord, Регистре и операциях Resolve. Это не должно использоваться в другом APIs DNSService.- Если
kDNSServiceInterfaceIndexP2P
передаетсяDNSServiceBrowse
илиDNSServiceQueryRecord
, это ограничивает работу P2P.- Если kDNSServiceInterfaceIndexP2P передается DNSServiceRegister, он отображается внутренне на kDNSServiceInterfaceIndexAny с набором kDNSServiceFlagsIncludeP2P.
- Если
kDNSServiceInterfaceIndexP2P
передаетсяDNSServiceResolve
, это отображается внутренне наkDNSServiceInterfaceIndexAny
сkDNSServiceFlagsIncludeP2P
набор, потому что разрешение службы P2P может создать и/или включить интерфейс, индекс которого не известен априорно. Обратный вызов решения укажет индекс интерфейса, через который можно получить доступ к службе.Если приложения передают
kDNSServiceInterfaceIndexAny
кDNSServiceBrowse
илиDNSServiceQueryRecord
, они должны установитьkDNSServiceFlagsIncludeP2P
флаг для включения P2P. В этом случае, если экземпляр службы или запрашиваемая запись будут найдены по P2P, то укажет получающееся событие ADDkDNSServiceInterfaceIndexP2P
как интерфейсный индекс. -
kDNSServiceInterfaceIndexUnicast
Определенные интерфейсные индексы идентифицируются через 32-разрядное целое без знака, возвращенное if_nametoindex () семья вызовов.
Если клиент передает 0 для интерфейсного индекса, означающего, «делают правильную вещь», (в настоящее время) означающую, «если имя находится в mDNS локальном многоадресном домене (например, 'локальный'. '254.169.in-addr.arpa'. '{8,9, A, B}.E.F.ip6.arpa'.) тогда многоадресно переданный во всех применимых интерфейсах, иначе отправьте через одноадресную передачу к надлежащему серверу DNS». Обычно, большинство клиентов будет использовать 0 для интерфейсного индекса для автоматического получения разумного поведения по умолчанию.
Если клиент передает положительный интерфейсный индекс, то для многоадресных имен, который указывает, чтобы сделать работу только в том одном интерфейсе. Поскольку одноадресные имена, интерфейсный индекс проигнорирован, если также не установлен kDNSServiceFlagsForceMulticast.
Если клиент передает
kDNSServiceInterfaceIndexLocalOnly
при регистрации службы тогда та служба будет найдена *только* другими локальными клиентами на той же машине, просматривающими использованиеkDNSServiceInterfaceIndexLocalOnly
илиkDNSServiceInterfaceIndexAny
. Если у клиента есть 'частная' служба, доступная только для других процессов, работающих на той же машине, это позволяет клиенту распространять ту службу в пути, таким образом, что это непреднамеренно не появляется в обслуживании списки на всех других машинах в сети.Если клиент передает
kDNSServiceInterfaceIndexLocalOnly
когда просмотр тогда его найдет *все* записи зарегистрированный на той же самой локальной машине. Клиенты, явно желающие обнаружить *только*, службы LocalOnly могут выполнить, это путем проверки interfaceIndex каждой службы сообщило ихDNSServiceBrowseReply
функция обратного вызова и отбрасывание тех, где интерфейсный индекс неkDNSServiceInterfaceIndexLocalOnly
.kDNSServiceInterfaceIndexP2P
значимо только в Обзоре, QueryRecord, Регистре и операциях Resolve. Это не должно использоваться в другом APIs DNSService.- Если
kDNSServiceInterfaceIndexP2P
передаетсяDNSServiceBrowse
илиDNSServiceQueryRecord
, это ограничивает работу P2P.- Если kDNSServiceInterfaceIndexP2P передается DNSServiceRegister, он отображается внутренне на kDNSServiceInterfaceIndexAny с набором kDNSServiceFlagsIncludeP2P.
- Если
kDNSServiceInterfaceIndexP2P
передаетсяDNSServiceResolve
, это отображается внутренне наkDNSServiceInterfaceIndexAny
сkDNSServiceFlagsIncludeP2P
набор, потому что разрешение службы P2P может создать и/или включить интерфейс, индекс которого не известен априорно. Обратный вызов решения укажет индекс интерфейса, через который можно получить доступ к службе.Если приложения передают
kDNSServiceInterfaceIndexAny
кDNSServiceBrowse
илиDNSServiceQueryRecord
, они должны установитьkDNSServiceFlagsIncludeP2P
флаг для включения P2P. В этом случае, если экземпляр службы или запрашиваемая запись будут найдены по P2P, то укажет получающееся событие ADDkDNSServiceInterfaceIndexP2P
как интерфейсный индекс.
Обсуждение
В этом разделе описываются функции, обратные вызовы и структуры данных, составляющие Открытие Службы DNS API.
Открытие Службы DNS API является частью Добрый день, реализацией Apple нулевой конфигурации, объединяющей (ZEROCONF) в сеть.
Добрый день позволяет Вам регистрировать сетевую службу, такую как сервер принтера или файловый сервер, так, чтобы это могло быть найдено по имени или просмотрено для типом службы и доменом. Используя Добрый день, приложения могут обнаружить, какие службы доступны в сети, вместе со всей информацией - такой как имя, IP-адрес и порт - необходимый для доступа к определенной службе.
В действительности, Добрый день комбинирует функции локального сервера DNS и AppleTalk. Добрый день позволяет приложениям обеспечивать удобный для пользователя просмотр принтера и сервера, среди прочего, по стандартным сетям IP. Это поведение является результатом объединяющихся протоколов такой, как многоадресно передано и DNS для добавления новой функциональности к сети (такой как многоадресная передача DNS).
Добрый день предоставляет легкий доступ приложений к службам по локальным сетям IP, не требуя, чтобы служба или приложение поддерживали AppleTalk или штабель Netbeui, и не требуя сервера DNS для локальной сети.
Примечания по выходу имени DNS
- или-
«Почему
kDNSServiceMaxDomainName
1009, когда максимальное юридическое доменное имя составляет 256 байтов?»Все строки, используемые в DNS-SD APIs, являются строками UTF-8. Кроме исключений, отмеченных ниже, APIs ожидает, что строки будут должным образом оставлены, с помощью стандартных правил выхода DNS:
'\\' представляет единственный литерал '\' на имя
'\'. представляет единственный литерал '.' на имя
'\ddd', где ddd является трехразрядным десятичным значением от 000 до 255, представляет единственный литеральный байт с тем значением.
Пустым незавершенным '.' является разделитель метки, отмечая границу между доменом и подобластью.
Исключения, не использующие выход, являются подпрограммами, где полное имя DNS ресурса повреждается, для удобства, в servicename/regtype/domain. В этих подпрограммах НЕ оставляют «servicename». Это не должно быть, так как это - по определению, просто единственная литеральная строка. Любые символы в той строке представляют точно, каковы они. Части «regtype», с технической точки зрения, оставляют, но так как юридическим regtypes только позволяют содержать буквы, цифры и дефисы, нет ничего для выхода, таким образом, проблема спорна. «Доменной» части также оставляют, хотя большинство доменов в использовании в общедоступном Интернете сегодня, как regtypes, не содержит символов, которых нужно оставить. Поскольку DNS-SD становится более популярными доменами обогащенного текста для открытия службы, станет распространен, таким образом, программное обеспечение должно быть записано для разрешения с доменами с выходом.
servicename может составить до 63 байтов текста UTF-8 (не считающий струну до, завершающую NULL в конце). regtype имеет форму _service. _ tcp или _service. _ udp, где часть «службы» является 1-15 символами, которые могут быть буквами, цифрами или дефисами. Доменная часть трехчастного имени может быть любым юридическим доменом, если это получающееся имя servicename+regtype+domain не превышает 256 байтов.
Для большей части программного обеспечения эти проблемы прозрачны. При просмотре обнаруженный servicenames должен просто быть выведен на экран как есть. При разрешении обнаруженные servicename/regtype/domain просто передаются неизменные
DNSServiceResolve
. Когда aDNSServiceResolve
успешно выполняется, возвращенный fullname уже находится в правильном формате для передачи стандартной системе DNS APIs, такой как res_query (). Для преобразования от servicename/regtype/domain до единственного должным образом оставленного полного имени DNS, функции помощникаDNSServiceConstructFullName
предоставлен.Следующий (высоко изобретенный) пример иллюстрирует процесс выхода. Предположим, что у Вас есть служба, вызванная «Доктор Smith\Dr. Джонсон», из типа «_ftp. _ tcp» в подобласти, «4-й. Этаж» подобласти «Создание 2» домена «apple.com». Полное (завершенное) имя DNS записи SRV этой службы было бы: Dr\.\032Smith \\Др\.\032джонсон. _ ftp. _ tcp.4th\.\032Floor. Building\0322.apple.com.
-
-
Объявление
Objective C
#define _DNS_SD_H 5220111 #define kDNSServiceMaxDomainName 1009 #define kDNSServiceMaxServiceName 64 #define kDNSServiceOutputFlags (kDNSServiceFlagsValidate | kDNSServiceFlagsValidateOptional | kDNSServiceFlagsMoreComing | kDNSServiceFlagsAdd | kDNSServiceFlagsDefault) #define kDNSServiceProperty_DaemonVersion "DaemonVersion"
Константы
-
_DNS_SD_H
Номер версии API.
_DNS_SD_H содержит mDNSResponder номер версии для этого заголовочного файла, отформатированного следующим образом:
Главная часть номера сборки * 10000 +
незначительная часть номера сборки * 100
Например, Mac OS X 10.4.9 имеет mDNSResponder-108.4, который был бы представлен как версия 1080400. Это позволяет коду C делать простой больше - чем и меньше сравнения: например, приложение, требующее
DNSServiceGetProperty
вызовите (новый в mDNSResponder-126), может проверить:#if _DNS_SD_H+0 >= 1260000
... some C code that calls DNSServiceGetProperty() ...
#endif
Версия, определенная в этом символе заголовочного файла, позволяет время компиляции проверять, так, чтобы здание кода C с более ранними версиями заголовочного файла могло избежать ошибок компиляции, пытающихся использовать функции, даже не определяющиеся в тех более ранних версиях. Во время выполнения могут также быть выполнены подобные проверки:
слабое соединение - для предотвращения отказов канала, если выполнено с более ранней версией библиотеки это пропускает некоторый желаемый символ, или
DNSServiceGetProperty (DaemonVersion) - проверять, встречает ли рабочий демон («системная служба» на Windows) некоторый требуемый минимальный уровень функциональности.
-
kDNSServiceMaxDomainName
Максимальная длина, в байтах, доменного имени, представленного как *, вышла* струна до включая заключительную запаздывающую точку и завершающийся NULL в конце.
-
kDNSServiceMaxServiceName
Максимальная длина, в байтах, имени службы, представленного как литеральная струна до, включая завершающийся NULL в конце.
-
kDNSServiceOutputFlags
Все выходные флаги, исключая флаги Состояния DNSSEC.
Обычно используемый для проверки Состояния DNSSEC
-
kDNSServiceProperty_DaemonVersion
Свойство версии демона.
При запросе
kDNSServiceProperty_DaemonVersion
, указатель результата должен указать на 32-разрядное целое без знака, и параметр размера должен быть установлен на sizeof (uint32_t).По возврату 32-разрядное целое без знака содержит номер версии, отформатированный следующим образом:
Главная часть номера сборки * 10000 +
незначительная часть номера сборки * 100
Например, Mac OS X 10.4.9 имеет mDNSResponder-108.4, который был бы представлен как версия 1080400. Это позволяет приложениям делать простой больше - чем и меньше сравнения: например, приложение, требующее, по крайней мере, mDNSResponder-108.4, может проверить:
if (version >= 1080400) ...
Использование в качестве примера:
uint32_t version;
uint32_t size = sizeof(version);
DNSServiceErrorType err = DNSServiceGetProperty(kDNSServiceProperty_DaemonVersion, &version, &size);
if (!err) printf("Bonjour version is %d.%d\n", version / 10000, version / 100 % 100);
-
-
Объявление
Objective C
enum { kDNSServiceClass_IN = 1 /*! Internet */ };
Константы
Обсуждение
Значения для Классов DNS и Типов перечислены в RFC 1035 и доступны на каждом OS в его заголовочном файле DNS. К сожалению, каждый OS не имеет того же заголовочного файла, содержащего Класс DNS и константы Типа, и имена констант не являются непротиворечивыми. Например, BIND 8 использует «T_A», BIND 9 использует «ns_t_a», Windows использует «DNS_TYPE_A» и т.д. Поэтому эти константы также перечислены здесь, так, чтобы код с помощью DNS-SD, программирующего APIs, мог использовать эти константы, так, чтобы тот же код мог скомпилировать на всех наших поддерживаемых платформах.
-
Объявление
Objective C
enum { kDNSServiceErr_NoError = 0, /*! No error */ kDNSServiceErr_Unknown = -65537, /* 0xFFFE FFFF */ kDNSServiceErr_NoSuchName = -65538, kDNSServiceErr_NoMemory = -65539, /*! Out of memory. */ kDNSServiceErr_BadParam = -65540, /*! Bad parameter value passed to function. */ kDNSServiceErr_BadReference = -65541, kDNSServiceErr_BadState = -65542, kDNSServiceErr_BadFlags = -65543, kDNSServiceErr_Unsupported = -65544, kDNSServiceErr_NotInitialized = -65545, kDNSServiceErr_AlreadyRegistered = -65547, kDNSServiceErr_NameConflict = -65548, kDNSServiceErr_Invalid = -65549, /*! An invalid index or character was passed. */ kDNSServiceErr_Firewall = -65550, kDNSServiceErr_Incompatible = -65551, /*! Client library incompatible with daemon */ kDNSServiceErr_BadInterfaceIndex = -65552, kDNSServiceErr_Refused = -65553, kDNSServiceErr_NoSuchRecord = -65554, kDNSServiceErr_NoAuth = -65555, kDNSServiceErr_NoSuchKey = -65556, /*! The key does not exist in the TXT record. */ kDNSServiceErr_NATTraversal = -65557, kDNSServiceErr_DoubleNAT = -65558, /*! More than one NAT gateway between source and destionation. */ kDNSServiceErr_BadTime = -65559, /* Codes up to here existed in Tiger */ kDNSServiceErr_BadSig = -65560, kDNSServiceErr_BadKey = -65561, kDNSServiceErr_Transient = -65562, kDNSServiceErr_ServiceNotRunning = -65563, /*! Background daemon not running */ kDNSServiceErr_NATPortMappingUnsupported = -65564, /*! The NAT gateway doesn't support PCP, NAT-PMP or UPnP. */ kDNSServiceErr_NATPortMappingDisabled = -65565, /*! The NAT gateway supports PCP, NAT-PMP or UPnP, but support is disabled by the administrator. */ kDNSServiceErr_NoRouter = -65566, /*! No router is currently configured (probably no network connectivity ). */ kDNSServiceErr_PollingMode = -65567, kDNSServiceErr_Timeout = -65568 /*! A timeout occurred because the {@link kDNSServiceFlagsTimeout } */ /* mDNS Error codes are in the range */ };
Константы
-
kDNSServiceErr_NoError
Никакая ошибка
-
kDNSServiceErr_NoMemory
Недостаточно памяти.
-
kDNSServiceErr_BadParam
Плохое значение параметра передало функции.
-
kDNSServiceErr_Invalid
Были переданы недопустимый индекс или символ.
-
kDNSServiceErr_Incompatible
Библиотека Client, несовместимая с демоном
-
kDNSServiceErr_NoSuchKey
Ключ не существует в записи TXT.
-
kDNSServiceErr_DoubleNAT
Больше чем один шлюз NAT между источником и destionation.
-
kDNSServiceErr_ServiceNotRunning
Фоновый демон, не работающий
-
kDNSServiceErr_NATPortMappingUnsupported
Шлюз NAT не поддерживает PCP, NAT-PMP или UPnP.
-
kDNSServiceErr_NATPortMappingDisabled
Шлюз NAT поддерживает PCP, NAT-PMP или UPnP, но поддержка отключена администратором.
-
kDNSServiceErr_NoRouter
Никакой маршрутизатор в настоящее время не конфигурируется (вероятно, никакое сетевое соединение).
-
kDNSServiceErr_Timeout
Тайм-аут произошел потому что
kDNSServiceFlagsTimeout
+ флаг был передан.
Обсуждение
возможные значения кода ошибки
-
-
Объявление
Objective C
enum { kDNSServiceType_A = 1, /*! Host address. */ kDNSServiceType_NS = 2, /*! Authoritative server. */ kDNSServiceType_MD = 3, /*! Mail destination. */ kDNSServiceType_MF = 4, /*! Mail forwarder. */ kDNSServiceType_CNAME = 5, /*! Canonical name. */ kDNSServiceType_SOA = 6, /*! Start of authority zone. */ kDNSServiceType_MB = 7, /*! Mailbox domain name. */ kDNSServiceType_MG = 8, /*! Mail group member. */ kDNSServiceType_MR = 9, /*! Mail rename name. */ kDNSServiceType_NULL = 10, /*! Null resource record. */ kDNSServiceType_WKS = 11, /*! Well known service. */ kDNSServiceType_PTR = 12, /*! Domain name pointer. */ kDNSServiceType_HINFO = 13, /*! Host information. */ kDNSServiceType_MINFO = 14, /*! Mailbox information. */ kDNSServiceType_MX = 15, /*! Mail routing information. */ kDNSServiceType_TXT = 16, /*! One or more text strings (NOT "zero or more..."). */ kDNSServiceType_RP = 17, /*! Responsible person. */ kDNSServiceType_AFSDB = 18, /*! AFS cell database. */ kDNSServiceType_X25 = 19, /*! X_25 calling address. */ kDNSServiceType_ISDN = 20, /*! ISDN calling address. */ kDNSServiceType_RT = 21, /*! Router. */ kDNSServiceType_NSAP = 22, /*! NSAP address. */ kDNSServiceType_NSAP_PTR = 23, /*! Reverse NSAP lookup (deprecated ). */ kDNSServiceType_SIG = 24, /*! Security signature. */ kDNSServiceType_KEY = 25, /*! Security key. */ kDNSServiceType_PX = 26, /*! X.400 mail mapping. */ kDNSServiceType_GPOS = 27, /*! Geographical position (withdrawn ). */ kDNSServiceType_AAAA = 28, /*! IPv6 Address. */ kDNSServiceType_LOC = 29, /*! Location Information. */ kDNSServiceType_NXT = 30, /*! Next domain (security ). */ kDNSServiceType_EID = 31, /*! Endpoint identifier. */ kDNSServiceType_NIMLOC = 32, /*! Nimrod Locator. */ kDNSServiceType_SRV = 33, /*! Server Selection. */ kDNSServiceType_ATMA = 34, /*! ATM Address */ kDNSServiceType_NAPTR = 35, /*! Naming Authority PoinTeR */ kDNSServiceType_KX = 36, /*! Key Exchange */ kDNSServiceType_CERT = 37, /*! Certification record */ kDNSServiceType_A6 = 38, /*! IPv6 Address (deprecated ) */ kDNSServiceType_DNAME = 39, /*! Non-terminal DNAME (for IPv6 ) */ kDNSServiceType_SINK = 40, /*! Kitchen sink (experimental ) */ kDNSServiceType_OPT = 41, /*! EDNS0 option (meta-RR ) */ kDNSServiceType_APL = 42, /*! Address Prefix List */ kDNSServiceType_DS = 43, /*! Delegation Signer */ kDNSServiceType_SSHFP = 44, /*! SSH Key Fingerprint */ kDNSServiceType_IPSECKEY = 45, /*! IPSECKEY */ kDNSServiceType_RRSIG = 46, /*! RRSIG */ kDNSServiceType_NSEC = 47, /*! Denial of Existence */ kDNSServiceType_DNSKEY = 48, /*! DNSKEY */ kDNSServiceType_DHCID = 49, /*! DHCP Client Identifier */ kDNSServiceType_NSEC3 = 50, /*! Hashed Authenticated Denial of Existence */ kDNSServiceType_NSEC3PARAM = 51, /*! Hashed Authenticated Denial of Existence */ kDNSServiceType_HIP = 55, /*! Host Identity Protocol */ kDNSServiceType_SPF = 99, /*! Sender Policy Framework for E-Mail */ kDNSServiceType_UINFO = 100, /*! IANA-Reserved */ kDNSServiceType_UID = 101, /*! IANA-Reserved */ kDNSServiceType_GID = 102, /*! IANA-Reserved */ kDNSServiceType_UNSPEC = 103, /*! IANA-Reserved */ kDNSServiceType_TKEY = 249, /*! Transaction key */ kDNSServiceType_TSIG = 250, /*! Transaction signature. */ kDNSServiceType_IXFR = 251, /*! Incremental zone transfer. */ kDNSServiceType_AXFR = 252, /*! Transfer zone of authority. */ kDNSServiceType_MAILB = 253, /*! Transfer mailbox records. */ kDNSServiceType_MAILA = 254, /*! Transfer mail agent records. */ kDNSServiceType_ANY = 255 /*! Wildcard match. */ };
Константы
-
kDNSServiceType_A
Адрес узла.
-
kDNSServiceType_NS
Авторитетный сервер.
-
kDNSServiceType_MD
Почтовое место назначения.
-
kDNSServiceType_MF
Почтовое средство передачи.
-
kDNSServiceType_CNAME
Каноническое имя.
-
kDNSServiceType_SOA
Запустите зоны полномочий.
-
kDNSServiceType_MB
Доменное имя почтового ящика.
-
kDNSServiceType_MG
Почтовый элемент группы.
-
kDNSServiceType_MR
Почта переименовывает имя.
-
kDNSServiceType_NULL
Нулевая ресурсная запись.
-
kDNSServiceType_WKS
Известная служба.
-
kDNSServiceType_PTR
Указатель доменного имени.
-
kDNSServiceType_HINFO
Информация об узле.
-
kDNSServiceType_MINFO
Информация о почтовых ящиках.
-
kDNSServiceType_MX
Почтовая маршрутная информация.
-
kDNSServiceType_TXT
Одна или более текстовых строк (НЕ «нуль или более...»).
-
kDNSServiceType_RP
Ответственное лицо.
-
kDNSServiceType_AFSDB
База данных ячейки AFS.
-
kDNSServiceType_X25
Адрес вызова X_25.
-
kDNSServiceType_ISDN
ISDN, вызывающий адрес.
-
kDNSServiceType_RT
Маршрутизатор.
-
kDNSServiceType_NSAP
Адрес NSAP.
-
kDNSServiceType_NSAP_PTR
Инвертируйте (осуждаемый) поиск NSAP.
-
kDNSServiceType_SIG
Подпись безопасности.
-
kDNSServiceType_KEY
Ключ защиты.
-
kDNSServiceType_PX
Почтовое отображение X.400.
-
kDNSServiceType_GPOS
Географическая (изъятая) позиция.
-
kDNSServiceType_AAAA
Адрес IPv6.
-
kDNSServiceType_LOC
Информация о расположении.
-
kDNSServiceType_NXT
Следующий домен (безопасность).
-
kDNSServiceType_EID
Идентификатор конечной точки.
-
kDNSServiceType_NIMLOC
Локатор Нимрода.
-
kDNSServiceType_SRV
Выбор сервера.
-
kDNSServiceType_ATMA
Адрес ATM
-
kDNSServiceType_NAPTR
Именование полномочий PoinTeR
-
kDNSServiceType_KX
Ключевой Exchange
-
kDNSServiceType_CERT
Запись сертификации
-
kDNSServiceType_A6
Адрес IPv6 (осужден)
-
kDNSServiceType_DNAME
Нетерминальный DNAME (для IPv6)
-
kDNSServiceType_SINK
(Экспериментальная) раковина
-
kDNSServiceType_OPT
Опция EDNS0 (метаRR)
-
kDNSServiceType_APL
Список префикса адреса
-
kDNSServiceType_DS
Подписывающее лицо делегации
-
kDNSServiceType_SSHFP
Ключевой цифровой отпечаток SSH
-
kDNSServiceType_IPSECKEY
IPSECKEY
-
kDNSServiceType_RRSIG
RRSIG
-
kDNSServiceType_NSEC
Отказ существования
-
kDNSServiceType_DNSKEY
DNSKEY
-
kDNSServiceType_DHCID
Идентификатор клиента DHCP
-
kDNSServiceType_NSEC3
Хешированный аутентифицируемый отказ существования
-
kDNSServiceType_NSEC3PARAM
Хешированный аутентифицируемый отказ существования
-
kDNSServiceType_HIP
Протокол идентификационных данных узла
-
kDNSServiceType_SPF
Платформа политики отправителя для электронной почты
-
kDNSServiceType_UINFO
ЗАРЕЗЕРВИРОВАННЫЙ IANA
-
kDNSServiceType_UID
ЗАРЕЗЕРВИРОВАННЫЙ IANA
-
kDNSServiceType_GID
ЗАРЕЗЕРВИРОВАННЫЙ IANA
-
kDNSServiceType_UNSPEC
ЗАРЕЗЕРВИРОВАННЫЙ IANA
-
kDNSServiceType_TKEY
Ключ Transaction
-
kDNSServiceType_TSIG
Подпись транзакции.
-
kDNSServiceType_IXFR
Инкрементная зональная передача.
-
kDNSServiceType_AXFR
Зона передачи полномочий.
-
kDNSServiceType_MAILB
Записи почтового ящика передачи.
-
kDNSServiceType_MAILA
Почтовые записи агента передачи.
-
kDNSServiceType_ANY
Подстановочное соответствие.
Обсуждение
Значения для Классов DNS и Типов перечислены в RFC 1035 и доступны на каждом OS в его заголовочном файле DNS. К сожалению, каждый OS не имеет того же заголовочного файла, содержащего Класс DNS и константы Типа, и имена констант не являются непротиворечивыми. Например, BIND 8 использует «T_A», BIND 9 использует «ns_t_a», Windows использует «DNS_TYPE_A» и т.д. Поэтому эти константы также перечислены здесь, так, чтобы код с помощью DNS-SD, программирующего APIs, мог использовать эти константы, так, чтобы тот же код мог скомпилировать на всех наших поддерживаемых платформах.
-
-
Осуждаемый.
Объявление
Objective C
enum { /*! MoreComing indicates to a callback that at least one more result is */ kDNSServiceFlagsMoreComing = 0x1, /*! */ kDNSServiceFlagsAdd = 0x2, /*! */ kDNSServiceFlagsDefault = 0x4, /*! Flag for specifying renaming behavior on name conflict when registering */ kDNSServiceFlagsNoAutoRename = 0x8, /*! */ kDNSServiceFlagsShared = 0x10, /*! */ kDNSServiceFlagsUnique = 0x20, /*! */ kDNSServiceFlagsBrowseDomains = 0x40, /*! */ kDNSServiceFlagsRegistrationDomains = 0x80, /*! Flag for creating a long-lived unicast query for the DNSServiceQueryRecord call. */ kDNSServiceFlagsLongLivedQuery = 0x100, /*! Flag for creating a record for which we will answer remote queries */ kDNSServiceFlagsAllowRemoteQuery = 0x200, /*! Flag for signifying that a query or registration should be performed exclusively via multicast */ kDNSServiceFlagsForceMulticast = 0x400, /*! @abstract Deprecated. */ kDNSServiceFlagsForce = 0x800 , // This flag is deprecated. /*! */ kDNSServiceFlagsKnownUnique = 0x800, /*! Flag for returning intermediate results. */ kDNSServiceFlagsReturnIntermediates = 0x1000, /*! A service registered with the NonBrowsable flag set can be resolved using */ kDNSServiceFlagsNonBrowsable = 0x2000, /*! For efficiency, clients that perform many concurrent operations may want to use a */ kDNSServiceFlagsShareConnection = 0x4000, /*! */ kDNSServiceFlagsSuppressUnusable = 0x8000, /*! */ kDNSServiceFlagsTimeout = 0x10000, /*! */ kDNSServiceFlagsIncludeP2P = 0x20000, /*! */ kDNSServiceFlagsWakeOnResolve = 0x40000, /*! */ kDNSServiceFlagsBackgroundTrafficClass = 0x80000, /*! */ kDNSServiceFlagsIncludeAWDL = 0x100000, /*! */ kDNSServiceFlagsValidate = 0x200000, /*! */ kDNSServiceFlagsSecure = 0x200010, /*! */ kDNSServiceFlagsInsecure = 0x200020, /*! */ kDNSServiceFlagsBogus = 0x200040, /*! */ kDNSServiceFlagsIndeterminate = 0x200080, /*! */ kDNSServiceFlagsUnicastResponse = 0x400000, /*! */ kDNSServiceFlagsValidateOptional = 0x800000, /*! */ kDNSServiceFlagsWakeOnlyService = 0x1000000, /* * This flag is meaningful only in DNSServiceBrowse. When set, * the system will stop issuing browse queries on the network once the number * of answers returned is one or more. It will issue queries on the network * again if the number of answers drops to zero. * This flag is for Apple internal use only. Third party developers * should not rely on this behavior being supported in any given software release. */ kDNSServiceFlagsThresholdOne = 0x2000000, /* * This flag is meaningful only in DNSServiceBrowse. When set, * the system will stop issuing browse queries on the network once the number * of answers has reached the threshold set for Finder. * It will issue queries on the network again if the number of answers drops below * this threshold. * This flag is for Apple internal use only. Third party developers * should not rely on this behavior being supported in any given software release. */ kDNSServiceFlagsThresholdFinder = 0x4000000, /* * When this flag is set in the client callback add or remove event, * it indicates that the browse answer threshold has been reached and no * browse requests will be generated on the network until the number of answers falls * below the threshold value. Add and remove events can still occur based * on incoming Bonjour traffic observed by the system. * The set of services return to the client is not guaranteed to represent the * entire set of services present on the network once the threshold has been reached. * * Note, while kDNSServiceFlagsThresholdReached and kDNSServiceFlagsThresholdOne * have the same value, there isn't a conflict because kDNSServiceFlagsThresholdReached * is only set in the callbacks and kDNSServiceFlagsThresholdOne is only set on * input to a DNSServiceBrowse call. */ kDNSServiceFlagsThresholdReached = kDNSServiceFlagsThresholdOne, };
Константы
-
kDNSServiceFlagsMoreComing
MoreComing указывает к обратному вызову, что, по крайней мере, еще один результат ставится в очередь и будет поставлен следующий сразу после этого. Когда флаг MoreComing установлен, приложения не должны сразу обновлять свой UI, потому что это может привести к большому уродливому мерцанию на экране и может потратить впустую много процессорного времени, неоднократно обновляющего экран с содержанием, тогда сразу стирающимся, много раз. Приложения должны ожидать, пока MoreComing не установлен, и затем обновите их UI, когда больше изменений не неизбежно.
Когда MoreComing не установлен, который не означает, что больше не будет ответов EVER, просто что больше нет ответов, сразу доступных прямо сейчас в сейчас же. Если больше ответов станет доступным в будущем, то они будут поставлены, как обычно.
-
kDNSServiceFlagsAdd
Указывает, что недавно обнаружен домен. Если НЕ набор, указывает «Удалять», т.е. домен больше не действителен. Используемый в доменном перечислении и обзоре/запросе отвечают обратным вызовам.
-
kDNSServiceFlagsDefault
Указывает, что этот домен должен быть выбран по умолчанию. Применяется только к перечислению и только допустим в сочетании с, «Добавляют».
-
kDNSServiceFlagsNoAutoRename
Флаг для указания поведения переименования на конфликте имен, когда регистрация несовместно использовала записи. По умолчанию конфликты имен автоматически обрабатываются путем переименования службы. NoAutoRename переопределяет это поведение - с этим набором флага, конфликты имен приведут к обратному вызову. Флаг NoAutorename только допустим, если имя явно указано при регистрации службы (т.е. имя по умолчанию не используется.)
-
kDNSServiceFlagsShared
Флаг для регистрации частного лица записывает на связанном DNSServiceRef. Совместно использованный указывает, что могут быть многократные записи с этим именем в сети (например, записи PTR).
-
kDNSServiceFlagsUnique
Указывает, что имя записи должно быть уникальным в сети (например, записи SRV).
-
kDNSServiceFlagsBrowseDomains
Перечисляет домены, рекомендуемые для просмотра. Используемый для указания доменного перечисления вводят в DNSServiceEnumerateDomains.
-
kDNSServiceFlagsRegistrationDomains
Перечисляет домены, рекомендуемые для регистрации. Используемый для указания доменного перечисления вводят в DNSServiceEnumerateDomains.
-
kDNSServiceFlagsLongLivedQuery
Флаг для создания долгосрочной одноадресной передачи запрашивает для вызова DNSServiceQueryRecord.
-
kDNSServiceFlagsAllowRemoteQuery
Флаг для создания записи, для которой мы ответим на удаленные запросы (запросы от узлов больше чем один транзитный участок далеко; узлы, не непосредственно подключенные к локальной ссылке).
-
kDNSServiceFlagsForceMulticast
Флаг для выражения, что запрос или регистрация должны быть выполнены исключительно через многоадресную передачу DNS, даже для имени в домене (например, foo.apple.com.), который обычно подразумевал бы одноадресную передачу DNS.
-
kDNSServiceFlagsKnownUnique
Клиент гарантирует, что рекордные имена уникальны, таким образом, мы можем пропустить отсылку первоначальных тестовых сообщений. Если конфликт обнаружен, разрешение конфликтов стандартного имени все еще сделано. В настоящее время только допустимый для вызова DNSServiceRegister.
-
kDNSServiceFlagsReturnIntermediates
Флаг для возврата промежуточных результатов. Например, если результаты запроса в авторитетном NXDomain (имя не существует), тогда, что результат возвращается клиенту. Однако, запрос неявно не отменяется - это остается активным и если ответ впоследствии изменяется (например, потому что туннель VPN впоследствии установлен), тогда, что положительный результат будет все еще возвращен клиенту. Точно так же, если результаты запроса в записи CNAME, то в дополнение к следующему рекомендация CNAME, промежуточный результат CNAME также возвращается клиенту. Когда этот флаг не установлен, ошибки NXDomain не возвращаются, и записи CNAME сопровождаются тихо, не сообщая клиенту промежуточных шагов. (В более ранних сборках этот флаг кратко вызвали kDNSServiceFlagsReturnCNAME.)
-
kDNSServiceFlagsNonBrowsable
Служба, зарегистрированная в наборе флага NonBrowsable, может быть разрешена с помощью
DNSServiceResolve
, но не будет поддающееся обнаружению использованиеDNSServiceBrowse
. Это для случаев, где именем является фактически GUID; это найдено другими средними значениями; нет никакого преимущества для конечных пользователей к просмотру для нахождения длинного списка непрозрачного GUIDs. Используя NonBrowsable флаг создает SRV+TXT без стоимости также распространения связанной записи PTR. -
kDNSServiceFlagsShareConnection
Для эффективности клиенты, выполняющие много параллельных операций, могут хотеть использовать единственное Сокетное соединение Домена Unix с фоновым демоном, вместо того, чтобы иметь отдельное соединение для каждой независимой работы. Для использования этого режима клиенты сначала вызывают DNSServiceCreateConnection (&MainRef) для инициализации основного DNSServiceRef. Для каждой последующей работы, которая должна совместно использовать то же самое соединение, клиент копирует MainRef, и затем передает адрес той копии, устанавливая флаг ShareConnection, чтобы сказать библиотеке, что этим DNSServiceRef не является типичный неинициализированный DNSServiceRef; это - копия существующего DNSServiceRef, информация о соединении которого должна быть снова использована.
Например:
DNSServiceErrorType error;
DNSServiceRef MainRef;
error = DNSServiceCreateConnection(&MainRef);
if (error) ...
DNSServiceRef BrowseRef = MainRef; // Important: COPY the primary DNSServiceRef first...
error = DNSServiceBrowse(&BrowseRef, kDNSServiceFlagsShareConnection, ...); // then use the copy
if (error) ...
...
DNSServiceRefDeallocate(BrowseRef); // Terminate the browse operation
DNSServiceRefDeallocate(MainRef); // Terminate the shared connection
Примечания:
Коллективный
kDNSServiceFlagsMoreComing
отметьте, Когда обратные вызовы будут вызваны с помощью совместно используемого DNSServiceRef,kDNSServiceFlagsMoreComing
флаг применяется коллективно к *все* активные операции, совместно использующие тот же родительский DNSServiceRef. Если флаг MoreComing установлен, это означает, что существует больше результатов, поставленных в очередь на этом родительском DNSServiceRef, но не обязательно больше результатов для этой определенной функции обратного вызова. Импликация этого для клиентских программистов - то, что, когда обратный вызов вызывается с набором флага MoreComing, код должен обновить свои внутренние структуры данных с новым результатом и установить переменную, указывающую, что должен быть обновлен его UI. Затем позже когда обратный вызов в конечном счете вызывается с флагом MoreComing не набор, код должен обновить *, все* лишают новизны элементы UI, связанные с тем совместно используемым родительским DNSServiceRef, которым нужно обновление, не только элементы UI, связанные с определенным обратным вызовом, который, оказалось, был последним, который будет вызван.Отмена операций и
kDNSServiceFlagsMoreComing
Каждый раз, когда Вы отменяете любую работу, для которой Вы задержали обновления UI, ожидающие из-за akDNSServiceFlagsMoreComing
флаг, необходимо выполнить те задержанные обновления UI. Это вызвано тем, что, после отмены работы, Вы больше не можете ожидать обратного вызова *без* набор MoreComing, чтобы сказать о выполнении задержанных обновлений UI (работа была отменена, таким образом, больше не будет обратных вызовов). Импликация коллективаkDNSServiceFlagsMoreComing
флаг для общих соединений - то, что эта инструкция применяется более широко - любое время, Вы отменяете работу на общем соединении, необходимо выполнить, все задержали обновления UI для всех операций, совместно использующих то соединение. Это вызвано тем, что флаг MoreComing, возможно, относился к событиям, прибывающим для работы, которую Вы отменили, который не будет теперь прибывать, потому что была отменена работа.Только совместно используйте DNSServiceRef, создаваемый с Вызовом DNSServiceCreateConnection, DNSServiceCreateConnection (&ref) создает специальный общий DNSServiceRef. DNSServiceRef, создаваемый другими вызовами как
DNSServiceBrowse
илиDNSServiceResolve
не может быть совместно использован путем копирования их и использованияkDNSServiceFlagsShareConnection
.Не Удваивайтесь - Освобождают Вызов, DNSServiceRefDeallocate (касательно) для DNSServiceRef определенной работы завершает просто ту работу. Вызов DNSServiceRefDeallocate (касательно) для основного совместно используемого DNSServiceRef (родительский DNSServiceRef, первоначально создаваемый DNSServiceCreateConnection (&ref)) автоматически, завершает общее соединение и все операции, все еще использовавшие его. После выполнения этого тогда не пытайтесь освободить любой остающийся подчиненный DNSServiceRef. Память, используемая теми подчиненными DNSServiceRef, была уже освобождена, таким образом, любая попытка сделать DNSServiceRefDeallocate (или любая другая работа) на них приведет к доступам к освобожденной памяти, приводя к катастрофическим отказам или другим одинаково нежелательным результатам.
Потокобезопасность dns_sd.h API не предполагает определенной модели потоков, и следовательно не делает никакой собственной блокировки (который потребовал бы соединения некоторой определенной библиотеки поточной обработки). Если клиентский код вызывает подпрограммы API на том же DNSServiceRef одновременно от многократных потоков, это - ответственность клиента использовать блокировку mutext или принять подобные надлежащие меры предосторожности для сериализации тех вызовов.
-
kDNSServiceFlagsSuppressUnusable
Этот флаг значим только в DNSServiceQueryRecord, подавляющем неприменимые запросы на проводе. Если «имя хоста» является глобальной одноадресной передачей имя хоста DNS (т.е. не «.local». имя), но этот узел не имеет никакого routable адреса IPv6, тогда вызов не попытается искать адреса IPv6 для «имени хоста», так как любые адреса, которые это нашло, вряд ли будут иметь любое применение так или иначе. Точно так же, если этот узел не будет иметь никакого routable адреса IPv4, то вызов не попытается искать адреса IPv4 для «имени хоста».
-
kDNSServiceFlagsTimeout
Когда передано
DNSServiceQueryRecord
илиDNSServiceGetAddrInfo
, запрос останавливается после определенного числа секунд протекли. Время, в которое останавливается запрос, определяется системой и не может быть сконфигурировано пользователем. Запрос останавливается независимо от того, был ли ответ дан ранее или нет. Когда запрос останавливается, обратный вызов вызывают с кодом ошибкиkDNSServiceErr_Timeout
и NULL sockaddr возвращается дляDNSServiceGetAddrInfo
и нулевая длина rdata возвращается дляDNSServiceQueryRecord
. -
kDNSServiceFlagsIncludeP2P
Включайте интерфейсы P2P когда
kDNSServiceInterfaceIndexAny
указан. По умолчанию, указаниеkDNSServiceInterfaceIndexAny
не включает интерфейсы P2P. -
kDNSServiceFlagsWakeOnResolve
Этот флаг значим только в DNSServiceResolve. Когда установлено, это пытается отправить волшебный пакет для пробуждения клиента.
-
kDNSServiceFlagsBackgroundTrafficClass
Этот флаг значим в DNSServiceBrowse, DNSServiceGetAddrInfo, DNSServiceQueryRecord и DNSServiceResolve. Когда установлено, это использует класс фонового трафика для пакетов та служба запрос.
-
kDNSServiceFlagsIncludeAWDL
Включайте интерфейс AWDL когда
kDNSServiceInterfaceIndexAny
указан. -
kDNSServiceFlagsValidate
Этот флаг значим в DNSServiceGetAddrInfo и DNSServiceQueryRecord. Это - флаг ONLY, который и допустим как ввод к APIs и также как вывод посредством обратных вызовов в APIs.
Когда этот флаг передается DNSServiceQueryRecord и DNSServiceGetAddrInfo для разрешения одноадресных имен, ответ проверен с помощью DNSSEC. Результаты проверки поставлены с помощью поля флагов в обратном вызове и
kDNSServiceFlagsValidate
отмечен во флагах, чтобы указать, что состояние DNSSEC также доступно. Когда обратный вызов вызывают для поставки результатов запроса, результаты проверки могут или могут не быть доступными. Если это не поставлено вместе с результатами, состояние проверки поставлено, когда завершается проверка.Когда результаты проверки поставлены в обратном вызове, он обозначен путем маркировки флагов с
kDNSServiceFlagsValidate
иkDNSServiceFlagsAdd
вместе с флагами состояния DNSSEC (описанный ниже) и NULL sockaddr возвращается для DNSServiceGetAddrInfo, и нулевая длина rdata возвращается для DNSServiceQueryRecord. Результаты проверки DNSSEC для целого RRSet и не только отдельных записей, поставленных в обратном вызове. КогдаkDNSServiceFlagsAdd
не установлен во флагах, приложения должны неявно предположить, что состояние DNSSEC RRSet, поставленного вплоть до той точки, не допустимо больше, пока с другим обратным вызовом не вызываютkDNSServiceFlagsAdd
иkDNSServiceFlagsValidate
.kDNSServiceFlagsValidate
,kDNSServiceFlagsSecure
,kDNSServiceFlagsInsecure
, иkDNSServiceFlagsBogus
флаги указывают состояние проверки DNSSEC и отмеченный в поле флагов обратного вызова. Когда любой из этих четырех флагов установлен,kDNSServiceFlagsValidate
также установлен. Для проверки состояния проверки другие применимые выходные флаги должны быть замаскированы. ПосмотритеkDNSServiceOutputFlags
ниже. -
kDNSServiceFlagsSecure
Ответ был проверен путем проверки всего signaures в ответе и смог создать цепочку успешной аутентификации, запускающуюся с известной доверительной привязки.
-
kDNSServiceFlagsInsecure
Цепочка доверия не может быть создана, запустившись с известного, доверяют привязку ответу.
-
kDNSServiceFlagsBogus
Если ответ не может быть проверен, чтобы быть безопасным вследствие подписей с истекшим сроком, недостающих подписей, и т.д., то результаты считаются поддельными.
-
kDNSServiceFlagsIndeterminate
Нет никакой допустимой доверительной привязки, которая может использоваться, чтобы определить, безопасен ли ответ или нет.
-
kDNSServiceFlagsUnicastResponse
Запросите одноадресный ответ на запрос.
-
kDNSServiceFlagsValidateOptional
Этот флаг идентичен
kDNSServiceFlagsValidate
за исключением случая, где не может быть проверен ответ. Если этот флаг будет установлен в DNSServiceQueryRecord или DNSServiceGetAddrInfo, то записи DNSSEC будут требовать на проверку. Если они не могут быть получены по некоторым причинам во время проверки (например, зона не подписывается, зона подписывается, но не может быть прослежена до корня, рекурсивный сервер не понимает DNSSEC и т.д.), то это отступает к поведению по умолчанию, где проверка не выполняется, и никакие результаты DNSSEC не предоставлены.Если зона подписывается и существует допустимый путь к известной доверительной привязке, сконфигурированной в системе, и приложение требует проверки DNSSEC независимо от осведомленности DNSSEC в текущей сети, то эта опция MUST не используется. Это только предназначается, чтобы использоваться во время переходного периода, где различные узлы, участвующие в разрешении DNS, могут не понять DNSSEC или управляемый должным образом (например, недостающая запись DS), но все еще хотеть быть в состоянии разрешить DNS успешно.
-
kDNSServiceFlagsWakeOnlyService
Этот флаг значим только в DNSServiceRegister. Когда установлено, служба не регистрируется в прокси-сервере сна во время сна.
Обсуждение
Большинство API-функций DNS-SD и обратных вызовов включают параметр DNSServiceFlags. Как правило любой данный бит в 32-разрядном поле флагов имеет определенное фиксированное значение, независимо от функции или используемого обратного вызова. Для любой заданной функции или обратного вызова, обычно только подмножество возможных флагов значимо, и все другие должны быть нулем. Раздел обсуждения для каждого вызова API описывает, какие флаги допустимы для того вызова и обратного вызова. В некоторых случаях, для определенного вызова, может случиться так, что никакие флаги в настоящее время не определяются, когда параметр DNSServiceFlags существует просто для разрешения будущего расширения. Во всех случаях разработчики должны ожидать, что в будущих выпусках, возможно, что новые флаговые значения будут определены, и код записи с этим в памяти. Например, тестирующий код
if (flags == kDNSServiceFlagsAdd) ...
если в будущем выпуске другой бит в 32-разрядном поле флагов будет также установлен, перестанет работать. Надежный способ протестировать, установлен ли определенный бит, не с тестом равенства, а с поразрядной маской:
if (flags & kDNSServiceFlagsAdd) ...
За исключением
kDNSServiceFlagsValidate
, каждый флаг может быть допустимым (быть установленным) EITHER только как ввод к одному из DNSService* (), APIs OR только как вывод (обеспечьте состояние) посредством любого из используемых обратных вызовов. Например,kDNSServiceFlagsAdd
может быть установлен только как вывод в обратном вызове, тогда какkDNSServiceFlagsIncludeP2P
может быть установлен только как ввод к DNSService* () APIs. См. комментарииkDNSServiceFlagsValidate
определенный в этом перечислении. -
-
Возможные протоколы для
DNSServiceNATPortMappingCreate
.Объявление
Objective C
enum { /* for DNSServiceGetAddrInfo () */ kDNSServiceProtocol_IPv4 = 0x01, /*! IPv4 protocol. */ kDNSServiceProtocol_IPv6 = 0x02, /*! IPv6 protocol. */ /* 0x04 and x08 reserved for future internetwork protocols */ /* for DNSServiceNATPortMappingCreate () */ kDNSServiceProtocol_UDP = 0x10, /*! UDP protocol. */ kDNSServiceProtocol_TCP = 0x20 /*! TCP protocol. */ /* 0x40 and x80 reserved for future transport protocols, e.g. SCTP [RFC 2960] * or DCCP [RFC 4340]. If future NAT gateways are created that support port * mappings for these protocols, new constants will be defined here. */ };
Константы