Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

23 rd_sz = Sctp_recvmsg(sock_fd, recvline, sizeof(recvline),

24 (SA*)&peeraddr, &len, &sri, &msg_flags);

25 if (msg_flags & MSG_NOTIFICATION)

26 check_notification(sock_fd, recvline, rd_sz);

27 } while (msg_flags & MSG_NOTIFICATION);

28 printf("From str:%d seq:%d (assoc.0x%x) ",

29 sri.sinfo_stream, sri.sinfo_ssn, (u_int)sri.sinfo_assoc_id);

30 printf("%.*s", rd_sz.recvline);

Цикл ожидания сообщения

21-24
Клиент устанавливает переменную, в которой хранится длина адреса, и вызывает функцию
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)

4 {

5 union sctp_notification *snp;

6 struct sctp_assoc_change *sac;

7 struct sockaddr_storage *sal, *sar;

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
.

  • Читать дальше
  • 1
  • ...
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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