Читаем UNIX: разработка сетевых приложений полностью

Использование 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 в последнем устанавливается равным нулю.

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 в случае ошибки

Перейти на страницу:

Все книги серии Мастер-класс

Секреты резьбы по дереву
Секреты резьбы по дереву

Изделия из древесины и материалов, имитирующих ее текстуру, привычным образом окружают нас в повседневной жизни, поэтому мы относимся к ней как к чему-то обыденному. Но как только ее коснется умелая рука мастера резьбы по дереву, рождается произведение искусства и раскрываются такие качества древесины, как богатая фактура, разнообразие цветов, особая теплота. Эта книга поможет читателю открыть для себя удивительный мир творчества и познать секреты резьбы по дереву. Автор надеется, что начинающие резчики найдут в ней интересный и полезный материал, который позволит им стать мастерами. В приложении представлены рисунки орнаментов и различных узоров, которые на первых порах можно копировать, а по мере приобретения навыка на их основе разрабатывать свои образцы.

Галина Алексеевна Серикова

Сделай сам / Хобби и ремесла / Руководства / Дом и досуг / Словари и Энциклопедии

Похожие книги