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

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

Шрифт:
Проверка необходимости увеличения статического буфера

25-34
Если остаток приемного буфера оказался меньше некоторого минимального значения, этот буфер необходимо увеличить. С этой целью мы вызываем функцию
realloc
, выделяющую буфер большего размера, после чего копируем в новый буфер данные из старого буфера. Если по какой-то причине размер буфера не может быть увеличен, функция завершает свою работу с выводом сообщения об ошибке.

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

35-36
Новые данные считываются из буфера вызовом
sctp_recvmsg
.

Шаг вперед

37-38
Функция увеличивает индекс буфера, после чего возвращается на проверку полного считывания сообщения.

После завершения цикла

39-40
После завершения цикла функция копирует количество считанных байтов в буфер, указатель на который передается ей вызвавшим процессом, и возвращает этому процессу указатель на собственный буфер.

Теперь мы можем изменить сервер SCTP таким образом, чтобы он использовал нашу новую функцию. Новый код представлен в листинге 23.3.

Листинг 23.3. Сервер SCTP, использующий API частичной доставки

//sctp/sctpserv05.c

26 for (;;) {

27 len = sizeof(struct sockaddr_in);

28 bzero(&sri,.sizeof(sri));

29 readbuf = pdapi_recvmsg(sock_fd, &rd_sz,

30 (SA*)&cliaddr, &len, &sri, &msg_flags);

31 if (readbuf == NULL)

32 continue;

Чтение сообщения

29-30
Сервер вызывает новую функцию-обертку интерфейса частичной доставки. Предварительно обнуляется переменная
sri
.

Проверка наличия считанных данных

31-32
Обратите внимание, что теперь серверу приходится проверять объем буфера, чтобы убедиться, что чтение было успешным. Если буфер оказывается нулевым, программа переходит на начало цикла.

23.4. Уведомления

В разделе 9.14 уже отмечалось, что приложение может подписаться на уведомления, общее количество которых составляет 7 штук. Пока что наше приложение игнорировало все события, за исключением прихода новых данных. В этом разделе приводятся примеры приема и интерпретации уведомлений SCTP о других событиях транспортного уровня. В листинге 23.4 представлена функция, отображающая все получаемые уведомления. Нам придется изменить и код сервера, чтобы разрешить доставку уведомлений обо всех происходящих событиях. Однако сервер не будет использовать получаемые уведомления для чего-либо конкретного.

Листинг 23.4. Функция вывода уведомлений

1 #include "unp.h"

2 void

3 print_notification(char *notify_buf)

4 {

5 union sctp_notification *snp;

6 struct sctp_assoc_change *sac;

7 struct sctp_paddr_change *spc;

8 struct sctp_remote_error *sre;

9 struct sctp_send_failed *ssf;

10 struct sctp_shutdown_event *sse;

11 struct sctp_adaption_event *ae;

12 struct sctp_pdapi_event *pdapi,

13 const char *str;

14 snp = (union sctp_notification*)notify_buf;

15 switch (snp->sn_header.sn_type) {

16 case SCTP_ASSOC_CHANGE:

17 sac = &snp->sn_assoc_change;

18 switch (sac->sac_state) {

19 case SCTP_COMM_UP:

20 str = "COMMUNICATION UP";

21 break;

22 case SCTP_COMM_LOST:

23 str = "COMMUNICATION LOST";

24 break;

25 case SCTP_RESTART:

  • Читать дальше
  • 1
  • ...
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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