UNIX: разработка сетевых приложений
Данные, отправленные на недоступный (
) адрес, будут направляться на альтернативный адрес. Некоторые состояния доступны только в тех реализациях SCTP, которые поддерживают динамическую адресацию (в частности,SCTP_ADDR_UNREACHABLEи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[];};Поле
содержит код причины ошибки протокола SCTP;sre_error— идентификатор ассоциации, asre_assoc_id— ошибочную порцию данных в сетевом формате.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■
SCTP_SHUTDOWN_EVENTЭто уведомление передается приложению при приеме от собеседника порции SHUTDOWN. После этой порции никакие новые данные на том же сокете получены быть не могут. Все данные, уже помещенные в очередь, будут переданы собеседнику, после чего ассоциация будет закрыта. Уведомление имеет следующий формат:
struct sctp_shutdown_event {uint16_t sse_type;uint16_t sse_flags;uint32_t sse_length;sctp_assoc_t sse_assoc_id;};Поле
содержит идентификатор ассоциации, которая закрывается и потому не может более использоваться для передачи данных.sse_assoc_id■
SCTP_ADAPTION_INDICATIONНекоторые реализации поддерживают параметр индикации адаптирующего уровня (adaption layer indication). Этот параметр передается в пакетах INIT и INIT-ACK и уведомляет собеседника о выполняемой адаптации приложения. Уведомление имеет следующий формат:
struct sctp_adaption_event {u_int16_t sai_type;u_int16_t sai_flags;u_int32_t sai_length;u_int32_t sai_adaption_ind;sctp_assoc_t sai_assoc_id;};Поле
содержит обычный идентификатор ассоциации. Полеsai_assoc_idпредставляет собой 32-разрядное целое число, переданное собеседником локальной конечной точке в сообщении INIT или INIT-ACK. Уровень адаптации для исходящих сообщений устанавливается при помощи параметра сокетаsai_adaption_ind(см. раздел 7.10). Все это описано в стандарте [116], а пример использования параметра для удаленного прямого доступа к памяти и прямой записи данных описывается в [115].SCTP_ADAPTION_LAYER■
SCTP_PARTIAL_DELIVERY_EVENTИнтерфейс частичной доставки используется для передачи больших сообщений пользователю через буфер сокета. Представьте, что процесс отправил сообщение размером 4 Мбайт. Сообщение такого размера может сильно перегрузить системные ресурсы. Реализация SCTP не смогла бы обработать такое сообщение, если бы у нее не было механизма доставки сообщений по частям до полного их получения. Реализация, обеспечивающая частичную доставку, называется интерфейсом частичной доставки (partial delivery API). SCTP передает данные приложению, не устанавливая флаги в поле
до тех пор, пока не будет готов последний сегмент сообщения. Для этого сегмента устанавливается флагmsg_flags(конец записи). Обратите внимание, что если приложение рассчитывает принимать большие сообщения, оно должно использовать функцииMSG_EORиrecvmsg, чтобы иметь возможность проверять полеsctp_recvmsgна наличие флага окончания записи.msg_flagsВ некоторых ситуациях интерфейсу частичной доставки может потребоваться информировать приложение о состоянии сообщения. Например, если при доставке большого сообщения произошел сбой, приложению доставляется уведомление
, имеющее следующий формат:SCTP_PARTIAL_DELIVERY_EVENT