UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
11.8. Функция freeaddrinfo
Вся память, занимаемая структурами
addrinfo
ai_addr
ai_canonname
getaddrinfo
malloc
freeaddrinfo
#include <netdb.h>
void freeaddrinfo(struct addrinfo *<i>ai</i>);
Переменная
ai
addrinfo
getaddrinfo
Предположим, что мы вызываем функцию
getaddrinfo
addrinfo
addrinfo
freeaddrinfo
addrinfo
freeaddrinfo
Создание копии только самой структуры addrinfo, а не структур, на которые она, в свою очередь, указывает, называется поверхностным копированием (shallow сору). Копирование структуры addrinfo и всех структур, на которые она указывает, называется детальным копированием (deep сору).
11.9. Функция getaddrinfo: IPv6
Стандарт POSIX определяет как
getaddrinfo
■ Входные данные функции
getaddrinfo
■ Семейством адресов, указанным вызывающим процессом в структуре
hints
AF_INET
sockaddr_in6
AF_INET6
sockaddr_in
■ POSIX утверждает, что при задании семейства
AF_UNSPEC
sockaddr_in6
sockaddr_in
sockaddr_in6
sockaddr_in
■ Это утверждение POSIX также подразумевает, что если флаг
AI_PASSIVE
IN6ADDR_ANY_INIT
sockaddr_in6
INADDR_ANY
sockaddr_in
■ Семейство адресов, указанное в поле
ai_family
hint
AI_V4MAPPED
AI_ALL
ai_flags
■ Имя узла может также быть либо шестнадцатеричной строкой IPv6, либо строкой в точечно-десятичной записи IPv4. Допустимость этой строки зависит от семейства адресов, заданного вызывающим процессом. Шестнадцатеричная строка IPv6 неприемлема, если задано семейство
AF_INET
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) |