14.6. Вспомогательные данные

14.6. Вспомогательные данные

Вспомогательные данные (ancillary data) можно отправлять и получать, используя элементы msg_control и msg_controllen структуры msghdr с функциями sendmsg и recvmsg. Другой термин, используемый для обозначения вспомогательных данных, — управляющая информация (control information). В этом разделе мы рассматриваем данное понятие и показываем структуру и макросы, используемые для создания и обработки вспомогательных данных. Примеры программ мы откладываем до следующих глав, в которых рассказывается о применении вспомогательных данных.

В табл. 14.4 приводится обобщение различных вариантов применения вспомогательных данных, рассматриваемых в этой книге.

Таблица 14.4. Использование вспомогательных данных

Протокол cmsg_level cmsg_type Описание
IPv4 IPPROTO_IP IP_RECVDSTADDR Получает адрес получателя с дейтаграммой UDP
IP_RECVIF Получает индекс интерфейса с дейтаграммой UDP
IPv6 IPPROTO_IPV6 IPV6_DSTOPTS Задает/получает параметры получателя
IPV6_HOPLIMIT Задает/получает предел количества транзитных узлов
IPV6_HOPOPTS Задает/получает параметры для транзитных узлов
IPV6_NEXTHOP Задает следующий транзитный адрес
IPV6_PKTINFO Задает/получает информацию о пакете
IPV6_RTHDR Задает/получает информацию о пакете
Домен Unix SOL_SOCKET SCM_RIGHTS Посылает/получает дескрипторы
SCM_CREDS Посылает/получает данные, идентифицирующие пользователя

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

Вспомогательные данные состоят из одного или более объектов вспомогательных данных (ancillary data objects), каждый из которых начинается со структуры cmsghdr, определяемой подключением заголовочного файла <sys/socket.h>:

struct cmsghdr {

 socklen_t cmsg_len;   /* длина структуры в байтах */

 int       cmsg_level; /* исходящий протокол */

 int       cmsg_type;  /* тип данных, специфичный для протокола */

 /* далее следует массив символов без знака cmsg_data[] */

};

Мы уже видели эту структуру на рис. 14.2, когда она использовалась с параметром сокета IP_RECVDSTADDR для возвращения IP-адреса получателя полученной дейтаграммы UDP. Вспомогательные данные, на которые указывает элемент msg_control, должны быть соответствующим образом выровнены для структуры cmsghdr. Один из способов выравнивания мы показываем в листинге 15.7.

На рис. 14.3 приводится пример двух объектов вспомогательных данных, содержащихся в буфере управляющей информации.

Рис. 14.3. Два объекта вспомогательных данных

Элемент msg_control указывает на первый объект вспомогательных данных, а общая длина вспомогательных данных задается элементом msg_controllen. Каждому объекту предшествует структура cmsghdr, которая описывает объект. Между элементом cmsg_type и фактическими данными может существовать заполнение, а также заполнение может быть в конце данных, перед следующим объектом вспомогательных данных. Пять макросов CMSG_xxx, которые мы описываем далее, учитывают это возможное заполнение.

ПРИМЕЧАНИЕ

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

На рис. 14.4 приводится формат структуры cmsghdr при ее использовании с доменным сокетом Unix для передачи дескрипторов (см. раздел 15.7) или передачи данных, идентифицирующих пользователя (см. раздел 15.8).

Рис. 14.4. Структура cmsghdr при использовании с доменными сокетами Unix

Предполагается, что каждый из трех элементов структуры cmsghdr занимает 4 байта и между структурой cmsghdr и данными нет заполнения. При передаче дескрипторов содержимое массива cmsg_data — это фактические значения дескрипторов. На этом рисунке мы показываем только один передаваемый дескриптор, но в общем может передаваться и более одного дескриптора (тогда значение элемента cmsg_len будет равно 12 плюс число дескрипторов, умноженное на 4, если считать, что каждый дескриптор занимает 4 байта).

Вспомогательные данные, возвращаемые функцией recvmsg, могут содержать любое число объектов вспомогательных данных. Чтобы скрыть возможное заполнение от приложения, для упрощения обработки вспомогательных данных определены следующие пять макросов (что требует включения заголовочного файла <sys/socket.h>).

#include <sys/socket.h>

#include <sys/param.h> /* для макроса ALIGN во многих реализациях */

struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *mhdrptr);

Возвращает: указатель на первую структуру cmsghdr или NULL, если нет вспомогательных данных

struct cmsghdr *CMSG_NXTHDR(struct msghdr *mhdrptr, struct cmsghdr *cmsgptr);

Возвращает: указатель на структуру cmsghdr или NULL, если нет больше объектов вспомогательных данных

unsigned char *CMSG_DATA(struct cmsghdr *cmsgptr);

Возвращает: указатель на первый байт данных, связанных со структурой cmsghdr

unsigned int CMSG_LEN(unsigned int length);

Возвращает: значение, которое записывается в cmsg_len

unsigned int CMSG_SPACE(unsigned int length);

Возвращает: общий размер объекта вспомогательных данных

ПРИМЕЧАНИЕ

В POSIX определены первые пять макросов, а в [113] определены последние два.

Эти макросы могли бы быть использованы в следующем псевдокоде:

struct msghdr msg;

struct cmsghdr *cmsgptr;

/* заполнение структуры msg */

/* вызов recvmsg() */

for (cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL;

 cmsgptr = CMSG_NXTHDR(&msg, cmsgptr)) {

 if (cmsgptr->cmsg_level == ... &&

  cmsgptr->cmsg_type == ...) {

  u_char *ptr;

  ptr = CMSG_DATA(cmsgptr);

  /* обработка данных, на которые указывает ptr */

 }

}

Макрос CMSG_FIRSTHDR возвращает указатель на первый объект вспомогательных данных или пустой указатель, если в структуре msghdr нет вспомогательных данных (или msg_control является пустым указателем, или cmsg_len меньше размера структуры cmsghdr). Макрос CMSG_NXTHDR возвращает пустой указатель, когда в буфере управления нет другого объекта вспомогательных данных.

ПРИМЕЧАНИЕ

Многие существующие реализации макроса CMSG_FIRSTHRD никогда не используют элемент msg_controllen и просто возвращают значение cmsg_control. В листинге 22.2 мы проверяем значение msg_controllen перед вызовом макроопределения.

Разница между макросами CMSG_LEN и CMSG_SPACE заключается в том, что первый возвращает длину объекта вместе с дополняющими нулями (это значение хранится в cmsg_len), а последний возвращает длину собственно объекта (это значение может использоваться для динамического выделения памяти под объект).

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Пакет Вспомогательные элементы

Из книги Самоучитель UML автора Леоненков Александр

Пакет Вспомогательные элементы Пакет Вспомогательные элементы является подпакетом пакета Основные элементы и специфицирует дополнительные конструкции языка UML, которые расширяют пакет Элементы ядра. Вспомогательные элементы обеспечивают понятийный базис для


Вспомогательные средства для внутрипроцессного маршалинга

Из книги Сущность технологии СОМ. Библиотека программиста автора Бокс Дональд

Вспомогательные средства для внутрипроцессного маршалинга Хотя фрагменты кода для WritePtr и ReadPtr из предыдущего раздела достаточно просто реализовать, большинство явных вызовов CoMarshalInterface будут использоваться для передачи интерфейсного указателя от одного потока к


Вспомогательные линии

Из книги 3ds Max 2008 автора Верстак Владимир Антонович

Вспомогательные линии Команда для вызова окна настроек вспомогательных линий не вынесена отдельно в меню Опции, однако данные настройки весьма важны, поэтому и будут рассмотрены.Чтобы получить доступ к настройкам типа вспомогательной линии (рис. 2.57), щелкните правой


Вспомогательные объекты

Из книги Photoshop. Мультимедийный курс автора Мединов Олег

Вспомогательные объекты К вспомогательным относятся объекты сцены, которые не видны при итоговой визуализации, но упрощают процесс моделирования и анимации (рис. 2.9). Рис. 2.9. Вспомогательные объекты: Dummy (Пустышка), Grid (Координатная сетка) и Compass (Компас)Существует восемь


Глава 9 Вспомогательные инструменты

Из книги Nero 8 автора Кашеваров А

Глава 9 Вспомогательные инструменты Когда вы имеете дело с многослойным рисунком, у вас есть возможность перемещать слои по холсту в любом направлении (если слои не закреплены). Часто возникает необходимость выровнять изображения отдельных слоев относительно друг


Глава 9 Вспомогательные инструменты

Из книги Linux-сервер своими руками автора Колисниченко Денис Николаевич

Глава 9 Вспомогательные инструменты • Очистка CD/DVD• Тестирование привода• Настройка скорости привода• Создание и печать наклеек на диски и коробки для дисков• Восстановление данных с дисков• РезюмеВ пакете Nero 8 предусмотрены дополнительные инструменты для работы с


11.4. Вспомогательные программы

Из книги Photoshop CS3: Обучающий курс автора Тимофеев Сергей Михайлович

11.4. Вспомогательные программы При работе с серверами wu-ftpd и ProFTPD вы можете использовать программы ftpshut, ftpwho, ftpcount. Инструментальные средства обоих серверов имеют похожие опции, но вспомогательные программы для ProFTPD выводят больше полезной информации.Программа ftpshut


Вспомогательные инструменты

Из книги Новейший самоучитель работы на компьютере автора Белунцов Валерий

Вспомогательные инструменты В нижней части панели инструментов располагается отдельный блок инструментов – вспомогательных (рис. 6.53). Рис. 6.53. Блок вспомогательных инструментовПри помощи так называемых вспомогательных инструментов мы можем выполнять работу, которая


Вспомогательные сервисы

Из книги Визуальное моделирование электронных схем в PSPICE автора Хайнеманн Роберт

Вспомогательные сервисы Регистрация Регистрационные сервисы обеспечивают регистрацию и контроль информации о субъектах, а также аутентификацию субъектов, необходимую для выпуска или аннулирования сертификатов (от имени УЦ ). Фактический выпуск сертификатов


9.4. Вспомогательные средства для расчёта рабочей точки

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

9.4. Вспомогательные средства для расчёта рабочей точки Помимо уже рассматривавшихся видов анализа программа PSPICE включает инструменты для проведения еще трех редко используемых анализов, которые иногда могут пригодиться для расчета рабочей точки схемы. Результаты


Приложение А Вспомогательные инструменты разработки

Из книги автора

Приложение А Вспомогательные инструменты разработки Разработка безошибочных и быстрых Linux-программ требует не только понимания операционной системы Linux и ее системных вызовов. В этом приложении будут рассмотрены методики, позволяющие находить ошибки периода