Уильям Стивенс - UNIX: разработка сетевых приложений
- Название:UNIX: разработка сетевых приложений
- Автор:
- Жанр:
- Издательство:Питер
- Год:2007
- Город:Санкт-Петербург
- ISBN:5-94723-991-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Уильям Стивенс - UNIX: разработка сетевых приложений краткое содержание
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
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
может иметь одно из двух значений:
Интервал:
Закладка: