Уильям Стивенс - UNIX: разработка сетевых приложений
- Название:UNIX: разработка сетевых приложений
- Автор:
- Жанр:
- Издательство:Питер
- Год:2007
- Город:Санкт-Петербург
- ISBN:5-94723-991-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Уильям Стивенс - UNIX: разработка сетевых приложений краткое содержание
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
UNIX: разработка сетевых приложений - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
■ Обновляется элемент msg_controllen
— его новым значением становится фактический размер записанных вспомогательных данных. Этот аргумент также является аргументом типа «значение-результат», и его результат по завершении функции равен 16.
■ Элемент msg_flags
изменяется функцией recvmsg
, но процессу никакие флаги не возвращаются.
В табл. 14.3 показаны различия между рассмотренными пятью группами функций ввода-вывода.
Таблица 14.3. Сравнение пяти групп функций ввода-вывода
Функция | Произвольный дескриптор | Только дескриптор сокета | Один буфер для чтения и записи | Распределяющее чтение, объединяющая запись | Наличие флагов | Указание адреса собеседника | Управляющая информация |
---|---|---|---|---|---|---|---|
read, write | • | • | |||||
readv, writev | • | • | |||||
recv, send | • | • | • | ||||
recvfrom, sendto | • | • | • | • | |||
recvmsg, sendsg | • | • | • | • | • |
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
, определяемой подключением заголовочного файла :
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
, могут содержать любое число объектов вспомогательных данных. Чтобы скрыть возможное заполнение от приложения, для упрощения обработки вспомогательных данных определены следующие пять макросов (что требует включения заголовочного файла ).
#include
#include /* для макроса 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] определены последние два.
Эти макросы могли бы быть использованы в следующем псевдокоде:
Читать дальшеИнтервал:
Закладка: