Разрешение имен хоста DNS
Эта статья объясняет, как разрешить имя хоста DNS в пути, предлагающем Вам максимальную гибкость.
Существует три основных APIs в OS X и iOS для разрешения имен хоста: NSHost
(только в OS X), CFHost
, и преобразователь POSIX API.
NSHost — Несмотря на то, что передавая
NSHost
распространенный способ передать имена хоста другому APIs, с помощьюNSHost
разрешить адреса самостоятельно обычно обескураживают, потому что это - синхронный API. Таким образом использование его на основном потоке может вызвать серьезное ухудшение производительности. Поскольку этому API обескураживают, его использование не описано здесь.CFHost —
CFHost
API позволяет Вам выполнять разрешение асинхронно и является предпочтительным способом разрешить имена хоста, если необходимо разрешить их сами.Уровень POSIX — The POSIX обеспечивает несколько функций для разрешения имен хоста. Эти функции должны использоваться, только если Вы пишете переносимый код, который должен быть совместно использован с платформами не-Apple или если Вы интегрируете свой код с существующим сетевым кодом POSIX.
Разрешение имен хоста с CFHost
Разрешить узел с CFHost
:
Создайте a
CFHostRef
объект путем вызоваCFHostCreateWithName
.Вызвать
CFHostSetClient
и обеспечьте объект контекста по Вашему выбору и функцию обратного вызова, которую вызовут, когда завершится разрешение.Вызвать
CFHostScheduleWithRunLoop
запланировать преобразователь на Ваш цикл выполнения.Вызвать
CFHostStartInfoResolution
сказать преобразователю начинать разрешать, передаватьkCFHostAddresses
как второй параметр, чтобы указать, что Вы хотите, чтобы он возвратил IP-адреса.Ожидайте преобразователя для вызова обратного вызова. В Вашем обратном вызове получите результаты путем вызова
CFHostGetAddressing
. Эта функция возвращает массивCFDataRef
объекты, каждый из которых содержит POSIXsockaddr
структура.
Процесс для обратного определения имен (переводящий IP-адрес в имя хоста) подобен, за исключением того, что Вы вызываете CFHostCreateWithAddress
создать объект, передачу kCFHostNames
к CFHostStartInfoResolution
, и вызовите CFHostGetNames
получать результаты.
Разрешение имен хоста с вызовами POSIX
Если Вы намереваетесь использовать вызовы POSIX для разрешения имен хоста, знают, что эти вызовы синхронны и не должны использоваться на основном потоке в приложении GUI. Вместо этого необходимо или создать отдельный поток POSIX или задачу GCD и выполнить эти вызовы в том контексте.
POSIX определяет три функции в <netdb.h>
для разрешения имен хоста:
Возвраты все разрешенные адреса для данного имени хоста. Эта функция является предпочтительным способом получить адресную информацию на уровне POSIX. Можно счесть пример кода в его странице справочника (соединенным выше).
Важный: Некоторые более старые серверы DNS не отвечают на запросы поиска IPv6 с ошибкой. POSIX
getaddrinfo
функционируйте пытается скрыть это неправомерное поведение путем отмены выдающихся запросов IPv6 вскоре после получения успешного ответа IPv4. Если Ваше приложение получило бы преимущества от продолжения получить адреса IPv6, пока Вы не соединяетесь успешно (вместо того, чтобы остановиться, как только у Вас есть адрес IPv4, который мог бы или не мог бы работать), то необходимо использовать асинхронный API такой какCFHost
.Возвращает единственный адрес IPv4 для данного имени хоста. Этой функции обескураживают для новой разработки, потому что это ограничивается адресами IPv4.
Возвращает единственный адрес для данного имени хоста в указанном семействе адресов (
AF_INET
,AF_INET6
, и т.д.).Несмотря на то, что эта функция позволяет Вам обходить ограничения IPv4
gethostbyname
, это все еще ограничивает Вашу возможность попробовать многократные адреса сразу и выбрать самый быстрый. Таким образом эта функция прежде всего предназначается как почти понижение замены дляgethostbyname
в существующем коде.getaddrinfo
предпочтен для использования в новом коде.
getaddrinfo
gethostbyname
gethostbyname2
Для обратного определения имен (переводящий IP-адрес в имя хоста), обеспечивает POSIX getnameinfo
и gethostbyaddr
. getnameinfo
функция предпочтена, потому что это более гибко.
Для узнавания больше об этих функциях считайте их соответствующие страницы справочника, соединенные выше.