UNIX: разработка сетевых приложений
Часть 109 из 399 Информация о книге
Рис. 9.3. Формат упакованного списка адресов для функций SCTP
Количество адресов, передаваемых
, указывается в параметреsctp_bindx. Параметрaddrcntсообщает функцииflagsо необходимости выполнения действий, перечисленных в табл. 9.1.sctp_bindxТаблица 9.1. Флаги функции sctp_bindx
Значение аргумента flags Описание SCTP_BINDX_ADD_ADDR Добавляет адреса к уже определенным для сокета SCTP_BINDX_REM_ADDR Удаляет адреса из списка адресов сокета Функцию
можно вызывать независимо от того, привязан ли сокет к каким-нибудь адресам. Для несвязанного сокета вызовsctp_bindxприведет к привязке указанного набора адресов. При работе с уже связанным сокетом указание флагаsctp_bindxпозволяет добавить адреса к данному дескриптору. Флаг SCTP_BINDX_SCTP_BINDX_ADD_ADDR_ADDR предназначен для удаления адресов из списка связанных с данным дескриптором. ЕслиREMвызывается для прослушиваемого сокета, новая конфигурация будет использоваться только для новых ассоциаций; вызов никак не затронет уже установленные ассоциации. Флагиsctp_bindxвзаимно исключают друг друга: если указать оба, функция вернет ошибкуsctp_bindx. Номер порта во всех структурах адреса сокета должен быть одним и тем же. Он должен совпадать с тем номером порта, который был связан с данным сокетом ранее. В противном случаеEINVALтоже вернет ошибкуsctp_bindx.EINVALЕсли конечная точка поддерживает динамическую адресацию, вызов sctp_bindx с флагом
илиSCTP_BINDX_REM_ADDRприведет к передаче собеседнику сообщения о необходимости изменения списка адресов. Поскольку изменение списка адресов для установленной ассоциации не является обязательным, реализации, не поддерживающие эту функцию, будут при попытке ее использования возвращать ошибкуSCTP_BINDX_ADD_ADDR. Обратите внимание, что для нормальной работы динамической адресации она должна поддерживаться обеими сторонами. Все это полезно в том случае, если система поддерживает динамическое предоставление интерфейсов: когда открывается доступ к новому интерфейсу Ethernet, приложение может вызватьEOPNOTSUPPи начать работать с этим интерфейсом по уже установленным ассоциациям.SCTP_BINDX_ADD_ADDR9.4. Функция sctp_connectx
#include <netinet/sctp.h>int sctp_connectx(int <i>sockfd</i>, const struct sockaddr *<i>addrs</i>, int <i>addrcnt</i>);<i>Возвращает: 0 в случае успешного завершения, -1 в случае ошибки</i>Функция
используется для соединения с многоинтерфейсным узлом. При ее вызове мы должны указать адреса собеседника в параметреsctp_connectx(количество адресов определяется параметромaddrs). Формат структурыaddrcntпредставлен на рис. 9.3. Стек SCTP устанавливает ассоциацию, используя один или несколько адресов из переданного списка. Все адресаaddrsсчитаются действующими и подтвержденными.addrs9.5. Функция sctp_getpaddrs
Функция
не предназначена для использования протоколом, рассчитанным на работу с многоинтерфейсными узлами. Для сокетов SCTP она способна вернуть лишь основной адрес собеседника. Если нужны все адреса, следует вызывать функциюgetpeername.sctp_getpaddrs#include <netinet/sctp.h>int sctp_getpaddrs(int <i>sockfd</i>, sctp_assoc_t <i>id</i>, struct sockadrrd **<i>addrs</i>);<i>Возвращает: 0 в случае успешного завершения, -1 в случае ошибки</i>Аргумент
представляет собой дескриптор сокета, возвращаемый функциейsockfd. Второй аргумент задает идентификатор ассоциации для сокетов типа «один-ко-многим». Для сокетов типа «один-к-одному» этот аргумент игнорируется.socket— адрес указателя, который функцияaddrsзаполнит упакованным списком адресов, выделив под него локальный буфер (см. рис. 9.3 и листинг 23.12). Для освобождения буфера, созданногоsctp_getpaddrs, следует использовать вызовsctp_getpaddrs.sctp_freepaddrs9.6. Функция sctp_freepaddrs
Функция
освобождает ресурсы, выделенные вызовомsctp_freepaddrs.sctp_getpaddrs#include <netinet/sctp.h>void sctp_freepaddrs(struct sockaddr *<i>addrs</i>);Здесь аргумент
— указатель на массив адресов, возвращаемыйaddrs.sctp_getpaddrs9.7. Функция sctp_getladdrs
Функция
может использоваться для получения списка локальных адресов, относящихся к определенной ассоциации. Эта функция бывает необходима в тех случаях, когда приложению требуется узнать, какие именно локальные адреса оно использует (набор адресов, напомним, может быть произвольным подмножеством всех адресов системы).sctp_getladdrs#include <netinet/sctp.h>int sctp_getladdrs(int <i>sockfd</i>, sctp_assoc_t <i>id</i>, struct sockaddr **<i>addrs</i>);<i>Возвращает: количество локальных адресов, помещенных в addrs, или -1 в случае ошибки.</i>Здесь
— дескриптор сокета, возвращаемый функциейsockfd. Аргументsocket— идентификатор ассоциации для сокетов типа «один-ко-многим». Полеidигнорируется для сокетов типа «один-к-одному». Параметр представляет собой адрес указателя на буфер, выделяемый и заполняемый функциейid. В этот буфер помещается упакованный список адресов. Структура списка представлена на рис. 9.3 и в листинге 23.12. Для освобождения буфера процесс должен вызвать функциюsctp_getladdrs.sctp_freeladdrs
