Уведомление любого типа имеет следующий формат. Первые восемь байтов идентифицируют тип уведомления и его полную длину. Включение подписки на событие sctp_data_io_event
sctp_sndrcvinfo
. Вызовом recvmsg
эта структура помещается во вспомогательные данные. Приложение может также вызвать sctp_recvmsg
, которая использует указатель на структуру sctp_sndrcvinfo
.Два уведомления содержат поле кода причины ошибки SCTP (SCTP error cause field). Значения этого поля перечислены в разделе 3.3.10 RFC 2960 [118] и в разделе «CAUSE CODES» (коды причин) документа http://www.iana.org/assignments/sctp-parameters
Уведомления определяются следующим образом.
struct sctp_tlv {
u_int16_t sn_type;
u_int16_t sn_flags;
u_int32_t sn_length;
};
/* уведомление о событии */
union sctp_notification {
struct sctp_tlv sn_header;
struct sctp_assoc_change sn_assoc_change;
struct sctp_paddr_change sn_paddr_change;
struct sctp_remote_error sn_remote_error;
struct sctp_send_failed sn_send_failed;
struct sctp_shutdown_event sn_shutdown_event;
struct sctp_adaption_event sn_adaption_event;
struct sctp_pdapi_event sn_pdapi_event;
};
Обратите внимание, что для интерпретации значения типа используется поле sn_header
sn_header
, sn_type
, а также соответствующие значения поля подписки, которые используются с параметром сокета SCTP_EVENTS
.Таблица 9.2
. Тип и поле подпискиsn_type | Поле подписки |
---|---|
SCTP_ASSOC_CHANGE | sctp_association_event |
SCTP_PEER_ADDR_CHANGE | sctp_address_event |
SCTP_REMOTE_ERROR | sctp_peer_error_event |
SCTP_SEND_FAILED | sctp_send_failure_event |
SCTP_SHUTDOWN_EVENT | sctp_shutdown_event |
SCTP_ADAPTION_INDICATON | sctp_adaption_layer_event |
SCTP_PARTIAL_DELIVERY_EVENT | sctp_partial_delivery_event |
У каждого уведомления имеется своя собственная структура, которая содержит подробную информацию о произошедшем событии.
■ SCTP_ASSOC_CHANGE
Это уведомление сообщает приложению о том, что произошло изменение, связанное с ассоциациями: возникла новая ассоциация или завершилась существующая. Структура данных имеет следующий формат:
struct sctp_assoc_change {
u_int16_t sac_type;
u_int16_t sac_flags;
u_int32_t sac_length;
u_int16_t sac_state;
u_int16_t sac_error;
u_int16_t sac_outbound_streams;
u_int16_t sac_inbound_streams;
sctp_assoc_t sac_assoc_id;
uint8_t sac_info[];
};
Поле sac_state
□ SCTP_COMM_UP
inbound_streams
и outbound_streams
) говорят о том, сколько потоков доступно в соответствующих направлениях. Идентификатор ассоциации позволяет взаимодействовать со стеком SCTP; □ SCTP_COMM_LOST
SO_LINGER
или вызовом sendmsg
с флагом MSG_ABORT
). Пользовательские данные могут быть помещены в поле sac_info
; □ SCTP_RESTART
□ SCTP_SHUTDOWN_COMP
shutdown
или sendmsg
с флагом MSG_EOF
). После получения этого сообщения сокет типа «один-к-одному» может быть использован для подключения к другому собеседнику; □ SCTP_CANT_STR_ASSOC