Эта разница может быть существенной для протоколов обработки транзакций, которые при восстановлении соединения могут предпринимать разные действия в зависимости от того, было принято конкретное сообщение или нет. Поле
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
Некоторые реализации поддерживают параметр
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 не смогла бы обработать такое сообщение, если бы у нее не было механизма доставки сообщений по частям до полного их получения. Реализация, обеспечивающая частичную доставку, называется
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
, указывающее на аварийное завершение частичной доставки сообщения, обрабатываемого в данный момент.9.15. Резюме