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
). Пользовательские данные могут быть помещены в поле
sac_info
;
□
SCTP_RESTART
— собеседник перезапущен. Наиболее типичной причиной этого уведомления бывает выход из строя и перезапуск собеседника. Приложение должно проверить количество потоков в обоих направлениях, потому что при перезапуске эти значения могут измениться;
□
SCTP_SHUTDOWN_COMP
— закончено завершение соединения, инициированное локальной конечной точкой (вызовом
shutdown
или
sendmsg
с флагом
MSG_EOF
). После получения этого сообщения сокет типа «один-к-одному» может быть использован для подключения к другому собеседнику;
□
SCTP_CANT_STR_ASSOC
— собеседник не ответил при попытке установления ассоциации.
Поле
sac_error
содержит коды причин ошибок протокола SCTP, которые могли привести к изменению состояния ассоциации. Поля
sac_inbound_streams
и
sac_outbound_streams
говорят о том, какое количество потоков в каждом направлении было согласовано во время установки ассоциации. Поле sac_
assoc
_id содержит уникальный идентификатор ассоциации, который может использоваться как при работе с параметрами сокета, так и в последующих уведомлениях. Наконец, поле
sac
_info может содержать дополнительные пользовательские сведения. Например, если ассоциация была разорвана собеседником в связи с ошибкой, определенной пользователем, код этой ошибки будет помещен в поле
sac_info
.
■
SCTP_PEER_ADDR_CHANGE
Это уведомление говорит об изменении состояния одного из адресов собеседника. Изменение может заключаться либо в отказе (отсутствии подтверждения отправленных на этот адрес данных), либо в восстановлении (ответе отказавшего ранее адреса). Структура данных имеет следующий формат:
struct sctp_paddr_change {
u_int16_t spc_type;
u_int16_t spc_flags;
u_int32_t spc_length;
struct sockaddr_storage spc_aaddr;
u_int32_t spc_state;
u_int32_t spc_error;
sctp_assoc_t spc_assoc_id;
};
Поле
spc_aaddr
содержит адрес собеседника, с которым связано данное событие. Поле
spc_state
может принимать одно из значений, перечисленных в табл. 9.3.
Таблица 9.3. Уведомление о состоянии адреса собеседника
spc_state | Значение |
SCTP_ADDR_ADDED | Адрес добавлен к ассоциации |
SCTP_ADDR_AVAILABLE | Адрес доступен |
SCTP_ADDR_CONFIRMED | Адрес подтвержден и считается действующим |
SCTP_ADDR_MADE_PRIM | Адрес сделан основным |
SCTP_ADDR_REMOVED | Адрес удален из списка адресов ассоциации |
SCTP_ADDR_UNREACHABLE | Адрес недоступен |