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

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

Шрифт:

36 if (msg_f1ags & MSG_NOTIFICATION) {

37 print_notification(readbuf);

38 continue;

39 }

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

21-30
Сервер изменяет параметры подписки на события таким образом, чтобы получать все возможные уведомления.

Получение данных

31-35
Эта часть кода сервера осталась неизменной.

Обработка уведомлений

36-39
Сервер проверяет поле
msg_flags
. Если сообщение представляет собой уведомление, сервер вызывает рассмотренную ранее функцию
sctp_print_notification
и переходит к обработке следующего сообщения.

Запуск программы

Мы запускаем клиент и отправляем одно сообщение.

FreeBSD-lap: ./sctpclient01 10.1.1.5

[0]Hello

From str:1 seq:0 (assoc:c99e15a0):[0]Hello

Control-D

FreeBSD-lap:

Сервер отображает сообщения обо всех происходящих событиях (приеме входящего соединения, получении сообщения, завершении соединения).

FreeBSD-lap: ./sctpserv06

SCTP_ADAPTION_INDICATION:0x504c5253

SCTP_ASSOC_CHANGE: COMMUNICATION UP, assoc=c99e2680h

SCTP_SHUTDOWN_EVENT; assoc=c99e2680h

SCTP_ASSOC_CHANGE: SHUTDOWN COMPLETE, assoc=c99e2680h

Control-C

Как видите, сервер действительно выводит сообщения обо всех происходящих событиях транспортного уровня.

23.5. Неупорядоченные данные

В обычном режиме SCTP обеспечивает надежную упорядоченную доставку данных. Кроме того, SCTP предоставляет и сервис надежной неупорядоченной доставки. Сообщение с флагом

MSG_UNORDERED
отправляется вне очереди и делается доступным для чтения сразу же после приема на удаленном узле. Такое сообщение может быть отправлено по любому потоку. Ему не присваивается порядковый номер внутри какого-либо потока. В листинге 23.6 представлены изменения кода клиента, позволяющие ему отправлять внеочередные запросы серверу.

Листинг 23.6. Функция sctp_strcli, отправляющая внеочередные данные

//sctp/sctp_strcli_un.c

18 out_sz = strlen(sendline);

19 Sctp_sendmsg(sock_fd, sendline, out_sz,

20 to, tolen, 0, MSG_UNORDERED, sri.sinfo_stream, 0, 0);

Отправка внеочередных данных

18-20
Функция
sctp_str_cli
практически не отличается от той, которую мы разработали в разделе 10.4. Единственное изменение произошло в строке 21: клиент передает флаг
MSG_UNORDERED
, включающий механизм частичной доставки. Обычно все сообщения внутри потока упорядочиваются по номерам. Флаг
MSG_UNORDERED
позволяет отправить сообщение без порядкового номера. Такое сообщение доставляется адресату сразу после получения его стеком SCTP, даже если другие внеочередные сообщения, отправленные ранее по тому же потоку, еще не были приняты.

23.6. Связывание с подмножеством адресов

Некоторым приложениям требуется связывать один сокет с некоторым конкретным подмножеством всех адресов узла. Протоколы TCP и UDP не позволяют выделить подмножество адресов. Системный вызов

bind
позволяет приложению связать сокет с единственным адресом или сразу со всеми адресами узла (то есть с универсальным адресом). Поэтому в SCTP был добавлен новый системный вызов
sctp_bindx
, который позволяет приложению связываться с произвольным количеством адресов. Все адреса должны иметь один и тот же номер порта, а если ранее вызывалась функция
bind
, то номер порта должен быть таким, как в вызове
bind
. Если указать не тот порт, вызов
sctp_bindx
завершится с ошибкой. В листинге 23.7 представлена функция, которую мы добавим к нашему серверу, чтобы получить возможность связывать сокет с адресами, передаваемыми в качестве аргументов командной строки.

Листинг 23.7. Функция, связывающая сокет с набором адресов

1 #include "unp.h"

2 int

3 sctp_bind_arg_list(int sock_fd, char **argv, int argc)

4 {

5 struct addrinfo *addr;

6 char *bindbuf, *p, portbuf[10];

7 int addrcnt=0;

8 int i;

9 bindbuf = (char*)Calloc(argc, sizeof(struct sockaddr_storage));

10 p = bindbuf;

11 sprintf(portbuf, "%d", SERV_PORT);

12 for (i=0; i<argc; i++ ) {

13 addr = Host_serv(argv[i], portbuf, AF_UNSPEC, SOCK_SEQPACKET);

14 memcpy(p, addr->ai_addr, addr->ai_addrlen);

15 freeaddrinfo(addr);

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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