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

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

Шрифт:

Приложение может управлять параметрами SCTP, используя функцию

sendmsg
со вспомогательными данными (см. главу 14). Однако из-за неудобств, связанных с применением вспомогательных данных, многие реализации SCTP предоставляют дополнительный библиотечный вызов (который на самом деле может быть и системным вызовом), упрощающий обращение к расширенным функциям SCTP. Вызов функции должен иметь следующий формат:

ssize_t sctp_sendmsg(int sockfd, const void * msg, size_t msgsz,

const struct sockaddr * to, socklen_t tolen, uint32_t ppid,

uint32_t flags, uint16_t stream, uint32_t timetolive,

uint32_t context);

Возвращает: количество записанных байтов в случае успешного завершения, -1 в случае ошибки

Использование

sctp_sendmsg
значительно упрощает отправку параметров, но требует указания большего количества аргументов. В поле
sockfd
помещается дескриптор сокета, возвращенный системным вызовом socket. Аргумент
msg
указывает на буфер размера
msgsz
, содержимое которого должно быть передано собеседнику. В поле
tolen
помещается длина адреса, передаваемого через аргумент
to
. В поле
ppid
помещается идентификатор протокола, который будет передан вместе с порцией данных. Поле
flags
передается стеку SCTP. Разрешенные значения этого поля приводятся в табл. 7.5.

Номер потока SCTP указывается вызывающим приложением в аргументе

stream
. Процесс может указать время жизни сообщения в миллисекундах в поле
lifetime
. Значение 0 соответствует бесконечному времени жизни. Пользовательский контекст, при наличии такового, может быть указан в поле
context
. Пользовательский контекст связывает неудачную передачу сообщения (о которой получено уведомление) с локальным контекстом, имеющим отношение к приложению. Например, чтобы отправить сообщение в поток 1 с флагом отправки
MSG_PR_SCTP_TTL
, временем жизни равным 1000 мс, идентификатором протокола 24 и контекстом 52, процесс должен сделать следующий вызов:

ret =

sctp_sendmsg(sockfd, data, datasz, &dest, sizeof(dest), 24,

MSG_PR_SCTP_TTL, 1, 1000, 52);

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

msghdr
. Обратите внимание, что если функция
sctp_sendmsg
реализована через вызов
sendmsg
, то поле
flags
в последнем устанавливается равным 0.

9.10. Функция sctp_recvmsg

Функция

sctp_recvmsg
, подобно
sctp_sendmsg
, предоставляет удобный интерфейс к расширенным возможностям SCTP. С ее помощью пользователь может получить не только адрес собеседника, но и поле
msg_flags
, которое обычно заполняется при вызове
recvmsg
(например,
MSG_NOTIFICATION
,
MSG_EOR
и так далее). Кроме того, функция дает возможность получить структуру
sctp_sndrcvinfo
, которая сопровождает сообщение, считанное в буфер. Обратите внимание, что если приложение хочет получать информацию, содержащуюся в структуре
sctp_sndrcvinfo
, оно должно быть подписано на событие
sctp_data_io_event
с параметром сокета
SCTP_EVENTS
(по умолчанию эта подписка включена).

ssize_t sctp_recvmsg(int sockfd, void * msg, size_t msgsz,

struct sockaddr * from, socklen_t * fromlen,

struct sctp_sndrcvinfo * sinfo, int *msg_ flags);

Возвращает, количество считанных байтов в случае успешного завершения, -1 в случае ошибки

По возвращении из этого вызова аргумент

msg
оказывается заполненным не более, чем
msgsz
байтами данных. Адрес отправителя сообщения помещается в аргумент
from
, а размер адреса — в аргумент
fromlen
. Флаги сообщения будут помещены в аргумент
msg_flags
. Если уведомление
sctp_data_io_event
включено (а по умолчанию это так и есть), структура
sctp_sndrcvinfo
заполняется подробными сведениями о сообщении. Обратите внимание, что если функция
sctp_recvmsg
реализована через вызов
recvmsg
, то поле
flags
в последнем устанавливается равным нулю.

  • Читать дальше
  • 1
  • ...
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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