SCTP предоставляет разработчику приложений большое количество разнообразных уведомлений. С их помощью процесс может отслеживать состояние ассоциаций, с которыми он работает. Уведомления сообщают о событиях транспортного уровня, включая изменения состояния сети, установку ассоциаций, протокольные ошибки удаленного узла и неудачи при доставке сообщений. По умолчанию уведомления обо всех событиях отключены для сокетов обоих типов. Исключение делается для события
sctp_data_io_event
. Пример использования уведомлений будет приведен в разделе 23.7.
Параметр
сокета
SCTP_EVENTS
позволяет подписаться на восемь событий. Из них семь штук генерируют дополнительные данные, которые процесс может получить через обычный дескриптор сокета. Уведомления добавляются к обычным данным, приходящим на соответствующий сокет, по мере того, как происходят события, генерирующие эти уведомления. При чтении из сокета, для которого включена подписка на уведомления, пользовательские данные и сообщения смешиваются друг с другом. Чтобы различить их, процесс должен использовать функции
recvmsg
или
sctp_recvmsg
. Для уведомлений о событиях поле
msg_flags
содержит флаг
MSG_NOTIFICATION
. Этот флаг говорит приложению о том, что считанное сообщение представляет собой не обычные данные, принятые от собеседника, а уведомление о каком-либо событии от локального стека SCTP.
Уведомление любого типа имеет следующий формат. Первые восемь байтов идентифицируют тип уведомления и его полную длину. Включение подписки на событие
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
. Таблица 9.2 содержит значения, которые могут помещаться в поля
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
). Пользовательские данные могут быть помещены в поле