Пример: дополнительные свойства внеполосных данных

Пример: дополнительные свойства внеполосных данных

Теперь мы покажем другой столь же простой пример, иллюстрирующий две дополнительные особенности внеполосных данных, о которых мы уже упоминали ранее.

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

2. Принимающий процесс может получить уведомление о том, что отправитель отослал внеполосные данные (с помощью сигнала SIGURG или функции select) до того, как эти данные фактически прибудут. Если после получения этого уведомления процесс вызывает функцию recv, задавая флаг MSG_OOB, а внеполосные данные еще не прибыли, то будет возвращена ошибка EWOULDBLOCK.

В листинге 24.8 приведена программа отправки.

Листинг 24.8. Программа отправки

//oob/tcpsend05.c

 1 #include "unp.h"

 2 int

 3 main(int argc, char **argv)

 4 {

 5  int sockfd, size;

 6  char buff[16384];

 7  if (argc != 3)

 8   err_quit("usage: tcpsend04 <host> <port#>");

 9  sockfd = Tcp_connect(argv[1], argv[2]);

10  size = 32768;

11  Setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));

12  Write(sockfd, buff, 16384);

13  printf("wrote 16384 bytes of normal data ");

14  sleep(5);

15  Send(sockfd, "a", 1, MSG_OOB);

16  printf("wrote 1 byte of OOB data ");

17  Write(sockfd, buff, 1024);

18  printf("wrote 1024 bytes of normal data ");

19  exit(0);

20 }

9-19 Этот процесс устанавливает размер буфера отправки сокета равным 32 768 байт, записывает 16 384 байт обычных данных, а затем на 5 с переходит в спящее состояние. Чуть ниже мы увидим, что приемник устанавливает размер приемного буфера сокета равным 4096 байт, поэтому данные, отправленные отсылающим TCP, с гарантией заполнят приемный буфер сокета получателя. Затем отправитель посылает один байт внеполосных данных, за которым следуют 1024 байт обычных данных, и, наконец, закрывает соединение.

В листинге 24.9 представлена принимающая программа.

Листинг 24.9. Принимающая программа

//oob/tcprecv05.c

 1 #include "unp.h"

 2 int listenfd, connfd;

 3 void sig_urg(int);

 4 int

 5 main(int argc, char **argv)

 6 {

 7  int size;

 8  if (argc == 2)

 9   listenfd = Tcp_listen(NULL, argv[1], NULL);

10  else if (argc == 3)

11   listenfd = Tcp_listen(argv[1], argv[2], NULL);

12  else

13   err_quit("usage: tcprecv05 [ <host> ] <port#>");

14  size = 4096;

15  Setsockopt(listenfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));

16  connfd = Accept(listenfd, NULL, NULL);

17  Signal(SIGURG, sig_urg);

18  Fcntl(connfd, F_SETOWN, getpid());

19  for (;;)

20   pause();

21 }

22 void

23 sig_urg(int signo)

24 {

25  int n;

26  char buff[2048];

27  printf("SIGURG received ");

28  n = Recv(connfd, buff, sizeof(buff) - 1, MSG_OOB);

29  buff[n] = 0; /* завершающий пустой байт */

30  printf("read %d OOB byte ", n);

31 }

14-20 Принимающий процесс устанавливает размер приемного буфера сокета приемника равным 4096 байт. Этот размер наследуется присоединенным сокетом после установления соединения. Затем процесс вызывает функцию accept, задает обработчик для сигнала SIGURG и задает владельца сокета. В главном цикле (бесконечном) вызывается функция pause.

22-31 Обработчик сигнала вызывает функцию recv для считывания внеполосных данных.

Если мы запускаем сначала принимающую программу, а затем программу отправки, то получаем следующий результат выполнения программы отправки:

macosx % tcpsend05 freebsd 5555

wrote 16384 bytes of normal data

wrote 1 byte of OOB data

wrote 1024 bytes of normal data

Как и ожидалось, все данные помещаются в буфер отправки сокета отправителя, и программа завершается. Ниже приведен результат работы принимающей программы:

freebsd4 % tcprecv05 5555

SIGURG received

recv error: Resource temporarily unavailable

Сообщение об ошибке, которое выдает наша функция err_sys, соответствует ошибке EAGAIN, которая в FreeBSD аналогична ошибке EWOULDBLOCK. TCP посылает уведомление об отправке внеполосных данных принимающему TCP, который в результате генерирует сигнал SIGURG для принимающего процесса. Но когда вызывается функция recv и задается флаг MSG_OOB, байт с внеполосными данными не может быть прочитан.

Для решения этой проблемы необходимо, чтобы получатель освобождал место в своем приемном буфере, считывая поступившие обычные данные. В результате TCP объявит для отправителя окно ненулевого размера, что в конечном счете позволит отправителю передать байт, содержащий внеполосные данные.

ПРИМЕЧАНИЕ

В реализациях, происходящих от Беркли [128, с. 1016-1017], можно отметить две близких проблемы. Во-первых, даже если приемный буфер сокета заполнен, ядро всегда принимает от процесса внеполосные данные для отправки собеседнику. Во-вторых, когда отправитель посылает байт с внеполосными данными, немедленно посылается сегмент TCP, содержащий срочное уведомление. Все обычные проверки вывода TCP (алгоритм Нагла, предотвращение синдрома «глупого окна») при этом блокируются.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Дополнительные свойства поля

Из книги Компьютер на 100. Начинаем с Windows Vista автора Зозуля Юрий

Дополнительные свойства поля Главным свойством поля является его тип, но с помощью конструктора таблиц для каждого поля можно применять и другие свойства. С их помощью можно задать формат поля, сделать ввод данных в поле удобнее и предотвратить ошибки. Набор


Рабочий пример источника поставщика данных

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Рабочий пример источника поставщика данных Давайте построим консольное приложение (с именем DataProviderFactory), которое будет печатать имена и фамилии авторов из таблицы Authors базы данных Pubs, создаваемой при установке Microsoft SQL Server (Pubs представляет собой пример базы данных


Поддержка данных состояния Web-сервисов с помощью свойства EnableSession

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

Поддержка данных состояния Web-сервисов с помощью свойства EnableSession Вы, наверное, помните из главы 24 о том, что свойства Application и Session позволяют Web-приложению ASP.NET поддерживать данные состояния. Web-сервисы XML обеспечивают те же возможности с помощью базового класса


6.1.6. Учебный пример: база данных Terminfo

Из книги Системное программирование в среде Windows автора Харт Джонсон М

6.1.6. Учебный пример: база данных Terminfo База данных terminfo представляет собой набор описаний видеотерминалов. В каждой записи описываются escape-последовательности, которые осуществляют различные операции на экране терминала, такие как вставка или удаление строк, удаление


Пример: использование указательных типов данных

Из книги VBA для чайников автора Каммингс Стив

Пример: использование указательных типов данных Аргументом потока, передаваемым функции потока при вызове CreateThread и _beginthreadex (см. главу 7), является указатель типа PVOID. Иногда программист может захотеть передать функции потока только целочисленное значение, указывающее,


Дополнительные сведения о типах данных

Из книги Windows Vista. Трюки и эффекты автора Зозуля Юрий

Дополнительные сведения о типах данных В этом разделе приводятся рекомендации по поводу того, где и когда использовать различные типа данных VBA. При этом рассматриваются все типы данных, кроме двух. Тип данных Object, хотя и очень полезен, но достаточно сложный, поэтому


4.6. Дополнительные свойства файлов

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

4.6. Дополнительные свойства файлов Основные атрибуты файловАтрибуты – это дополнительные свойства папки или файла. Для просмотра и изменения атрибутов служит окно свойств файла или папки (рис. 4.27), которое можно открыть, щелкнув правой кнопкой мыши на значке объекта и


Пример базы данных

Из книги Недокументированные и малоизвестные возможности Windows XP автора Клименко Роман Александрович

Пример базы данных Везде в этой книге языковые примеры используют пример базы данных, которая находится в каталоге Examples в папке, где установлен Firebird. В дистрибутиве Firebird 1.0.x она называлась employee.gdb. В Firebird 1.5 это employee.fdb.Краткое описание примера базы данных содержится в


Приложение 6. Пример базы данных

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Приложение 6. Пример базы данных Пример базы данных инсталлируется вместе в Firebird в каталог /examples в корневом каталоге Firebird. В Firebird 1.0 это база данных диалекта 1, ее имя employee.gdb. В версии 1.5 она имеет диалект 3 и имя employee.fdb. Структурно это та же самая база данных.Эта база данных


Пример диалога Свойства

Из книги Интернет для ржавых чайников автора Левина Любовь Трофимовна

Пример диалога Свойства Для примера рассмотрим диалог Свойства какого-нибудь устройства. Для этого будет использоваться стандартный способ группировки устройств. Например, выберите группу DVD и CD-ROM дисководы. Если вы имеете несколько дисководов такого типа, то данная


Дополнительные настройки диалогов Свойства

Из книги автора

Дополнительные настройки диалогов Свойства С помощью системного реестра существует возможность изменения содержимого диалогового окна Свойства для некоторых устройств. Вкратце рассмотрим эти возможности.Если на вашей материнской плате присутствуют USB-порты, то в


Пример: особенности отметки внеполосных данных

Из книги автора

Пример: особенности отметки внеполосных данных Далее мы приводим простой пример, иллюстрирующий следующие две особенности отметки внеполосных данных:1. Отметка внеполосных данных всегда указывает на один байт дальше конечного байта обычных данных. Это означает, что,


Пример: единственность отметки внеполосных данных в TCP

Из книги автора

Пример: единственность отметки внеполосных данных в TCP Нашим очередным примером мы иллюстрируем тот факт, что для данного соединения TCP существует всего одна отметка внеполосных данных, и если новые внеполосные данные прибудут прежде, чем принимающий процесс начнет


24.4. Резюме по теме внеполосных данных TCP

Из книги автора

24.4. Резюме по теме внеполосных данных TCP Все приведенные до сих пор примеры, иллюстрирующие использование внеполосных данных, были весьма тривиальны. К сожалению, когда мы начинаем учитывать возможные проблемы, связанные с согласованием во времени при пересылке


Дополнительные свойства мыши

Из книги автора

Дополнительные свойства мыши В «Букваре» я писала о том, как пользоваться компьютерной мышью. Сейчас мы с вами рассмотрим некоторые дополнительные свойства этого устройства. Анекдот Сегодня в живую видел один из самых быстрых каналов передачи данных: 32 Гб в