Разрешение имен хоста DNS

Эта статья объясняет, как разрешить имя хоста DNS в пути, предлагающем Вам максимальную гибкость.

Существует три основных APIs в OS X и iOS для разрешения имен хоста: NSHost (только в OS X), CFHost, и преобразователь POSIX API.

Разрешение имен хоста с CFHost

Разрешить узел с CFHost:

  1. Создайте a CFHostRef объект путем вызова CFHostCreateWithName.

  2. Вызвать CFHostSetClient и обеспечьте объект контекста по Вашему выбору и функцию обратного вызова, которую вызовут, когда завершится разрешение.

  3. Вызвать CFHostScheduleWithRunLoop запланировать преобразователь на Ваш цикл выполнения.

  4. Вызвать CFHostStartInfoResolution сказать преобразователю начинать разрешать, передавать kCFHostAddresses как второй параметр, чтобы указать, что Вы хотите, чтобы он возвратил IP-адреса.

  5. Ожидайте преобразователя для вызова обратного вызова. В Вашем обратном вызове получите результаты путем вызова CFHostGetAddressing. Эта функция возвращает массив CFDataRef объекты, каждый из которых содержит POSIX sockaddr структура.

Процесс для обратного определения имен (переводящий IP-адрес в имя хоста) подобен, за исключением того, что Вы вызываете CFHostCreateWithAddress создать объект, передачу kCFHostNames к CFHostStartInfoResolution, и вызовите CFHostGetNames получать результаты.

Разрешение имен хоста с вызовами POSIX

Если Вы намереваетесь использовать вызовы POSIX для разрешения имен хоста, знают, что эти вызовы синхронны и не должны использоваться на основном потоке в приложении GUI. Вместо этого необходимо или создать отдельный поток POSIX или задачу GCD и выполнить эти вызовы в том контексте.

POSIX определяет три функции в <netdb.h> для разрешения имен хоста:

getaddrinfo

Возвраты все разрешенные адреса для данного имени хоста. Эта функция является предпочтительным способом получить адресную информацию на уровне POSIX. Можно счесть пример кода в его странице справочника (соединенным выше).

Важный: Некоторые более старые серверы DNS не отвечают на запросы поиска IPv6 с ошибкой. POSIX getaddrinfo функционируйте пытается скрыть это неправомерное поведение путем отмены выдающихся запросов IPv6 вскоре после получения успешного ответа IPv4. Если Ваше приложение получило бы преимущества от продолжения получить адреса IPv6, пока Вы не соединяетесь успешно (вместо того, чтобы остановиться, как только у Вас есть адрес IPv4, который мог бы или не мог бы работать), то необходимо использовать асинхронный API такой как CFHost.

gethostbyname

Возвращает единственный адрес IPv4 для данного имени хоста. Этой функции обескураживают для новой разработки, потому что это ограничивается адресами IPv4.

gethostbyname2

Возвращает единственный адрес для данного имени хоста в указанном семействе адресов (AF_INET, AF_INET6, и т.д.).

Несмотря на то, что эта функция позволяет Вам обходить ограничения IPv4 gethostbyname, это все еще ограничивает Вашу возможность попробовать многократные адреса сразу и выбрать самый быстрый. Таким образом эта функция прежде всего предназначается как почти понижение замены для gethostbyname в существующем коде. getaddrinfo предпочтен для использования в новом коде.

Для обратного определения имен (переводящий IP-адрес в имя хоста), обеспечивает POSIX getnameinfo и gethostbyaddr. getnameinfo функция предпочтена, потому что это более гибко.

Для узнавания больше об этих функциях считайте их соответствующие страницы справочника, соединенные выше.