В этом примере рассматривается последовательный сервер, один программный поток которого обрабатывает сообщения, полученные через несколько ассоциаций. SCTP позволяет использовать сокет типа «один-ко-многим» с функцией
sctp_peeloff
(см. раздел 9.12) для реализации комбинированной параллельно- последовательной модели сервера.1. Функция
sctp_peeloff
позволяет выделить конкретную ассоциацию (например, долговременный сеанс связи) из сокета типа «один-ко-многим» в отдельный сокет типа «один-к-одному».2. Полученный таким образом сокет типа «один-к-одному» может быть передан новому потоку или порожденному процессу (как в модели параллельного сервера).
3. Основной поток обрабатывает сообщения от всех остальных ассоциаций в последовательном режиме.
Сокет SCTP типа «один-ко-многим» является IP-сокетом (семейство
AF_INET
или
AF_INET6
) со значением типа
SOCK_SEQPACKET
и значением протокола
IPPROTO_SCTP
.9.3. Функция sctp_bindx
Сервер SCTP может привязаться к некоторому подмножеству IP-адресов узла, на котором он запущен. Серверы TCP и UDP могли привязываться либо к одному, либо ко всем адресам узла, но не могли указывать конкретный набор адресов. Функция
sctp_bindx
делает программирование приложений более гибким, предоставляя возможность связывать сокет SCTP с заданными адресами.#include
int sctp_bindx(int
Аргумент
sockfd
представляет собой дескриптор сокета, возвращаемый функцией
socket
. Второй аргумент — указатель на упакованный список адресов. Каждая структура адреса сокета помещается в буфер непосредственно после предшествующей структуры, без всяких дополняющих нулей (пример приводится на рис. 9.3).Рис. 9.3
. Формат упакованного списка адресов для функций SCTPКоличество адресов, передаваемых
sctp_bindx
, указывается в параметре
addrcnt
. Параметр
flags
сообщает функции
sctp_bindx
о необходимости выполнения действий, перечисленных в табл. 9.1.Таблица 9.1
. Флаги функции sctp_bindxЗначение аргумента flags | Описание |
---|---|
SCTP_BINDX_ADD_ADDR | Добавляет адреса к уже определенным для сокета |
SCTP_BINDX_REM_ADDR | Удаляет адреса из списка адресов сокета |
Функцию
sctp_bindx
можно вызывать независимо от того, привязан ли сокет к каким-нибудь адресам. Для несвязанного сокета вызов
sctp_bindx
приведет к привязке указанного набора адресов. При работе с уже связанным сокетом указание флага
SCTP_BINDX_ADD_ADDR
позволяет добавить адреса к данному дескриптору. Флаг SCTP_BINDX_
REM
_ADDR предназначен для удаления адресов из списка связанных с данным дескриптором. Если
sctp_bindx
вызывается для прослушиваемого сокета, новая конфигурация будет использоваться только для новых ассоциаций; вызов никак не затронет уже установленные ассоциации. Флаги
sctp_bindx
взаимно исключают друг друга: если указать оба, функция вернет ошибку
EINVAL
. Номер порта во всех структурах адреса сокета должен быть одним и тем же. Он должен совпадать с тем номером порта, который был связан с данным сокетом ранее. В противном случае
sctp_bindx
тоже вернет ошибку
EINVAL
.Если конечная точка поддерживает динамическую адресацию, вызов sctp_bindx с флагом
SCTP_BINDX_REM_ADDR
или
SCTP_BINDX_ADD_ADDR
приведет к передаче собеседнику сообщения о необходимости изменения списка адресов. Поскольку изменение списка адресов для установленной ассоциации не является обязательным, реализации, не поддерживающие эту функцию, будут при попытке ее использования возвращать ошибку
EOPNOTSUPP
. Обратите внимание, что для нормальной работы динамической адресации она должна поддерживаться обеими сторонами. Все это полезно в том случае, если система поддерживает динамическое предоставление интерфейсов: когда открывается доступ к новому интерфейсу Ethernet, приложение может вызвать
SCTP_BINDX_ADD_ADDR
и начать работать с этим интерфейсом по уже установленным ассоциациям.9.4. Функция sctp_connectx
#include
int sctp_connectx(int