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

ЖАНРЫ

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

9.4. Функция sctp_connectx

#include <netinet/sctp.h>

int sctp_connectx(int sockfd, const struct sockaddr * addrs, int addrcnt);

Возвращает: 0 в случае успешного завершения, -1 в случае ошибки

Функция

sctp_connectx
используется для соединения с многоинтерфейсным узлом. При ее вызове мы должны указать адреса собеседника в параметре
addrs
(количество адресов определяется
параметром
addrcnt
). Формат структуры
addrs
представлен на рис. 9.3. Стек SCTP устанавливает ассоциацию, используя один или несколько адресов из переданного списка. Все адреса
addrs
считаются действующими и подтвержденными.

9.5. Функция sctp_getpaddrs

Функция

getpeername
не предназначена для использования протоколом, рассчитанным на работу с многоинтерфейсными узлами. Для сокетов SCTP она способна вернуть лишь основной адрес собеседника. Если нужны все адреса, следует вызывать функцию
sctp_getpaddrs
.

#include <netinet/sctp.h>

int sctp_getpaddrs(int sockfd, sctp_assoc_t id, struct sockadrrd ** addrs);

Возвращает: 0 в случае успешного завершения, -1 в случае ошибки

Аргумент

sockfd
представляет собой дескриптор сокета, возвращаемый функцией
socket
. Второй аргумент задает идентификатор ассоциации для сокетов типа «один-ко-многим». Для сокетов типа «один-к-одному» этот аргумент игнорируется.
addrs
— адрес указателя, который функция
sctp_getpaddrs
заполнит упакованным списком адресов, выделив под него локальный буфер (см. рис. 9.3 и листинг 23.12). Для освобождения буфера, созданного
sctp_getpaddrs
, следует использовать вызов
sctp_freepaddrs
.

9.6. Функция sctp_freepaddrs

Функция

sctp_freepaddrs
освобождает ресурсы, выделенные вызовом
sctp_getpaddrs
.

#include <netinet/sctp.h>

void sctp_freepaddrs(struct sockaddr * addrs);

Здесь аргумент

addrs
— указатель на массив адресов, возвращаемый
sctp_getpaddrs
.

9.7. Функция sctp_getladdrs

Функция

sctp_getladdrs
может использоваться для получения списка локальных адресов, относящихся к определенной ассоциации. Эта функция бывает необходима в тех случаях, когда приложению требуется узнать, какие именно локальные адреса оно использует (набор адресов, напомним, может быть произвольным подмножеством всех адресов системы).

#include <netinet/sctp.h>

int sctp_getladdrs(int sockfd, sctp_assoc_t id, struct sockaddr ** addrs);

Возвращает: количество локальных адресов, помещенных в addrs, или -1 в случае ошибки.

Здесь

sockfd
— дескриптор сокета, возвращаемый функцией
socket
. Аргумент
id
— идентификатор ассоциации для сокетов типа «один-ко-многим». Поле
id
игнорируется
для сокетов типа «один-к-одному». Параметр представляет собой адрес указателя на буфер, выделяемый и заполняемый функцией
sctp_getladdrs
. В этот буфер помещается упакованный список адресов. Структура списка представлена на рис. 9.3 и в листинге 23.12. Для освобождения буфера процесс должен вызвать функцию
sctp_freeladdrs
.

9.8. Функция sctp_freeladdrs

Функция

sctp_freeladdrs
освобождает ресурсы, выделенные при вызове
sctp_getladdrs
.

#include <netinet/sctp.h>

void sctp_freeladdrs(struct sockaddr * addrs);

Здесь

addrs
указывает на список адресов, возвращаемый
sctp_getladdrs
.

9.9. Функция sctp_sendmsg

Приложение может управлять параметрами SCTP, используя функцию

sendmsg
со вспомогательными данными (см. главу 14). Однако из-за неудобств, связанных с применением вспомогательных данных, многие реализации SCTP предоставляют дополнительный библиотечный вызов (который на самом деле может быть и системным вызовом), упрощающий обращение к расширенным функциям SCTP. Вызов функции должен иметь следующий формат:

ssize_t sctp_sendmsg(int sockfd, const void * msg, size_t msgsz,

const struct sockaddr * to, socklen_t tolen, uint32_t ppid,

uint32_t flags, uint16_t stream, uint32_t timetolive,

uint32_t context);

Возвращает: количество записанных байтов в случае успешного завершения, -1 в случае ошибки

Использование

sctp_sendmsg
значительно упрощает отправку параметров, но требует указания большего количества аргументов. В поле
sockfd
помещается дескриптор сокета, возвращенный системным вызовом socket. Аргумент
msg
указывает на буфер размера
msgsz
, содержимое которого должно быть передано собеседнику. В поле
tolen
помещается длина адреса, передаваемого через аргумент
to
. В поле
ppid
помещается идентификатор протокола, который будет передан вместе с порцией данных. Поле
flags
передается стеку SCTP. Разрешенные значения этого поля приводятся в табл. 7.5.

Номер потока SCTP указывается вызывающим приложением в аргументе

stream
. Процесс может указать время жизни сообщения в миллисекундах в поле
lifetime
. Значение 0 соответствует бесконечному времени жизни. Пользовательский контекст, при наличии такового, может быть указан в поле
context
. Пользовательский контекст связывает неудачную передачу сообщения (о которой получено уведомление) с локальным контекстом, имеющим отношение к приложению. Например, чтобы отправить сообщение в поток 1 с флагом отправки
MSG_PR_SCTP_TTL
, временем жизни равным 1000 мс, идентификатором протокола 24 и контекстом 52, процесс должен сделать следующий вызов:

Поделиться с друзьями: