KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программное обеспечение » Уильям Стивенс - UNIX: разработка сетевых приложений

Уильям Стивенс - UNIX: разработка сетевых приложений

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Уильям Стивенс, "UNIX: разработка сетевых приложений" бесплатно, без регистрации.
Перейти на страницу:

Уведомления определяются следующим образом.

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). Пользовательские данные могут быть помещены в поле 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 Адрес недоступен

Данные, отправленные на недоступный (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 содержит сведения, переданные ядру при отправке данных (например, номер потока, контекст и так далее). Поле ssf_assoc_id содержит идентификатор ассоциации, а в поле ssf_data помещается недоставленное сообщение.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*