Чтение онлайн

ЖАНРЫ

UNIX: разработка сетевых приложений
Шрифт:

srto_max
содержит максимальное значение RTO, используемое при изменении таймера повторной передачи. Если рассчитанное значение оказывается больше максимального RTO, в качестве нового тайм-аута используется именно максимальное значение. По умолчанию это поле имеет значение 60 000 мс;

srto_min
содержит минимальное значение RTO, используемое при первом запуске таймера повторной передачи. Когда таймер RTO изменяется, новое значение обязательно сравнивается с минимальным. По умолчанию это поле имеет значение 1000 мс.

Запись 0 в поля

srto_initial
,
srto_max
и
srto_min
означает, что менять текущие параметры по умолчанию не требуется. Все значения измеряются в
миллисекундах. Руководство по установке таймеров для достижения максимальной производительности приводится в разделе 23.11.

Параметр сокета SCTP_SET_PEER_PRIMARY_ADDR

Установка этого параметра приводит к отправке собеседнику сообщения, запрашивающего установку конкретного локального адреса в качестве основного. Процесс должен заполнить структуру

sctp_setpeerprim
и указать в ней идентификатор ассоциации и локальный адрес, который должен быть сделан основным. Этот адрес должен быть привязан к данной конечной точке. Структура
sctp_setpeerprim
определяется следующим образом:

struct sctp_setpeerprim {

sctp_assoc_t sspp_assoc_id;

struct sockaddr_storage sspp_addr;

};

Ниже приводится описание полей структуры.

sspp_assoc_id
указывает идентификатор ассоциации, для которой требуется установить новый основной адрес. При работе с сокетом типа «один-к-одному» это поле игнорируется;

sspp_addr
содержит локальный адрес, который должен использоваться собеседником в качестве основного.

Поддержка этой функции SCTP не является обязательной. Если локальная конечная точка не поддерживает параметр, процессу будет возвращена ошибка EOPNOTSUPP. Если же параметр не поддерживается удаленной конечной точкой, ошибка будет другой: EINVAL. Обратите внимание, что данный параметр не может использоваться для считывания основного адреса; он служит только для установки нового адреса в качестве основного.

Параметр сокета SCTP_STATUS

Этот параметр сокета служит для получения информации о текущем статусе ассоциации SCTP. Для обеспечения максимальной переносимости пользуйтесь функцией

sctp_opt_info
, а не
getaddrinfo
. Приложение должно предоставить структуру
sctp_status
, указав идентификатор ассоциации
sstat_assoc_id
. Структура будет заполнена информацией о выбранной ассоциации и возвращена приложению. Формат структуры
sctp_status
таков:

struct sctp_status {

sctp_assoc_t sstat_assoc_id;

int32_t sstat_state;

u_int32_t sstat_rwnd;

u_int16_t sstat_unackdata;

u_int16_t sstat_penddata;

u_int16_t sstat_instrms;

u_int16_t sstat_outstrms;

u_int32_t sstat_fragmentation_point;

struct sctp_paddrinfo sstat_primary;

};

Поля структуры имеют следующий смысл:

sstat_assoc_id
содержит идентификатор ассоциации;

sstat_state
содержит константу, обозначающую состояние ассоциации (табл. 7.8). Подробное описание состояний конечной точки SCTP, чередующихся при установке и завершении ассоциации, приводится на рис. 2.8;

sstat_rwnd
содержит текущее вычисленное значение приемного окна собеседника;

sstat_unackdata
содержит количество неподтвержденных порций данных, ждущих ответа собеседника;

sstat_penddata
содержит количество непрочитанных порций данных, подготовленных локальной конечной точкой SCTP для приложения;

sstat_instrms
содержит
количество потоков, используемых собеседником для передачи данных на данную конечную точку;

sstat_outstrms
содержит количество потоков, по которым данная конечная точка может передавать данные собеседнику;

sstat_fragmentation_point
содержит текущее значение границы фрагментации пользовательских сообщений, используемое локальной конечной точкой SCTP. Это значение обычно равняется минимальной MTU для всех адресатов или еще меньшей величине, установленной при помощи параметра
SCTP_MAXSEG
;

sstat_primary
содержит текущий основной адрес. Основной адрес используется по умолчанию для отправки данных собеседнику.

Таблица 7.8. Состояния SCTP

Константа Описание
SCTP_CLOSED Ассоциация закрыта
SCTP_COOKIE_WAIT Ассоциация отправила пакет INIT
SCTP_COOKIE_ECHOED Ассоциация отправила эхо-ответ cookie
SCTP_ESTABLISHED Ассоциация установлена
SCTP_SHUTDOWN_PENDING Ассоциация ждет отправки сообщения о завершении
SCTP_SHUTDOWN_SENT Ассоциация отправила сообщение о завершении
SCTP_SHUTDOWN_RECEIVED Ассоциация получила сообщение о завершении
SCTP_SHUTDOWN_ACK_SENT Ассоциация ждет пакета SHUTDOWN-COMPLETE

Эти параметры полезны для диагностики соединения и определения характеристик текущего сеанса. Например, функция

sctp_get_no_strms
в разделе 10.2 будет считывать
sstat_outstrms
для определения количества доступных для отправки данных потоков. Низкое значение
sstat_rwnd
или высокое значение
sstat_unackdata
позволяет сделать вывод о заполнении приемного буфера собеседника, так что приложение может вовремя замедлить передачу данных. Поле
sstat_fragmentation_point
может использоваться некоторыми приложениями для уменьшения количества пакетов, создаваемых SCTP, путем уменьшения размеров сообщений.

7.11. Функция fcntl

Сокращение

fcntl
означает «управление файлами» (file control). Эта функция выполняет различные операции управления дескрипторами. Перед описанием этой функции и ее влияния на сокет нам нужно составить некоторое более общее представление о ее возможностях. В табл. 7.9 приводятся различные операции, выполняемые функциями
fcntl
и
ioctl
и маршрутизирующими сокетами.

Таблица 7.9. Операции функций fcntl и ioctl и маршрутизирующих сокетов

Поделиться с друзьями:
Операция fcntl ioctl Маршрутизирующий сокет Posix.1g
Установка сокета для неблокируемого ввода-вывода F_SETFL, O_NONBLOCK FIONBIO fcntl
Установка сокета для ввода-вывода, управляемого сигналом F_SETFL, O_ASYNC FIOASYNC fcntl
Установка владельца сокета F_SETOWN SIOCSPGRP или FIOSETOWN fcntl