Указатель устанавливается на начало буфера адресов, после чего вызывается функция
sctp_bindx
, в качестве аргументов которой используется раскодированный ранее набор адресов.
Успешное завершение
20-21
Если мы добрались до этого места, можно считать, что выполнение прошло успешно, поэтому мы освобождаем память и возвращаем управление вызвавшему процессу.
В листинге 23.8 представлен
модифицированный эхо-сервер, связывающий сокет с набором адресов, передаваемых в командной строке. Мы слегка изменили код сервера, чтобы он отправлял эхо-сообщения по тем потокам, по которым были приняты исходные сообщения.
Листинг 23.8. Сервер, работающий с произвольным набором адресов
if (argc < 2)
err_quit("Error, use %s [list of addresses to bind]\n", argv[0]);
if (sctp_bind_arg_list(sock_fd, argv + 1, argc — 1))
err_sys("Can't bind the address set");
bzero(&evnts, sizeof(evnts));
evnts sctp_data_io_event = 1;
Работа с IPv6
14
Это тот же сервер, с которым мы работали во всех предыдущих разделах этой главы, но с незначительным изменением. Сервер создает сокет
AF_INET6
, что позволяет ему работать с протоколом IP обеих версий.
Вызов sctp_bind_arg_list
15-16
Сервер вызывает новую функцию
sctp_bind_arg_list
и передает ей список аргументов для обработки.
23.7. Получение адресов
Поскольку протокол SCTP ориентирован на многоинтерфейсные узлы, для определения адресов локального и удаленного узла не могут использоваться те же механизмы, что и в TCP. В этом разделе мы изменим код клиента, добавив в него подписку на уведомление о событии COMMUNICATION UP. В этом уведомлении клиент будет получать сведения об адресах, между которыми установлена ассоциация. В листингах 23.9 и 23.10 представлены изменения в коде клиента. Листинги 23.11 и 23.12 содержат добавления к коду клиента.
Клиент устанавливает переменную, в которой хранится длина адреса, и вызывает функцию
sctp_recvmsg
для получения эхо-ответа сервера на свое сообщение.
Проверка уведомлений
25-26
Клиент проверяет, не является ли полученное сообщение уведомлением. В последнем случае он вызывает функцию обработки уведомлений, представленную в листинге 23.11.
Переход на начало цикла
27
Если сообщение действительно было уведомлением, происходит переход на начало цикла ожидания сообщений.
Отображение сообщения
28-30
Клиент отображает сообщение и переходит к ожиданию пользовательского ввода.
Теперь мы можем изучить новую функцию
sctp_check_notification
, которая будет отображать адреса обоих конечных точек при получении уведомления об изменении состояния ассоциации.
Листинг 23.11. Обработка уведомлений
//sctp/sctp_check_notify.c
1 #include "unp.h"
2 void
3 check_notification(int sock_fd, char *recvline, int rd_len)