Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

Затем будем считать, что с адреса 198.6.38.100, порт 2000, приходит 170-байтовая дейтаграмма UDP, предназначенная для нашего сокета UDP с IP-адресом получателя 206.168.112.96. На рис. 14.2 показана вся информация, содержащаяся в структуре

msghdr
в момент завершения функции
recvmsg
.

Рис. 14.2. Изменение рис. 14.1 при завершении функции

Затемненными показаны поля, изменяемые функцией

recvmsg
. По сравнению с рис. 14.1 на рис. 14.2 изменяется следующее:

В буфер, на который указывает элемент

msg_name
, записывается структура адреса сокета Интернета, содержащая IP-адрес и UDP-порт отправителя, определенные по полученной дейтаграмме.

Обновляется аргумент

msg_namelen
, имеющий тип «значение-результат». Его новым значением становится количество данных, хранящихся в
msg_name
. Но на самом деле его значение как перед вызовом функции
recvmsg
, так и при ее завершении равно 16.

Первые 100 байт данных записываются в первый буфер, следующие 60 байт — во второй буфер и последние 10 байт — в третий буфер. Последние 70 байт третьего буфера не изменяются. Возвращаемое значение функции

recvmsg
— это размер дейтаграммы (170).

Буфер, на который указывает

msg_control
, заполняется как структура
cmsghdr
. (Более подробно о вспомогательных данных мы поговорим в разделе 14.6, а об этом параметре сокета — в разделе 22.2.) Значение
cmsg_len
равно 16,
cmsg_level
—
IPPROTO_IP
,
cmsg_type
—
IP_RECVDSTADDR
, а следующие 4 байта 20-байтового буфера содержат IP-адрес получателя из полученной дейтаграммы UDP. Последние 4 байта 20-байтового буфера, которые мы предоставили для хранения вспомогательных данных, не изменяются.

Обновляется элемент

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
, определяемой подключением заголовочного файла
<sys/socket.h>
:

struct cmsghdr {

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

  • Читать дальше
  • 1
  • ...
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: