Пример: дополнительные свойства внеполосных данных
Пример: дополнительные свойства внеполосных данных
Теперь мы покажем другой столь же простой пример, иллюстрирующий две дополнительные особенности внеполосных данных, о которых мы уже упоминали ранее.
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 (алгоритм Нагла, предотвращение синдрома «глупого окна») при этом блокируются.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Дополнительные свойства мыши
Дополнительные свойства мыши В «Букваре» я писала о том, как пользоваться компьютерной мышью. Сейчас мы с вами рассмотрим некоторые дополнительные свойства этого устройства. Анекдот Сегодня в живую видел один из самых быстрых каналов передачи данных: 32 Гб в
Пример: использование указательных типов данных
Пример: использование указательных типов данных Аргументом потока, передаваемым функции потока при вызове CreateThread и _beginthreadex (см. главу 7), является указатель типа PVOID. Иногда программист может захотеть передать функции потока только целочисленное значение, указывающее,
4.6. Дополнительные свойства файлов
4.6. Дополнительные свойства файлов Основные атрибуты файловАтрибуты – это дополнительные свойства папки или файла. Для просмотра и изменения атрибутов служит окно свойств файла или папки (рис. 4.27), которое можно открыть, щелкнув правой кнопкой мыши на значке объекта и
Пример: особенности отметки внеполосных данных
Пример: особенности отметки внеполосных данных Далее мы приводим простой пример, иллюстрирующий следующие две особенности отметки внеполосных данных:1. Отметка внеполосных данных всегда указывает на один байт дальше конечного байта обычных данных. Это означает, что,
Пример: единственность отметки внеполосных данных в TCP
Пример: единственность отметки внеполосных данных в TCP Нашим очередным примером мы иллюстрируем тот факт, что для данного соединения TCP существует всего одна отметка внеполосных данных, и если новые внеполосные данные прибудут прежде, чем принимающий процесс начнет
24.4. Резюме по теме внеполосных данных TCP
24.4. Резюме по теме внеполосных данных TCP Все приведенные до сих пор примеры, иллюстрирующие использование внеполосных данных, были весьма тривиальны. К сожалению, когда мы начинаем учитывать возможные проблемы, связанные с согласованием во времени при пересылке
Пример диалога Свойства
Пример диалога Свойства Для примера рассмотрим диалог Свойства какого-нибудь устройства. Для этого будет использоваться стандартный способ группировки устройств. Например, выберите группу DVD и CD-ROM дисководы. Если вы имеете несколько дисководов такого типа, то данная
Дополнительные настройки диалогов Свойства
Дополнительные настройки диалогов Свойства С помощью системного реестра существует возможность изменения содержимого диалогового окна Свойства для некоторых устройств. Вкратце рассмотрим эти возможности.Если на вашей материнской плате присутствуют USB-порты, то в
Дополнительные сведения о типах данных
Дополнительные сведения о типах данных В этом разделе приводятся рекомендации по поводу того, где и когда использовать различные типа данных VBA. При этом рассматриваются все типы данных, кроме двух. Тип данных Object, хотя и очень полезен, но достаточно сложный, поэтому
6.1.6. Учебный пример: база данных Terminfo
6.1.6. Учебный пример: база данных Terminfo База данных terminfo представляет собой набор описаний видеотерминалов. В каждой записи описываются escape-последовательности, которые осуществляют различные операции на экране терминала, такие как вставка или удаление строк, удаление
Рабочий пример источника поставщика данных
Рабочий пример источника поставщика данных Давайте построим консольное приложение (с именем DataProviderFactory), которое будет печатать имена и фамилии авторов из таблицы Authors базы данных Pubs, создаваемой при установке Microsoft SQL Server (Pubs представляет собой пример базы данных
Поддержка данных состояния Web-сервисов с помощью свойства EnableSession
Поддержка данных состояния Web-сервисов с помощью свойства EnableSession Вы, наверное, помните из главы 24 о том, что свойства Application и Session позволяют Web-приложению ASP.NET поддерживать данные состояния. Web-сервисы XML обеспечивают те же возможности с помощью базового класса
Пример базы данных
Пример базы данных Везде в этой книге языковые примеры используют пример базы данных, которая находится в каталоге Examples в папке, где установлен Firebird. В дистрибутиве Firebird 1.0.x она называлась employee.gdb. В Firebird 1.5 это employee.fdb.Краткое описание примера базы данных содержится в
Приложение 6. Пример базы данных
Приложение 6. Пример базы данных Пример базы данных инсталлируется вместе в Firebird в каталог /examples в корневом каталоге Firebird. В Firebird 1.0 это база данных диалекта 1, ее имя employee.gdb. В версии 1.5 она имеет диалект 3 и имя employee.fdb. Структурно это та же самая база данных.Эта база данных
Дополнительные свойства поля
Дополнительные свойства поля Главным свойством поля является его тип, но с помощью конструктора таблиц для каждого поля можно применять и другие свойства. С их помощью можно задать формат поля, сделать ввод данных в поле удобнее и предотвратить ошибки. Набор