UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
11.8. Функция freeaddrinfo
Вся память, занимаемая структурами
addrinfoai_addrai_canonnamegetaddrinfomallocfreeaddrinfo#include <netdb.h>void freeaddrinfo(struct addrinfo *<i>ai</i>);Переменная
aiaddrinfogetaddrinfoПредположим, что мы вызываем функцию
getaddrinfoaddrinfoaddrinfofreeaddrinfoaddrinfofreeaddrinfoСоздание копии только самой структуры addrinfo, а не структур, на которые она, в свою очередь, указывает, называется поверхностным копированием (shallow сору). Копирование структуры addrinfo и всех структур, на которые она указывает, называется детальным копированием (deep сору).
11.9. Функция getaddrinfo: IPv6
Стандарт POSIX определяет как
getaddrinfo■ Входные данные функции
getaddrinfo■ Семейством адресов, указанным вызывающим процессом в структуре
hintsAF_INETsockaddr_in6AF_INET6sockaddr_in■ POSIX утверждает, что при задании семейства
AF_UNSPECsockaddr_in6sockaddr_insockaddr_in6sockaddr_in■ Это утверждение POSIX также подразумевает, что если флаг
AI_PASSIVEIN6ADDR_ANY_INITsockaddr_in6INADDR_ANYsockaddr_in■ Семейство адресов, указанное в поле
ai_familyhintAI_V4MAPPEDAI_ALLai_flags■ Имя узла может также быть либо шестнадцатеричной строкой IPv6, либо строкой в точечно-десятичной записи IPv4. Допустимость этой строки зависит от семейства адресов, заданного вызывающим процессом. Шестнадцатеричная строка IPv6 неприемлема, если задано семейство
AF_INETAF_INET6AF_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) |
