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

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

Шрифт:

Работая с функциями

recvmsg
и
sendmsg
, следует учитывать различие между двумя флаговыми переменными: это аргумент
flags
, который передается по значению, и элемент
msg_flags
структуры
msghdr
, который передается по ссылке (поскольку функции передается адрес этой структуры).

Элемент

msg_flags
используется только функцией
recvmsg
. Когда вызывается функция
recvmsg
, аргумент
flags
копируется в элемент
msg_flags
[128, с. 502], и это значение используется ядром для управления приемом данных. Затем это значение обновляется в зависимости от результата функции
recvmsg
.

Элемент

msg_flags
игнорируется функцией
sendmsg
, поскольку эта функция использует аргумент
flags
для управления выводом данных. Это значит, что если мы хотим установить флаг
MSG_DONTWAIT
при вызове функции
sendmsg
, то мы должны присвоить это значение аргументу
flags
, а присваивание значения
MSG_DONTWAIT
элементу
msg_flags
не имеет никакого эффекта.

В табл. 14.2 показано, какие флаги проверяются ядром для функций ввода и вывода и какие элементы

msg_flags
может возвращать функция
recvmsg
. Для элемента
sendmsg.msg_flags
нет колонки, потому что, как мы отмечали, он не используется.

Таблица 14.2. Флаги для различных функций ввода-вывода

Флаг Проверяются функциями send flagssendto flagssendmsg flags Проверяются функциями recv flagsrecvfrom flagsrecvmsg flags Возвращаются функцией recvmsg msg_flags
MSG_DONTROUTE •
MSG_DONTWAIT • •
MSG_PEEK •
MSG_WAITALL •
MSG_EOR •
MSG_OOB • • •
MSG_BCAST •
MSG_MCAST •
MSG_TRUNC •
MSG_CTRUNC •

Первые четыре флага только проверяются и никогда не возвращаются, вторые два проверяются и возвращаются, а последние четыре флага только возвращаются. Следующие ниже комментарии относятся к шести флагам, возвращаемым функцией

recvmsg
.

MSG_BCAST
. Этот флаг введен в BSD/OS и возвращается, если дейтаграмма была получена как широковещательная дейтаграмма канального уровня или если ее IP-адрес получателя является широковещательным адресом. Этот флаг предоставляет более удачную возможность определить, что дейтаграмма UDP была отправлена на широковещательный адрес, чем параметр сокета
IP_RECVDSTADDR
.

MSG_MCAST
. Этот флаг введен в BSD_OS и возвращается, если дейтаграмма была получена как дейтаграмма многоадресной передачи канального уровня.

MSG_TRUNC
. Этот флаг возвращается, если дейтаграмма была усечена: у ядра имеется больше данных для возвращения, чем позволяет пространство в памяти, выделенное для них процессом (сумма всех элементов
iov_len
). Более подробно мы рассмотрим это в разделе 22.3.

MSG_CTRUNC
. Этот флаг возвращается, если были усечены вспомогательные данные: у ядра имеется больше вспомогательных данных для возвращения, чем позволяет выделенное для них процессом пространство в памяти (
msg_controllen
).

MSG_EOR
. Этот флаг означает конец записи. Он сбрасывается, если возвращаемые данные не заканчивают запись. Если же возвращаемые данные заканчивают логическую запись, этот флаг устанавливается. TCP не использует этот флаг, поскольку это потоковый протокол.

MSG_OOB
. Этот флаг никогда не возвращается для внеполосных данных TCP. Он возвращается другими наборами протоколов (например, протоколами OSI).

Реализации могут возвращать некоторые из входных аргументов

flags
в элементе
msg_flags
, поэтому мы должны проверять только те значения флагов, которые нас интересуют (например, последние шесть в табл. 14.2).

На рис. 14.1 представлена структура

msghdr
и информация, на которую она указывает. На этом рисунке отражена ситуация, предшествующая вызову функции
recvmsg
для сокета UDP.

Рис. 14.1. Структуры данных в тот момент, когда функция recvmsg вызывается для сокета UDP

Для адреса протокола в памяти выделяется 16 байт, а для вспомогательных данных — 20 байт. Инициализируется массив из трех структур iovec: первая задает 100-байтовый буфер, вторая — 60-байтовый буфер, третья — 80-байтовый буфер. Мы также предполагаем, что был установлен параметр сокета

IP_RECVDSTADDR
для получения IP-адреса получателя из дейтаграммы UDP.

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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