Книга: UNIX: разработка сетевых приложений
9.9. Функция sctp_sendmsg
9.9. Функция sctp_sendmsg
Приложение может управлять параметрами 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.1. Введение
- 9.2. Модели интерфейса
- 9.3. Функция sctp_bindx
- 9.4. Функция sctp_connectx
- 9.5. Функция sctp_getpaddrs
- 9.6. Функция sctp_freepaddrs
- 9.7. Функция sctp_getladdrs
- 9.8. Функция sctp_freeladdrs
- 9.9. Функция sctp_sendmsg
- 9.10. Функция sctp_recvmsg
- 9.11. Функция sctp_opt_info
- 9.12. Функция sctp_peeloff
- 9.13. Функция shutdown
- 9.14. Уведомления
- 9.15. Резюме
- Упражнения
- 9.10. Функция sctp_recvmsg
- 9.8. Функция sctp_freeladdrs
- Глава 9 Основы сокетов SCTP
- 9.6. Функция sctp_freepaddrs
- 2.1.3. Функция getopt_long()
- Группировка по встроенным функциям и UDF
- 19.1.1. Функция jQuery()
- SCTP Characteristics
- SCTP Headers
- SCTP Generic header format
- SCTP Common and generic headers
- SCTP ABORT chunk