Книга: UNIX: разработка сетевых приложений
11.9. Функция getaddrinfo: IPv6
11.9. Функция getaddrinfo: IPv6
Стандарт POSIX определяет как getaddrinfo
, так и возвращаемые этой функцией данные для протоколов IPv4 и IPv6. Отметим следующие моменты, прежде чем свести возвращаемые значения воедино в табл. 11.3.
? Входные данные функции 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: ее действия и результаты
Имя узла, указанное вызывающим процессом | Семейство адресов, указанное вызывающим процессом | Строка с именем узла содержит | Результат | Действия |
---|---|---|---|---|
Ненулевая строка с именем узла; активное или пассивное открытие | 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) |
AF_INET6 | Неявный адрес 0::1 | Одна структура sockaddr_in6{} | inet_pton(AF_INET6) | |
AF_INET | Неявный адрес 127.0.0.1 | Одна структура sockaddr_in{} | inet_pton(AF_INET) |
Обратите внимание, что табл. 11.3 описывает только обработку адресов IPv4 и IPv6 функцией getaddrinfo
, то есть количество и тип адресов, возвращаемых процессу в различных ситуациях. Реальное количество структур addrinfo
зависит также от типа сокета и имени службы, о чем уже говорилось в связи с табл. 11.1.
- 11.1. Введение
- 11.2. Система доменных имен
- 11.3. Функция gethostbyname
- 11.4 Функция gethostbyaddr
- 11.5. Функции getservbyname и getservbyport
- 11.6. Функция getaddrinfo
- 11.7. Функция gai_strerror
- 11.8. Функция freeaddrinfo
- 11.9. Функция getaddrinfo: IPv6
- 11.10. Функция getaddrinfo: примеры
- 11.11. Функция host_serv
- 11.12. Функция tcp_connect
- 11.13. Функция tcp_listen
- 11.14. Функция udp_client
- 11.15. Функция udp_connect
- 11.16. Функция udp_server
- 11.17. Функция getnameinfo
- 11.18. Функции, допускающие повторное вхождение
- 11.19. Функции gethostbyname_r и gethostbyaddr_r
- 11.20. Устаревшие функции поиска адресов IPv6
- 11.21. Другая информация о сетях
- 11.22. Резюме
- Упражнения
- 2.1.3. Функция getopt_long()
- Группировка по встроенным функциям и UDF
- 19.1.1. Функция jQuery()
- Функция strcmp( )
- Управление функциями узла
- Функция программного обеспечения
- 3.2. Ключи типа key_t и функция ftok
- 9.10. Функция sctp_recvmsg
- Функция document
- Функция generate-id
- Функция console.log
- 22.8. Информация о пакетах IPv6