UNIX: разработка сетевых приложений
Часть 110 из 399 Информация о книге
9.8. Функция sctp_freeladdrs
Функция
освобождает ресурсы, выделенные при вызовеsctp_freeladdrs.sctp_getladdrs#include <netinet/sctp.h>void sctp_freeladdrs(struct sockaddr *<i>addrs</i>);Здесь
указывает на список адресов, возвращаемыйaddrs.sctp_getladdrs9.9. Функция sctp_sendmsg
Приложение может управлять параметрами SCTP, используя функцию
со вспомогательными данными (см. главу 14). Однако из-за неудобств, связанных с применением вспомогательных данных, многие реализации SCTP предоставляют дополнительный библиотечный вызов (который на самом деле может быть и системным вызовом), упрощающий обращение к расширенным функциям SCTP. Вызов функции должен иметь следующий формат:sendmsgssize_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помещается дескриптор сокета, возвращенный системным вызовом socket. Аргументsockfdуказывает на буфер размераmsg, содержимое которого должно быть передано собеседнику. В полеmsgszпомещается длина адреса, передаваемого через аргументtolen. В полеtoпомещается идентификатор протокола, который будет передан вместе с порцией данных. Полеppidпередается стеку SCTP. Разрешенные значения этого поля приводятся в табл. 7.5.flagsНомер потока SCTP указывается вызывающим приложением в аргументе
. Процесс может указать время жизни сообщения в миллисекундах в полеstream. Значение 0 соответствует бесконечному времени жизни. Пользовательский контекст, при наличии такового, может быть указан в полеlifetime. Пользовательский контекст связывает неудачную передачу сообщения (о которой получено уведомление) с локальным контекстом, имеющим отношение к приложению. Например, чтобы отправить сообщение в поток 1 с флагом отправкиcontext, временем жизни равным 1000 мс, идентификатором протокола 24 и контекстом 52, процесс должен сделать следующий вызов:MSG_PR_SCTP_TTLret =sctp_sendmsg(sockfd, data, datasz, &dest, sizeof(dest), 24,MSG_PR_SCTP_TTL, 1, 1000, 52);Этот подход значительно проще выделения памяти под необходимые вспомогательные данные и настройки структур, входящих в
. Обратите внимание, что если функцияmsghdrреализована через вызовsctp_sendmsg, то полеsendmsgв последнем устанавливается равным 0.flags9.10. Функция sctp_recvmsg
Функция
, подобноsctp_recvmsg, предоставляет удобный интерфейс к расширенным возможностям SCTP. С ее помощью пользователь может получить не только адрес собеседника, но и полеsctp_sendmsg, которое обычно заполняется при вызовеmsg_flags(например,recvmsg,MSG_NOTIFICATIONи так далее). Кроме того, функция дает возможность получить структуруMSG_EOR, которая сопровождает сообщение, считанное в буфер. Обратите внимание, что если приложение хочет получать информацию, содержащуюся в структуреsctp_sndrcvinfo, оно должно быть подписано на событиеsctp_sndrcvinfoс параметром сокетаsctp_data_io_event(по умолчанию эта подписка включена).SCTP_EVENTSssize_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в последнем устанавливается равным нулю.flags9.11. Функция sctp_opt_info
Эта функция предназначена для тех приложений, которым недостаточно возможностей, предоставляемых функциями
для протокола SCTP. Дело в том, что некоторые параметры сокетов SCTP (например,getsockopt) требуют использования переменных типа «значение-результат» для передачи идентификатора ассоциации. Если функцияSCTP_STATUSне поддерживает работу с такими переменными, разработчику придется вызыватьgetsockopt. В системах типа FreeBSD, разрешающих указывать переменные типа «значение-результат» с параметрами сокетов, функцияsctp_opt_infoпредставляет собой оболочку, передающую аргументы функцииsctp_opt_infoв нужном формате. В целях обеспечения переносимости разработчикам приложений рекомендуется использоватьgetsockoptдля всех параметров, требующих работы с переменными типа «значение-результат» (см. раздел 7.10).sctp_opt_info