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

на главную - закладки

Жанры

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

8 int num_rem, num_loc;

9 snp = (union sctp_notification*)recvline;

10 if (snp->sn_header.sn_type == SCTP_ASSOC_CHANGE) {

11 sac = &snp->sn_assoc_change;

12 if ((sac->sac_state == SCTP_COMM_UP) ||

13 (sac->sac_state == SCTP_RESTART)) {

14 num_rem = sctp_getpaddrs(sock_fd, sac->sac_assoc_id, &sar);

15 printf("There are %d remote addresses and they are:\n", num_rem);

16 sctp_print_addresses(sar, num_rem);

17 sctp_freepaddrs(sar);

18 num_loc = sctp_getladdrs(sock_fd.sac->sac_assoc_id, &sal);

19 printf("There are %d local addresses and they are:\n", num_loc);

20 sctp_print_addresses(sal, num_loc);

21 sctp_freeladdrs(sal);

22 }

23 }

24 }

Проверка
типа уведомления

9-13
Функция преобразует буфер приема к типу универсального указателя на уведомления, чтобы определить тип полученного уведомления. Из всех уведомлений нас интересуют только уведомления об изменении ассоциации, а из них — уведомления о создании или перезапуске ассоциации (
SCTP_COMM_UP
и
SCTP_RESTART
). Все прочие уведомления нас не интересуют.

Получение и вывод адресов собеседника

14-17
Функция
sctp_getpaddrs
возвращает нам список удаленных адресов, которые мы выводим при помощи функции
sctp_print_addresses
, представленной в листинге 23.12. После работы с ней мы освобождаем ресурсы, выделенные
sctp_getpaddrs
, вызывая функцию
sctp_freepaddrs
.

Получение и вывод локальных адресов

18-21
Функция
sctp_getladdrs
возвращает нам список локальных адресов, которые мы выводим на экран вместе с их общим количеством. После завершения работы с адресами мы освобождаем память вызовом
sctp_freeladdrs
.

Последняя из новых функций называется

sctp_print_addresses
. Она выводит на экран адреса из списка, возвращаемого функциями
sctp_getpaddrs
и
sctp_getladdrs
. Текст функции представлен в листинге 23.12.

Листинг 23.12. Вывод списка адресов

//sctp/sctp_print_addrs.c

1 #include "unp.h"

2 void

3 sctp_print_addresses(struct sockaddr_storage *addrs, int num)

4 {

5 struct sockaddr_storage *ss;

6 int i, salen;

7 ss = addrs;

8 for (i=0; i<num; i++){

9 printf("%s\n", Sock_ntop((SA*)ss, salen));

10 #ifdef HAVE_SOCKADDR_SA_LEN

11 salen = ss->ss_len;

12 #else

13 swilch (ss->ss_family) {

14 case AF_INET:

15 salen = sizeof(struct sockaddr_in);

16 break;

17 #ifdef IPV6

18 case AF_INET6:

19 salen = sizeof(struct sockaddr_in6);

20 break;

21 #endif

22 default:

23 err_auit("sctp_print_addresses: unknown AF");

24 break;

25 }

26 #endif

27 ss = (struct sockaddr_storage*)((char*)ss + salen);

28 }

29 }

Последовательная
обработка адресов

7-8
Функция перебирает адреса в цикле. Общее количество адресов указывается вызывающим процессом.

Вывод адреса

9
Адрес преобразуется к удобочитаемому виду функцией
sock_ntop
, которая, как вы помните, должна работать со структурами адреса сокета всех форматов, поддерживаемых системой.

Определение размера адреса

10-26
Список адресов передается в упакованном формате. Это не просто массив структур s
ockaddr_storage
. Дело в том, что структура
sockaddr_storage
достаточно велика, и ее нецелесообразно использовать при передаче адресов между ядром и пользовательскими процессами. В системах, где эта структура содержит внутреннее поле длины, обработка списка является делом тривиальным: достаточно извлекать длину из текущей структуры
sockaddr_storage
. В прочих системах длина определяется на основании семейства адреса. Если семейство не определено, функция завершает работу с сообщением об ошибке.

Перемещение указателя

27
К указателю на элемент списка прибавляется размер адреса. Таким образом осуществляется перемещение по списку адресов.

Выполнение программы

Результат взаимодействия модифицированного клиента с сервером представлен ниже.

FreeBSD-lap: ./sctpclient01 10.1.1.5

[0]Hi

There are 2 remote addresses and they are:

Поделиться:
Популярные книги

Заход. Солнцев. Книга XII

Скабер Артемий
12. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Заход. Солнцев. Книга XII

Случайная свадьба (+ Бонус)

Тоцка Тала
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Случайная свадьба (+ Бонус)

Приручитель женщин-монстров. Том 3

Дорничев Дмитрий
3. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 3

Ищу жену для своего мужа

Кат Зозо
Любовные романы:
любовно-фантастические романы
6.17
рейтинг книги
Ищу жену для своего мужа

Сердце Дракона. Том 19. Часть 1

Клеванский Кирилл Сергеевич
19. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.52
рейтинг книги
Сердце Дракона. Том 19. Часть 1

Пустоцвет

Зика Натаэль
Любовные романы:
современные любовные романы
7.73
рейтинг книги
Пустоцвет

Жребий некроманта. Надежда рода

Решетов Евгений Валерьевич
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50
рейтинг книги
Жребий некроманта. Надежда рода

Возвышение Меркурия. Книга 4

Кронос Александр
4. Меркурий
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Возвышение Меркурия. Книга 4

Бездомыш. Предземье

Рымин Андрей Олегович
3. К Вершине
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Бездомыш. Предземье

Столичный доктор. Том II

Вязовский Алексей
2. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том II

Последний из рода Демидовых

Ветров Борис
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Последний из рода Демидовых

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Измена. Не прощу

Леманн Анастасия
1. Измены
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Измена. Не прощу

Измена. Верну тебя, жена

Дали Мила
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верну тебя, жена