8.13. Отсутствие управления потоком в UDP

8.13. Отсутствие управления потоком в UDP

Теперь мы проверим, как влияет на работу приложения отсутствие какого-либо управления потоком в UDP. Сначала мы изменим нашу функцию dg_cli так, чтобы она отправляла фиксированное число дейтаграмм. Она больше не будет читать из стандартного потока ввода. В листинге 8.9 показана новая версия функции. Эта функция отправляет серверу 2000 дейтаграмм UDP по 1400 байт каждая.

Листинг 8.9. Функция dg_cli, отсылающая фиксированное число дейтаграмм серверу

//udpcliserv/dgcliloop1.c

 1 #include "unp.h"

 2 #define NDG 2000 /* количество дейтаграмм для отправки */

 3 #define DGLEN 1400 /* длина каждой дейтаграммы */

 4 void

 5 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)

 6 {

 7  int i;

 8  char sendline[DGLEN];

 9  for (i = 0; i < NDG; i++) {

10   Sendto(sockfd, sendline, DGLEN, 0, pservaddr, servlen);

11  }

12 }

Затем мы изменяем сервер так, чтобы он получал дейтаграммы и считал число полученных дейтаграмм. Сервер больше не отражает дейтаграммы обратно клиенту. В листинге 8.10 показана новая функция dg_echo. Когда мы завершаем процесс сервера нажатием клавиши прерывания на терминале (что приводит к отправке сигнала SIGINT процессу), сервер выводит число полученных дейтаграмм и завершается.

Листинг 8.10. Функция dg_echo, считающая полученные дейтаграммы

//udpcliserv/dgecholoop1.c

 1 #include "unp.h"

 2 static void recvfrom_int(int);

 3 static int count;

 4 void

 5 dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)

 6 {

 7  socklen_t len;

 8  char mesg[MAXLINE];

 9  Signal (SIGINT, recvfrom_int);

10  for (;;) {

11   len = clilen;

12   Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);

13   count++;

14  }

15 }

16 static void

17 recvfrom_int(int signo)

18 {

19  printf(" received %d datagrams ", count);

20  exit(0);

21 }

Теперь мы запускаем сервер на узле freebsd, который представляет собой медленный компьютер SPARCStation. Клиент мы запускаем в значительно более быстрой системе RS/6000 с операционной системой aix. Они соединены друг с другом напрямую каналом Ethernet на 100 Мбит/с. Кроме того, мы запускаем программу netstat -s на узле сервера и до, и после запуска клиента и сервера, поскольку выводимая статистика покажет, сколько дейтаграмм мы потеряли. В листинге 8.11 показан вывод сервера.

Листинг 8.11. Вывод на узле сервера

freebsd % netstat -s -p udp

udp:

 71208 datagrams received

 0 with incomplete header

 0 with bad data length field

 0 with bad checksum

 0 with no checksum

 832 dropped due to no socket

 16 broadcast/multicast datagrams dropped due to no socket

 1971 dropped due to full socket buffers

 0 not for hashed pcb

 68389 delivered

 137685 datagrams output

freebsd % udpserv06 запускаем наш сервер

                    клиент посылает дейтаграммы

^C для окончания работы клиента вводим наш символ прерывания

freebsd % netstat -s -р udp

udp

 73208 datagrams received

 0 with incomplete header

 0 with bad data length field

 0 with bad checksum

 0 with no checksum

 832 dropped due to no socket

 16 broadcast/multicast datagrams dropped due to no socket

 3941 dropped due to full socket buffers

 0 not for hashed pcb

 68419 delivered

 137685 datagrams output

Клиент отправил 2000 дейтаграмм, но приложение-сервер получило только 30 из них, что означает уровень потерь 98%. Ни сервер, ни клиент не получают сообщения о том, что эти дейтаграммы потеряны. Как мы и говорили, UDP не имеет возможности управления потоком — он ненадежен. Как мы показали, для отправителя UDP не составляет труда переполнить буфер получателя.

Если мы посмотрим на вывод программы netstat, то увидим, что общее число дейтаграмм, полученных узлом сервера (не приложением-сервером) равно 2000 (73 208 – 71 208). Счетчик dropped due to full socket buffers (отброшено из-за переполнения буферов сокета) показывает, сколько дейтаграмм было получено UDP и проигнорировано из-за того, что приемный буфер принимающего сокета был полон [128, с. 775]. Это значение равно 1970 (3941 – 1971), что при добавлении к выводу счетчика дейтаграмм, полученных приложением (30), дает 2000 дейтаграмм, полученных узлом. К сожалению, счетчик дейтаграмм, отброшенных из-за заполненного буфера, в программе netstat распространяется на всю систему. Не существует способа определить, на какие приложения (например, какие порты UDP) это влияет.

Число дейтаграмм, полученных сервером в этом примере, недетерминировано. Оно зависит от многих факторов, таких как нагрузка сети, загруженность узла клиента и узла сервера.

Если мы запустим тот же клиент и тот же сервер, но на этот раз клиент на медленной системе Sun, а сервер на быстрой системе RS/6000, никакие дейтаграммы не теряются.

aix % udpserv06

^? после окончания работы клиента вводим наш символ прерывания

received 2000 datagrams

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

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

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

Отсутствие комплексного подхода

Из книги Продвижение бизнеса в Интернет. Все о PR и рекламе в сети автора Гуров Филипп

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


Отсутствие единого стандарта

Из книги Skype: бесплатные звонки через Интернет. Начали! автора Гольцман Виктор Иосифович

Отсутствие единого стандарта Еще один существенный недостаток заключается в том, что в мире VoIP до сих пор нет единых стандартов. Связисты Международного телекоммуникационного союза (International Telecommunication Union, или ITU) продвигают стандарт Н.323, компьютерщики же придумали


Отсутствие защиты (уровень 10)

Из книги Основы AS/400 автора Солтис Фрэнк

Отсутствие защиты (уровень 10) Уровень 10 означает самую низкую степень защищенности — отсутствие таковой. Для доступа к системе не требуется пароля и любому пользователю разрешен доступ ко всем системным ресурсам и объектам без ограничений. Единственное условие —


5.2.10. Конструкции управления потоком данных

Из книги MySQL: руководство профессионала автора Паутов Алексей В

5.2.10. Конструкции управления потоком данных Конструкции IF, CASE, LOOP, WHILE, REPLACE ITERATE и LEAVE полностью выполнены.Многие из этих конструкций содержат другие инструкции, как обозначено спецификациями грамматики в следующих разделах. Такие конструкции могут быть вложены. Например,


8.9.11 Отсутствие аутентификации

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

8.9.11 Отсутствие аутентификации Еще одним неприятным свойством версии 1 является отсутствие аутентификации для сообщений RIP. Если некто получил доступ к сети и сформировал сообщение с заведомо ложной информацией (фальсифицировав адрес источника), то это может сделать


10.7 Управление потоком

Из книги Технология XSLT автора Валиков Алексей Николаевич

10.7 Управление потоком Получатель TCP загружается поступающим потоком данных и определяет, какой объем информации он сможет принять. Это ограничение воздействует на отправителя TCP. Представленное ниже объяснение данного механизма является концептуальным, и разработчики


Отсутствие "побочных" эффектов

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

Отсутствие "побочных" эффектов Одним из краеугольных принципов XSLT, с которым, увы, нелегко смириться разработчику, работавшему только с процедурными языками, — это отсутствие "побочных" эффектов. Под побочными эффектами в данном случае понимаются изменения в окружении


Глава 8. Управление потоком.

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

Глава 8. Управление потоком. В этой главе ...~ Использование управляющих структур для управления происходящим~ Проверка условий с помощью условных выражений~ Принятие решений с помощью операторов If. . .Then и SelectCase~ Повторение выполнения действий с помощью операторов For...Next, For


Управление потоком с помощью Go То

Из книги Создаем вирус и антивирус автора Гульев Игорь А.

Управление потоком с помощью Go То Если ваша программа вдруг стала неуправляемой, укажите ей, куда идти, - с помощью передачи управления другому участку программного кода в процедуре. Оператор Go To в совокупности со специальным оператором метки в месте назначения позволяет


Проверка на отсутствие АОН

Из книги Операционная система UNIX автора Робачевский Андрей М.

Проверка на отсутствие АОН Прежде чем получать адрес и звонить на BBS, нужно убедиться (например, путем звонка с сотового телефона, с телефона-двойника типа Panasonic, с таксофона или с телефона, который гарантированно не определяется системой АОН), что на данном узле


Стресс — это отсутствие самоконтроля

Из книги Разработка ядра Linux автора Лав Роберт

Стресс — это отсутствие самоконтроля Некоторых удивит факт, что существует четкая взаимосвязь между стрессом и самоконтролем. Обычно мы говорим: «Ну что за стресс!», если эскалатор сломан, нам пришлось подняться на пятый этаж по лестнице, утирая пот со лба. На самом деле с


Управление потоком

Из книги QT 4: программирование GUI на С++ автора Бланшет Жасмин

Управление потоком Управление потоком осуществляется прикладным процессом с помощью команд системного вызова ioctl(2):#include <sys/types.h>#include <stropts.h>#include <sys/conf.h>int ioctl(int fildes, int command, ... /* arg */);Хотя часть команд обрабатывается исключительно головным модулем потока, другие


Отсутствие библиотеки libc

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

Отсутствие библиотеки libc В отличие от обычных пользовательских приложений, ядро не компонуется со стандартной библиотекой функций языка С (и ни с какой другой библиотекой такого же типа). Для этого есть несколько причин, включая некоторые ситуации с дилеммой о курице и


Отсутствие защиты памяти

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

Отсутствие защиты памяти Когда прикладная программа предпринимает незаконную попытку обращения к памяти, ядро может перехватить эту ошибку и аварийно завершить соответствующий процесс. Если ядро предпринимает попытку некорректного обращения к памяти, то результаты


Взаимодействие с главным потоком

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

Взаимодействие с главным потоком При запуске приложения Qt работает только один поток — главный. Только этот поток может создать объект QApplication или QCoreApplication и вызвать для него функцию exec(). После вызова exec() этот поток либо ожидает возникновения какого-нибудь события, либо