Номер потока 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
в последнем устанавливается равным нулю.
9.11. Функция sctp_opt_info
Эта функция предназначена для тех приложений, которым недостаточно возможностей, предоставляемых функциями getsockopt
для протокола SCTP. Дело в том, что некоторые параметры сокетов SCTP (например, SCTP_STATUS
) требуют использования переменных типа «значение-результат» для передачи идентификатора ассоциации. Если функция getsockopt
не поддерживает работу с такими переменными, разработчику придется вызывать sctp_opt_info
. В системах типа FreeBSD, разрешающих указывать переменные типа «значение-результат» с параметрами сокетов, функция sctp_opt_info
представляет собой оболочку, передающую аргументы функции getsockopt
в нужном формате. В целях обеспечения переносимости разработчикам приложений рекомендуется использовать sctp_opt_info
для всех параметров, требующих работы с переменными типа «значение-результат» (см. раздел 7.10).
int sctp_opt_info(int sockfd , sctp_assoc_t assoc_id , int opt ,
void * arg , socklen_t * siz );
Возвращает: 0 в случае успешного завершения, -1 в случае ошибки
Здесь sockfd
— дескриптор сокета, с параметрами которого хочет работать пользователь. Аргумент assoc_id
задает идентификатор ассоциации, которую нужно выделить из списка всех ассоциаций данного сокета. Аргумент opt
задает параметр сокета для SCTP (список параметров приводится в разделе 7.10). Arg
— аргумент параметра сокета, siz
— указатель на переменную типа socklen_t
, в которой хранится размер аргумента параметра сокета.
9.12. Функция sctp_peeloff
Как отмечалось ранее, любую ассоциацию, установленную через сокет типа «один- ко-многим», можно выделить в собственный сокет типа «один-к-одному». По семантике новая функция подобна accept
с дополнительным аргументом. Процесс передает дескриптор sockfd
сокета типа «один-ко-многим» и идентификатор id
выделяемой ассоциации. Функция возвращает дескриптор нового сокета. Этот дескриптор имеет тип «один-к-одному», и он изначально связан с выбранной ассоциацией.
Читать дальше
Конец ознакомительного отрывка
Купить книгу