— собеседник перезапущен. Наиболее типичной причиной этого уведомления бывает выход из строя и перезапуск собеседника. Приложение должно проверить количество потоков в обоих направлениях, потому что при перезапуске эти значения могут измениться;
). После получения этого сообщения сокет типа «один-к-одному» может быть использован для подключения к другому собеседнику;
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
Адрес недоступен
Данные, отправленные на недоступный (
SCTP_ADDR_UNREACHABLE
) адрес, будут направляться на альтернативный адрес. Некоторые состояния доступны только в тех реализациях SCTP, которые поддерживают динамическую адресацию (в
частности,
SCTP_ADDR_ADDED
и
SCTP_ADDR_REMOVED
).
Поле
spc_error
содержит код ошибки, дающий больше сведений о событии, а поле
spc_assoc_id
, как обычно, хранит идентификатор ассоциации.
SCTP_REMOTE_ERROR
Собеседник может отправить на локальную конечную точку сообщение об ошибке. Такие сообщения могут описывать различные ошибочные состояния ассоциации. Если это уведомление включено, вся сбойная порция данных передается приложению в сетевом формате. Сообщение имеет следующий формат:
struct sctp_remote_error {
u_int16_t sre_type;
u_int16_t sre_flags;
u_int32_t sre_length;
u_int16_t sre_error;
sctp_assoc_t sre_assoc_id;
u_int8_t sre_data[];
};
Поле
sre_error
содержит код причины ошибки протокола SCTP;
sre_assoc_id
— идентификатор ассоциации, a
sre_data
— ошибочную порцию данных в сетевом формате.
SCTP_SEND_FAILED
Сообщение, которое невозможно доставить собеседнику, возвращается отправителю в этом уведомлении. За таким уведомлением обычно следует уведомление об отказе ассоциации. В большинстве случаев доставка сообщения оказывается невозможной именно по причине отказа ассоциации. Если же используется режим частичной надежности SCTP, сообщение может быть возвращено и в том случае, если отказа ассоциации реально не произошло.
Данные, возвращаемые приложению с этим уведомлением, имеют следующий формат:
struct sctp_send_failed {
u_int16_t ssf_type;
u_int16_t ssf_flags;
u_int32_t ssf_length;
u_int32_t ssf_error;
struct sctp_sndrcvinfo ssf_info;
sctp_assoc_t ssf_assoc_id;
u_int8_t ssf_data[];
};
Поле
ssf_flags
может иметь одно из двух значений:
SCTP_DATA_UNSENT
— сообщение не было послано собеседнику (управление потоком не позволило отправить сообщение до истечения его времени жизни);
SCTP_DATA_SENT
— сообщение было передано по крайней мере один раз, но собеседник не подтвердил его получение. Собеседник мог получить сообщение, но он не смог подтвердить его.
Эта разница может быть существенной для протоколов обработки транзакций, которые при восстановлении соединения могут предпринимать разные действия в зависимости от того, было принято конкретное сообщение или нет. Поле
ssf_error
может содержать код ошибки, относящейся к конкретному уведомлению, или быть нулевым. Поле
ssf_info
содержит сведения, переданные ядру при отправке данных (например, номер потока, контекст и так далее). Поле