UNIX: разработка сетевых приложений
Часть 112 из 399 Информация о книге
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;};Обратите внимание, что для интерпретации значения типа используется поле
. Таблица 9.2 содержит значения, которые могут помещаться в поля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) говорят о том, сколько потоков доступно в соответствующих направлениях. Идентификатор ассоциации позволяет взаимодействовать со стеком SCTP;outbound_streams□
— ассоциация закрыта из-за превышения порога недоступности (заданное количество раз был превышен тайм-аут) или собеседник выполнил аварийное закрытие ассоциации (при помощи параметра сокетаSCTP_COMM_LOSTили вызовомSO_LINGERс флагомsendmsg). Пользовательские данные могут быть помещены в полеMSG_ABORT;sac_info□
— собеседник перезапущен. Наиболее типичной причиной этого уведомления бывает выход из строя и перезапуск собеседника. Приложение должно проверить количество потоков в обоих направлениях, потому что при перезапуске эти значения могут измениться;SCTP_RESTART□
— закончено завершение соединения, инициированное локальной конечной точкой (вызовомSCTP_SHUTDOWN_COMPилиshutdownс флагомsendmsg). После получения этого сообщения сокет типа «один-к-одному» может быть использован для подключения к другому собеседнику;MSG_EOF□
— собеседник не ответил при попытке установления ассоциации.SCTP_CANT_STR_ASSOCПоле
содержит коды причин ошибок протокола SCTP, которые могли привести к изменению состояния ассоциации. Поляsac_errorиsac_inbound_streamsговорят о том, какое количество потоков в каждом направлении было согласовано во время установки ассоциации. Поле sac_sac_outbound_streams_id содержит уникальный идентификатор ассоциации, который может использоваться как при работе с параметрами сокета, так и в последующих уведомлениях. Наконец, полеassoc_info может содержать дополнительные пользовательские сведения. Например, если ассоциация была разорвана собеседником в связи с ошибкой, определенной пользователем, код этой ошибки будет помещен в полеsac.sac_info■
Это уведомление говорит об изменении состояния одного из адресов собеседника. Изменение может заключаться либо в отказе (отсутствии подтверждения отправленных на этот адрес данных), либо в восстановлении (ответе отказавшего ранее адреса). Структура данных имеет следующий формат:SCTP_PEER_ADDR_CHANGEstruct 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может принимать одно из значений, перечисленных в табл. 9.3.spc_stateТаблица 9.3. Уведомление о состоянии адреса собеседника
spc_state Значение SCTP_ADDR_ADDED Адрес добавлен к ассоциации SCTP_ADDR_AVAILABLE Адрес доступен SCTP_ADDR_CONFIRMED Адрес подтвержден и считается действующим SCTP_ADDR_MADE_PRIM Адрес сделан основным SCTP_ADDR_REMOVED Адрес удален из списка адресов ассоциации SCTP_ADDR_UNREACHABLE Адрес недоступен