Разрешение имен хоста DNS
Эта статья объясняет, как разрешить имя хоста DNS в пути, предлагающем Вам максимальную гибкость.
Существует три основных APIs в OS X и iOS для разрешения имен хоста: NSHost (только в OS X), CFHost, и преобразователь POSIX API.
NSHost — Несмотря на то, что передавая
NSHostраспространенный способ передать имена хоста другому APIs, с помощьюNSHostразрешить адреса самостоятельно обычно обескураживают, потому что это - синхронный API. Таким образом использование его на основном потоке может вызвать серьезное ухудшение производительности. Поскольку этому API обескураживают, его использование не описано здесь.CFHost —
CFHostAPI позволяет Вам выполнять разрешение асинхронно и является предпочтительным способом разрешить имена хоста, если необходимо разрешить их сами.Уровень 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предпочтен для использования в новом коде.
getaddrinfogethostbynamegethostbyname2Для обратного определения имен (переводящий IP-адрес в имя хоста), обеспечивает POSIX getnameinfo и gethostbyaddr. getnameinfo функция предпочтена, потому что это более гибко.
Для узнавания больше об этих функциях считайте их соответствующие страницы справочника, соединенные выше.