UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
14.6. Вспомогательные данные
Вспомогательные данные (ancillary data) можно отправлять и получать, используя элементы
msg_control
msg_controllen
msghdr
sendmsg
recvmsg
В табл. 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
msg_control
cmsghdr
На рис. 14.3 приводится пример двух объектов вспомогательных данных, содержащихся в буфере управляющей информации.
Рис. 14.3. Два объекта вспомогательных данных
Элемент
msg_control
msg_controllen
cmsghdr
cmsg_type
CMSG_xxx
Не все реализации поддерживают наличие нескольких объектов вспомогательных данных в буфере управляющей информации.
На рис. 14.4 приводится формат структуры
cmsghdr
Рис. 14.4. Структура cmsghdr при использовании с доменными сокетами Unix
Предполагается, что каждый из трех элементов структуры
cmsghdr
cmsghdr
cmsg_data
cmsg_len
Вспомогательные данные, возвращаемые функцией
recvmsg
<sys/socket.h>
#include <sys/socket.h>
#include <sys/param.h> /* для макроса ALIGN во многих реализациях */
struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *<i>mhdrptr</i>);
<i>Возвращает: указатель на первую структуру cmsghdr или NULL, если нет вспомогательных данных</i>
struct cmsghdr *CMSG_NXTHDR(struct msghdr *<i>mhdrptr</i>, struct cmsghdr *<i>cmsgptr</i>);
<i>Возвращает: указатель на структуру cmsghdr или NULL, если нет больше объектов вспомогательных данных</i>