Читаем Linux API. Исчерпывающее руководство полностью

/* Формируем адрес сервера на основе первого аргумента командной строки */

sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);

if (sfd == -1)

fatal("Could not connect to server socket");

/* Посылаем серверу остальные аргументы в виде отдельных датаграмм */

for (j = 2; j < argc; j++) {

len = strlen(argv[j]);

if (write(sfd, argv[j], len)!= len)

fatal("partial/failed write");

numRead = read(sfd, buf, BUF_SIZE);

if (numRead == -1)

errExit("read");

printf("[%ld bytes] %.*s\n", (long) numRead, (int) numRead, buf);

}

exit(EXIT_SUCCESS);

}

sockets/id_echo_cl.c

Ниже показан пример того, что мы увидим при запуске сервера и двух экземпляров клиента:

$ su Для привязки к зарезервированному

порту нужны привилегии

Password:

# ./id_echo_sv Сервер переходит в фоновый режим

# exit Отказываемся от прав администратора

$ ./id_echo_cl localhost hello world Этот клиент отправляет две датаграммы

[5 bytes] hello Клиент выводит ответ, полученный от сервера

[5 bytes] world

$ ./id_echo_cl localhost goodbye Этот клиент шлет одну датаграмму

[7 bytes] goodbye

56.3. Параллельный TCP-сервер echo

TCP-служба echo тоже работает на порте под номером 7. Сервер принимает соединение и входит в бесконечный цикл, считывая все переданные ему данные и отправляя их обратно клиенту с помощью того же сокета. Сервер продолжает выполнять чтение, пока не обнаружит конец файла; после этого он закрывает свой сокет (чтобы клиент тоже получил символ конца файла, если все еще продолжает читать данные из своего сокета).

Клиент может отправить серверу данные неограниченного объема (следовательно, обслуживание клиента может занять неопределенное время), так что в подобном случае подходит архитектура параллельного сервера, которая позволяет работать с несколькими клиентами одновременно. Реализация серверного приложения показана в листинге 56.4 (реализация клиента для этой службы будет представлена в разделе 57.2). Стоит отметить следующие моменты.

• Чтобы стать демоном, сервер использует функцию becomeDaemon() из раздела 37.2.

• С целью сделать программу более компактной мы применяем библиотеку для работы с сокетами интернет-домена, разработанную в листинге 55.9.

• Поскольку сервер создает потомков для каждого клиентского соединения, мы должны следить за уничтожением зомби-процессов. Для этого используется обработчик SIGCHLD.

• В основе кода сервера лежит цикл for, который принимает клиентские соединения и выполняет вызов fork() в целях создать новый дочерний процесс, обслуживающий клиента с помощью функции handleRequest(). Тем временем родитель продолжает работу цикла for, чтобы принять следующее клиентское соединение.

В реальном приложении мы бы, вероятно, предусмотрели ограничение максимального количества дочерних процессов, которые может создать наш сервер; это помогло бы защититься от удаленной атаки, заключающейся в слишком интенсивном использовании службы и создании количества потомков, приводящего к зависанию системы. Данное ограничение можно ввести путем подсчета имеющихся дочерних процессов (счетчик инкрементируется после каждого успешного вызова fork() и декрементируется при уничтожении потомка с помощью обработчика SIGCHLD). В случае достижения ограничения мы могли бы временно приостановить прием соединений (или, как вариант, принимать соединения и тут же их закрывать).

• После каждого вызова fork() в дочернем процессе дублируется файловый дескриптор для слушающего и подключающегося сокетов (см. подраздел 24.2.1). То есть взаимодействовать с клиентским сокетом может как родитель, так и потомок. Однако заниматься этим нужно только потомку, так что сразу же после выполнения fork() родитель закрывает свой дескриптор подключенного сокета. (Если не совершить данное действие, то сокет так и будет оставаться открытым; кроме того, рано или поздно родитель исчерпает допустимое количество открытых файловых дескрипторов.) Так как потомок не принимает новые соединения, он закрывает свою копию файлового дескриптора для слушающего сокета.

• Обслужив клиента, дочерний процесс завершает работу.

Листинг 56.4. Параллельный сервер, реализующий TCP-службу echo

sockets/is_echo_sv.c

#include

#include

#include

#include "become_daemon.h"

#include "inet_sockets.h" /* Объявление функций сокета вида inet*() */

#include "tlpi_hdr.h"

#define SERVICE "echo" /* Имя TCP-службы */

#define BUF_SIZE 4096

static void /* Обработчик SIGCHLD, уничтожающий дочерние процессы */

grimReaper(int sig)

{

int savedErrno; /* Сохраняем значение 'errno' на случай,

если оно здесь изменится */

savedErrno = errno;

while (waitpid(-1, NULL, WNOHANG) > 0)

continue;

errno = savedErrno;

}

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных