Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

Данные, возвращаемые приложению с этим уведомлением, имеют следующий формат:

struct sctp_send_failed {

u_int16_t ssf_type;

u_int16_t ssf_flags;

u_int32_t ssf_length;

u_int32_t ssf_error;

struct sctp_sndrcvinfo ssf_info;

sctp_assoc_t ssf_assoc_id;

u_int8_t ssf_data[];

};

Поле

ssf_flags
может иметь одно из двух значений:

SCTP_DATA_UNSENT
— сообщение не было послано собеседнику (управление потоком не позволило отправить сообщение до истечения его времени жизни);

SCTP_DATA_SENT
— сообщение было передано по крайней мере один раз, но собеседник не подтвердил его получение. Собеседник мог получить сообщение, но он не смог подтвердить его.

Эта разница может быть существенной для протоколов обработки транзакций, которые при восстановлении соединения могут предпринимать разные действия в зависимости от того, было принято конкретное сообщение или нет. Поле

ssf_error
может содержать код ошибки, относящейся к конкретному уведомлению, или быть нулевым. Поле
ssf_info
содержит сведения, переданные ядру при отправке данных (например, номер потока, контекст и так далее). Поле
ssf_assoc_id
содержит идентификатор ассоциации, а в поле
ssf_data
помещается недоставленное сообщение.

SCTP_SHUTDOWN_EVENT

Это уведомление передается приложению при приеме от собеседника порции SHUTDOWN. После этой порции никакие новые данные на том же сокете получены быть не могут. Все данные, уже помещенные в очередь, будут переданы собеседнику, после чего ассоциация будет закрыта. Уведомление имеет следующий формат:

struct sctp_shutdown_event {

uint16_t sse_type;

uint16_t sse_flags;

uint32_t sse_length;

sctp_assoc_t sse_assoc_id;

};

Поле

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

SCTP_ADAPTION_INDICATION

Некоторые реализации поддерживают параметр индикации адаптирующего уровня( adaption layer indication). Этот параметр передается в пакетах INIT и INIT-ACK и уведомляет собеседника о выполняемой адаптации приложения. Уведомление имеет следующий формат:

struct sctp_adaption_event {

u_int16_t sai_type;

u_int16_t sai_flags;

u_int32_t sai_length;

u_int32_t sai_adaption_ind;

sctp_assoc_t sai_assoc_id;

};

Поле

sai_assoc_id
содержит обычный идентификатор ассоциации. Поле
sai_adaption_ind
представляет собой 32-разрядное целое число, переданное собеседником локальной конечной точке в сообщении INIT или INIT-ACK. Уровень адаптации для исходящих сообщений устанавливается при помощи параметра сокета
SCTP_ADAPTION_LAYER
(см. раздел 7.10). Все это описано в стандарте [116], а пример использования параметра для удаленного прямого доступа к памяти и прямой записи данных описывается в [115].

SCTP_PARTIAL_DELIVERY_EVENT

Интерфейс частичной доставки используется для передачи больших сообщений пользователю через буфер сокета. Представьте, что процесс отправил сообщение размером 4 Мбайт. Сообщение такого размера может сильно перегрузить системные ресурсы. Реализация SCTP не смогла бы обработать такое сообщение, если бы у нее не было механизма доставки сообщений по частям до полного их получения. Реализация, обеспечивающая частичную доставку, называется интерфейсом частичной доставки( partial delivery API). SCTP передает данные приложению, не устанавливая флаги в поле

msg_flags
до тех пор, пока не будет готов последний сегмент сообщения. Для этого сегмента устанавливается флаг
MSG_EOR
(конец записи). Обратите внимание, что если приложение рассчитывает принимать большие сообщения, оно должно использовать функции
recvmsg
и
sctp_recvmsg
, чтобы иметь возможность проверять поле
msg_flags
на наличие флага окончания записи.

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

SCTP_PARTIAL_DELIVERY_EVENT
, имеющее следующий формат:

struct sctp_pdapi_event {

uint16_t pdapi_type;

uint16_t pdapi_flags;

uint32_t pdapi_length;

uint32_t pdapi_indication;

sctp_assoc_t pdapi_assoc_id;

};

Идентификатор

pdapi_assoc_id
указывает на ассоциацию, к которой относится принятое уведомление. Поле
pdapi_indication
содержит сведения о произошедшем событии. На данный момент поле может иметь единственное значение
SCTP_PARTIAL_DELIVERY_ABORTED
, указывающее на аварийное завершение частичной доставки сообщения, обрабатываемого в данный момент.

  • Читать дальше
  • 1
  • ...
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: