Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

Входные данные функции

getaddrinfo
могут относиться к двум различным типам, которые выбираются в зависимости от того, какой тип структуры адреса сокета вызывающий процесс хочет получить обратно и какой тип записей нужно искать в DNS или иной базе данных.

Семейством адресов, указанным вызывающим процессом в структуре

hints
, задается тип структуры адреса сокета, который вызывающий процесс предполагает получить. Если вызывающий процесс задает
AF_INET
, функция не должна возвращать структуры
sockaddr_in6
, а для
AF_INET6
функция не должна возвращать структур
sockaddr_in
.

POSIX утверждает, что при задании семейства

AF_UNSPEC
должны возвращаться адреса, которые могут использоваться с любымсемейством протоколов, допускающим применение имени узла и имени службы. Это подразумевает, что если у узла имеются как записи типа AAAA, так и записи типа А, то записи типа AAAA возвращаются как структуры
sockaddr_in6
, а записи типа A — как структуры
sockaddr_in
. Нет смысла возвращать еще и записи типа А как адреса IPv4, преобразованные к виду IPv6, в структурах
sockaddr_in6
, потому что при этом не возвращается никакой дополнительной информации — эти адреса уже возвращены в структурах
sockaddr_in
.

Это утверждение POSIX также подразумевает, что если флаг

AI_PASSIVE
задан без имени узла, то должен быть возвращен универсальный адрес IPv6 (
IN6ADDR_ANY_INIT
или 0::0) в структуре
sockaddr_in6
вместе с универсальным адресом IPv4 (
INADDR_ANY
или 0.0.0.0) в структуре
sockaddr_in
. Также нет смысла возвращать сначала универсальный адрес IPv4, поскольку мы увидим в разделе 12.2, что на узле с двойным стеком сокет сервера IPv6 может обрабатывать и клиенты IPv4, и клиенты IPv6.

Семейство адресов, указанное в поле

ai_family
структуры
hint
вместе с флагами
AI_V4MAPPED
и
AI_ALL
поля
ai_flags
, задают тип записей, поиск которых ведется в DNS (тип А или тип AAAA), и тип возвращаемых адресов (IPv4, IPv6 или IPv4, преобразованные к виду IPv6). Мы обобщили это в табл. 11.3.

Имя узла может также быть либо шестнадцатеричной строкой IPv6, либо строкой в точечно-десятичной записи IPv4. Допустимость этой строки зависит от семейства адресов, заданного вызывающим процессом. Шестнадцатеричная строка IPv6 неприемлема, если задано семейство

AF_INET
, а строка в точечно-десятичной записи IPv4 неприемлема, если задано семейство
AF_INET6
. Но если задано семейство
AF_UNSPEC
, то допустимы оба варианта, и при этом возвращается соответствующий тип структуры адреса сокета.

ПРИМЕЧАНИЕ

Можно возразить, что если в качестве семейства протоколов задано AF_INET6, строка в точечно-десятичной записи должна возвращаться как адрес IPv4, преобразованный к виду IPv6 в структуре sockaddr_in6. Но другим способом получения этого результата является установка префикса строки с десятичной точкой 0::ffff:.

В табл. 11.3 показано, как будут обрабатываться адреса IPv4 и IPv6 функцией

getaddrinfo
. Колонка «Результат» отражает то, что мы хотим возвратить вызывающему процессу, если входные переменные таковы, как показано в первых трех колонках. Колонка «Действия» — то, каким образом мы получаем этот результат.

Таблица 11.3. Функция getaddrinfo: ее действия и результаты

  • Читать дальше
  • 1
  • ...
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку:

Имя узла, указанное вызывающим процессом Семейство адресов, указанное вызывающим процессом Строка с именем узла содержит Результат Действия
Ненулевая строка с именем узла; активное или пассивное открытие AF_UNSPEC Имя узла Все записи AAAA возвращаются как структуры sockaddr_in6{} и все записи А возвращаются как структуры sockaddr_in{} Поиск по записям AAAA и поиск по записям A
Шестнадцатеричная строка Одна структура sockaddr_in6{} inet_pton(AF_INET6)
Строка в точечно- десятичной записи Одна структура sockaddr_in{} inet_pton(AF_INET)
AF_INET6 Имя узла Все записи AAAA возвращаются как структуры sockaddr_in6{} либо все записи А возвращаются как структуры sockaddr_in6{} с адресами IPv4, преобразованными к виду IPv6 Поиск по записям AAAA
Шестнадцатеричная строка Одна структура sockaddr_in6{} inet_pton(AF_INET6)
Строка в точечно-десятичной записи Ищется как имя узла
AF_INET Имя узла Все записи А возвращаются как структуры sockaddr_in{} Поиск по записям типа A
Шестнадцатеричная строка Ошибка: EAI_ADDRFAMILY
Строка в точечно-десятичной записи Одна структура sockaddr_in{} inet_pton(AF_INET)
Пустая строка с именем узла; пассивное открытие AF_UNSPEC Неявный адрес 0::0 Неявный адрес 0.0.0.0 Одна структура sockaddr_in6{} и одна структура sockaddr_in{} inet_pton(AF_INET6) inet_pton(AF_INET)
AF_INET6 Неявный адрес 0::0 Одна структура sockaddr_in6{} inet_pton(AF_INET6)
AF_INET Неявный адрес 0.0.0.0 Одна структура sockaddr_in{} inet_pton(AF_INET)
Пустая строка с именем узла; активное открытие AF_UNSPEC Неявный адрес 0::1 Неявный адрес 127.0.0.1 Одна структура sockaddr_in6{} и одна структура sockaddr_in{} inet_pton(AF_INET6) inet_pton(AF_INET)