Читаем UNIX: разработка сетевых приложений полностью

Поскольку для каждой функции sendсервер определяет флаг MSG_EOR, каждый байт рассматривается как логическая запись, и функция readпри каждом вызове возвращает 1 байт. Причина в том, что Беркли-реализации поддерживают флаг MSG_EORпо умолчанию. Однако этот факт не документирован и не может использоваться в серийном коде. В данном примере мы используем эту особенность, чтобы показать разницу между потоком байтов и ориентированным на записи протоколом. С точки зрения реализации, каждая операция вывода идет в mbuf(буфер памяти) и флаг MSG_EORсохраняется ядром вместе с mbuf, когда mbufпереходит из отправляющего сокета в приемный буфер принимающего сокета. Когда вызывается функция read, флаг MSG_EORвсе еще присоединен к каждому mbuf, так что основная подпрограмма ядра read(поддерживающая флаг MSG_EOR, поскольку некоторые протоколы используют этот флаг) сама возвращает каждый байт. Если бы вместо readмы использовали recvmsg, флаг MSG_EORвозвращался бы в поле msg_flagsкаждый раз, когда recvmsgвозвращала бы 1 байт. Такой подход в TCP не срабатывает, поскольку отправляющий TCP не анализирует флаг MSG_EORв отсылаемом mbufи в любом случае у нас нет возможности передать этот флаг принимающему TCP в TCP-заголовке. (Выражаем благодарность Мату Томасу (Matt Thomas) за то, что он указал нам это недокументированное «средство».)

15.5. В листинге Д.7 приведена реализация данной программы.

Листинг Д.7. Определение фактического количества собранных в очередь соединений для различных значений аргумента backlog

//debug//backlog.c

 1 #include "unp.h"

 2 #define PORT 9999

 3 #define ADDR "127 0.0.1"

 4 #define MAXBACKLOG 100

 5 /* глобальные переменные */

 6 struct sockaddr_in serv;

 7 pid_t pid; /* дочерний процесс */

 8 int pipefd[2];

 9 #define pfd pipefd[1] /* сокет родительского процесса */

10 #define cfd pipefd[0] /* сокет дочернего процесса */

11 /* прототипы функций */

12 void do_parent(void);

13 void do_child(void);

14 int

15 main(int argc, char **argv)

16 {

17  if (argc != 1)

18   err_quit("usage: backlog");

19  Socketpair(AF_UNIX, SOCK_STREAM, 0, pipefd);

20  bzero(serv, sizeof(serv));

21  serv.sin_family = AF_INET;

22  serv.sin_port = htons(PORT);

23  Inet_pton(AF_INET, ADDR, serv.sin_addr);

24  if ((pid = Fork) == 0)

25   do_child;

26  else

27  do_parent;

28  exit(0);

29 }

30 void

31 parent_alrm(int signo)

32 {

33  return; /* прерывание блокированной функции connect */

34 }

35 void

36 do_parent(void)

27 {

38  int backlog, j, k, junk, fd[MAXBACKLOG + 1];

39  Close(cfd);

40  Signal(SIGALRM, parent_alrm);

41  for (backlog = 0; backlog = 14; backlogs) {

42   printf("backlog = %d. ", backlog);

43   Write(pfd, backlog. sizeof(int)); /* сообщение значения дочернему процессу */

44   Read(pfd, junk, sizeof(int)); /* ожидание дочернего процесса */

45   for (j = 1; j = MAXBACKLOG; j++) {

46    fd[j] = Socket(AF_INET, SOCK_STREAM, 0);

47    alarm(2);

48    if (connect(fd[j], (SA*)serv, sizeof(serv)) 0) {

49     if (errno != EINTR)

50      err_sys("connect error, j = %d", j);

51     printf("timeout, %d connections completed\n", j - 1);

52     for (k = 1; k = j; k++)

53      Close(fd[k]);

54     break; /* следующее значение backlog */

55    }

56    alarm(0);

57   }

58   if (j MAXBACKLOG)

59    printf("Id connections?\n", MAXBACKLOG);

60  }

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Access 2002: Самоучитель
Access 2002: Самоучитель

В книге рассматривается широкий круг вопросов, связанных с использованием программной среды Access 2002, которая является составной частью пакета Office 2002 и предназначена для создания банка данных в самых различных предметных областях.Подробно описывается методика проектирования объектов базы данных (таблицы, формы, отчеты, страницы доступа к данным, запросы, модули).Детально обсуждаются вопросы создания интегрированной базы данных в единой среде Access 2002: формирование БД с нуля, конвертирование в программную среду баз данных, созданных в ином программном окружении – Clarion, FoxPro.Особое внимание уделяется формированию разнообразных запросов к интегрированной базе данных Access 2002 с использованием языков программирования SQL, VBA и макросов.Приводятся общие сведения о возможностях языка обмена данными между различными компьютерами и приложениями (XML). Описываются возможности использования гиперссылок, связывающих базу данных с другими программными продуктами. Объясняется, как можно работать с базой данных Access 2002 без установки ее на компьютер, используя технологию ODBC (Open Data Base Connectivity). В приложениях приводятся количественные параметры Access 2002 и связанная с этой СУБД терминология.Предлагаемая книга будет полезна специалистам, занимающимся практической разработкой банков данных и приложений на их основе, а также студентам вузов, изучающим информатику.

Павел Юрьевич Дубнов

Программирование, программы, базы данных / ОС и Сети / Книги по IT

Все жанры