Новая универсальная структура адреса сокета
Новая универсальная структура адреса сокета была определена как часть API сокетов IPv6 с целью преодолеть некоторые недостатки существующей структуры
sockaddr
. В отличие от структуры
sockaddr
, новая структура
sockaddr_storage
достаточно велика для хранения адреса сокета любого типа, поддерживаемого системой. Новая структура задается подключением заголовочного файла
, часть которого показана в листинге 3.4.
Листинг 3.4. Структура хранения адреса сокета sockaddr_storage
struct sockaddr_storage {
uint8_t ss_len; /* длина этой структуры (зависит от реализации) */
sa_family_t ss_family; /* семейство адреса. AF_xxx */
/* зависящие от реализации элементы, обеспечивающие:
а) выравнивание, достаточное для выполнения требований по выравниванию всех
типов адресов сокетов, поддерживаемых системой;
б) достаточный объем для хранения адреса сокета любого типа,
поддерживаемого системой. */
};
Тип
sockaddr_storage
— это универсальная структура адреса сокета, отличающаяся от
struct sockaddr
по следующим параметрам:
1. Если к структурам адресов сокетов, поддерживаемым системой, предъявляются требования по выравниванию, структура
sockaddr_storage
выполняет самое жесткое из них.
2. Структура
sockaddr_storage
достаточно велика для размещения любой структуры адреса сокета, поддерживаемой системой.
Заметьте, что поля структуры
sockaddr_storage
непрозрачны для пользователя, за исключением
ss_family
и
ss_len
(если таковые заданы). Структура
sockaddr_storage
должна преобразовываться в структуру адреса соответствующего типа для обращения к содержимому остальных полей.
Сравнение структур адреса сокетов
На рис. 3.1 показано сравнение пяти структур адресов сокетов, с которыми мы встретимся в тексте, предназначенных для IPv4, IPv6, доменного сокета Unix (см. листинг 15.1), канального уровня (см. листинг 18.1) и хранения. Подразумевается, что все структуры адреса сокета содержат 1-байтовое поле длины, поле семейства также занимает 1 байт и длина любого поля, размер которого ограничен снизу, в точности равна этому ограничению.
Рис. 3.1. Сравнение различных структур адресов сокетов
Две структуры адреса сокета имеют фиксированную длину, а структура доменного сокета Unix и структура канального уровня — переменную. При обработке структур переменной длины мы передаем функциям сокетов указатель на структуру адреса сокета, а в другом аргументе передаем длину этой структуры. Под каждой структурой фиксированной длины мы показываем ее размер в байтах (для реализации 4.4BSD).