Литмир - Электронная Библиотека
Содержание  
A
A

9.8. Функция sctp_freeladdrs

Функция

sctp_freeladdrs
освобождает ресурсы, выделенные при вызове
sctp_getladdrs
.

#include <netinet/sctp.h>

void sctp_freeladdrs(struct sockaddr *<i>addrs</i>);

Здесь

addrs
указывает на список адресов, возвращаемый
sctp_getladdrs
.

9.9. Функция sctp_sendmsg

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

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

ssize_t sctp_sendmsg(int <i>sockfd</i>, const void *<i>msg</i>, size_t <i>msgsz</i>,

 const struct sockaddr *<i>to</i>, socklen_t <i>tolen</i>, uint32_t <i>ppid</i>,

 uint32_t <i>flags</i>, uint16_t <i>stream</i>, uint32_t <i>timetolive</i>,

 uint32_t <i>context</i>);

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

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

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, &amp;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 <i>sockfd</i>, void *<i>msg</i>, size_t <i>msgsz</i>,

 struct sockaddr *<i>from</i>, socklen_t *<i>fromlen</i>,

 struct sctp_sndrcvinfo *<i>sinfo</i>, int *msg_<i>flags</i>);

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

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

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

9.11. Функция sctp_opt_info

Эта функция предназначена для тех приложений, которым недостаточно возможностей, предоставляемых функциями

getsockopt
для протокола SCTP. Дело в том, что некоторые параметры сокетов SCTP (например,
SCTP_STATUS
) требуют использования переменных типа «значение-результат» для передачи идентификатора ассоциации. Если функция
getsockopt
не поддерживает работу с такими переменными, разработчику придется вызывать
sctp_opt_info
. В системах типа FreeBSD, разрешающих указывать переменные типа «значение-результат» с параметрами сокетов, функция
sctp_opt_info
представляет собой оболочку, передающую аргументы функции
getsockopt
в нужном формате. В целях обеспечения переносимости разработчикам приложений рекомендуется использовать
sctp_opt_info
для всех параметров, требующих работы с переменными типа «значение-результат» (см. раздел 7.10).

110
{"b":"225366","o":1}