LINUX.ORG.RU

Книга «Linux API. Исчерпывающее руководство»

 ,

Книга «Linux API. Исчерпывающее руководство»

5

2

Добрый день! Предлагаю вашему вниманию книгу «Linux API. Исчерпывающее руководство»(перевод книги The Linux Programming Interface). Ее можно заказать на сайте издательства, и если применить промокод LinuxAPI , то получите скидку 30%.

Отрывок из книги для ознакомления:

Сокеты: архитектура сервера

В этой главе мы обсудим основы проектирования итерационных и параллельных серверов, а также рассмотрим специальный демон inetd, который облегчает создание серверных интернет-приложений.

Итерационные и параллельные серверы

Существуют две распространенные архитектуры сетевых серверов на основе сокетов:

  • итерационная: сервер обслуживает клиентов по одному, сначала обрабатывая запрос (или несколько запросов) одного клиента и затем переходя к следующему;

  • параллельная: сервер спроектирован для обслуживания нескольких клиентов одновременно.

В разделе 44.8 уже был представлен пример итерационного сервера на основе очередей FIFO.

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

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

В следующих разделах мы рассмотрим примеры итерационного и параллельного серверов на основе сокетов интернет-домена. Эти два сервера реализуют упрощенный вариант службы echo (RFC 862), которая возвращает копию любого сообщения, посланного ей клиентом.

Итерационный UDP-сервер echo

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

UDP-сервер echo постоянно считывает датаграммы и возвращает отправителю их копии. Поскольку серверу нужно обрабатывать только одно сообщение за раз, здесь будет достаточно итерационной архитектуры. Заголовочный файл для серверов показан в листинге 56.1.

Листинг 56.1. Заголовочный файл для программ id_echo_sv.c и id_echo_cl.c

#include "inet_sockets.h" /* Объявляет функции нашего сокета */
#include "tlpi_hdr.h"

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

#define BUF_SIZE 500 /* Максимальный размер датаграмм, которые
могут быть прочитаны клиентом и сервером */
____________________________________________________________________sockets/id_echo.h 

В листинге 56.2 представлена реализация сервера. Стоит отметить следующие моменты:

  • для перевода сервера в режим демона мы задействуем функцию becomeDaemon() из раздела 37.2;

  • чтобы сделать программу более компактной, мы используем библиотеку для работы с сокетами интернет-домена, разработанную в разделе 55.12;

  • если сервер не может вернуть ответ клиенту, то записывает сообщение в журнал, применяя вызов syslog().

В реальном приложении мы бы, скорее всего, ввели определенное ограничение на частоту записи сообщений с помощью syslog(). Это исключило бы возможность переполнения системного журнала злоумышленником. К тому же не стоит забывать, что каждый вызов syslog() довольно затратный, так как по умолчанию использует fsync().

Листинг 56.2. Итерационный сервер, который реализует UDP-службу echo

_________________________________________________________________sockets/id_echo_sv.c
#include <syslog.h>
#include "id_echo.h"
#include "become_daemon.h"

int
main(int argc, char *argv[])
{
   int sfd;
   ssize_t numRead;
   socklen_t len;
   struct sockaddr_storage claddr;
   char buf[BUF_SIZE];
   char addrStr[IS_ADDR_STR_LEN];

   if (becomeDaemon(0) == -1)
       errExit("becomeDaemon");

   sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
   if (sfd == -1) {
      syslog(LOG_ERR, "Could not create server socket (%s)",
         strerror(errno));
      exit(EXIT_FAILURE);

   /* Получаем датаграммы и возвращаем отправителям их копии */
   }
   for (;;) {
      len = sizeof(struct sockaddr_storage);
       numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

       if (numRead == -1)
           errExit("recvfrom");
       if (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
            != numRead)
          syslog(LOG_WARNING, "Error echoing response to %s (%s)",
            inetAddressStr((struct sockaddr *) &claddr, len,
                addrStr, IS_ADDR_STR_LEN),
             strerror(errno));
   }
}
_________________________________________________________________sockets/id_echo_sv.c

Для проверки работы сервера мы используем программу из листинга 56.3. В ней тоже применяется библиотека для работы с сокетами интернет-домена, разработанная в разделе 55.12. В качестве первого аргумента командной строки клиентская программа принимает имя сетевого узла, на котором находится сервер. Клиент входит в цикл, где отправляет серверу каждый из оставшихся аргументов в виде отдельных датаграмм, а затем считывает и выводит датаграммы, полученные от сервера в ответ.

Листинг 56.3. Клиент для UDP-службы echo

#include "id_echo.h"

int
main(int argc, char *argv[])
{
   int sfd, j;
   size_t len;
   ssize_t numRead;
   char buf[BUF_SIZE];

   if (argc < 2 || strcmp(argv[1], "--help") == 0)
      usageErr("%s host msg...\n", argv[0]);

   /* Формируем адрес сервера на основе первого аргумента командной строки */
   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

Желаю приятного чтения)

>>> Можно купить на сайте издательства



Проверено: alpha ()
Последнее исправление: alpha (всего исправлений: 3)

Ответ на: комментарий от anonymous

Просто «обобщил».

Не всегда возможна «бесплатная работа».
ИМХО был бы не против поощрения авторов так.
Некий /типа FSF/ «оценивает» работу.
После этого код проприетарный лишь до того момента пока автор не получит свой гонорар.
Потом становится free.

anonymous
()
Ответ на: комментарий от crypt

Взрослый организм также предобработанную пищу усваивает быстрее если вы не забыли биологию за 7-8-ой класс….

AKonia ★★
()
Ответ на: комментарий от mx__

Вопрос: Это можно писать новости про все книжки из мира линукса или только именно эту ?

это зависит от того, модератор ты или нет%)

crypt ★★★★★
()
Ответ на: комментарий от anonymous

«Леннарт рекомендует» — это как «Проверено Shaman007».

Да и не Шаман он уже давно, так Sham man какой-то.

anonymous
()

книга 2010 года

anonymous
()
Ответ на: комментарий от anonymous

Спасибо, скачал.

Но зачем? Она написана 10 лет назад.

anonymous
()
Ответ на: комментарий от hobbit

Переводчики не дураки и получают деньги до публикации.

anonymous
()
Ответ на: комментарий от AKonia

d-_-b

Нет, я плачу работодателю, чтобы он мне дал работу))

qbbr ★★★★★
()
Ответ на: комментарий от anonymous

))))))

Да можешь не читать, оригинал выходил 10 лет назад, который писался пару лет и того = старьё канешно, но перевод точно этой книги спустя 10 лет не нужен.

qbbr ★★★★★
()
Ответ на: комментарий от AKonia

автор новости просто скопировал, как я понял для популяризации книги

А ее тут обоссали и подожгли.

anonymous
()
Ответ на: комментарий от fornlr

Я загрузчики писал.

Для 256-байтного сектора MBR?

pacify ★★★★★
()
Ответ на: комментарий от xperious

ну стивенс ж чисто про сеть писал… а тут не только сеть… прям усё

У него же ещё «Advanced Programming in the Unix Environment» есть, там тоже про всё)

x-signal ★★
()
Ответ на: комментарий от anonymous

Так что слова что люди цитирую «Более логичны на иностранном языке» это откровенная лож. Ибо эта логичность следствие более простого выражения своих мыслей без попыток играть на примерах и абстракциях

Отсюда и выводы - авторов надо заставлять писать книги на неродном языке, тем самым они будут порождать более лаконичные и прозрачные тексты

BydymTydym
()
Ответ на: комментарий от anonymous

Ну токсиков везде выше крыши, ничего не поделаешь - западные черты воспитания инфантилов и эгоцентриков этим славятся, а компьютерная сфера у нас ещё в 70-80-ых деграднула и позволила западнофильству себя пропитать и эту болячку преодолеем.

AKonia ★★
()
Ответ на: комментарий от anonymous

А чем она плоха ? Как учебник - норм, примеры - есть, список тем - широкий, в целом подача достойная, если цель вникнуть в определённую тему и сделать свою библиотеку или приложение на уровне пользователя - то прекрасно подходит, по сути это хорошо разжёванный, аннотированный man *

AKonia ★★
()

а где: gcc id_echo_sv.c In file included from id_echo_sv.c:3: id_echo.h:1:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before string constant 1 | include «inet_sockets.h» /* Объявляет функции нашего сокета */ | ^~~~~~~~~~~~~~~~ id_echo_sv.c:4:10: fatal error: become_daemon.h: Нет такого файла или каталога 4 | #include «become_daemon.h» | ^~~~~~~~~~~~~~~~~ compilation terminated.

выкладывали бы с пастой на пастбине то, что можно скомпилировать и собрать уже, чтобы работало.

anonymous
()

Анонимус одобряет

Оригинальная пдфка лежит в $HOME, хороший годный справочик. Содержимое не устарело, но отсутствуют всякие новомодные ebpf.

anonymous
()
Ответ на: комментарий от anonymous

Ещё запятые на письме имеют, сцуко, смысл.

anonymous
()
Ответ на: комментарий от AKonia

Может ты прав. Книжку я не читала, но вопрос о целесообразности разработке нового прикладного ПО на С и на таком низком уровне остался. Сейчас не 80 годы, когда кроме кобола, бейсика, С и фортрана нихрена не было.

       Лиза.
anonymous
()
Ответ на: комментарий от anonymous

Сейчас не 80 годы, когда кроме кобола, бейсика, С и фортрана нихрена не было.

Согласен, сейчас уже не 80-е, по сути то один C и Фортран остались.

anonymous
()
Ответ на: комментарий от anonymous

Книжку я не читала

На этом можно было пост и закончить.

         Михаил
anonymous
()
Ответ на: комментарий от anonymous

Сейчас не 80 годы, когда кроме кобола, бейсика, С и фортрана нихрена не было.

Это да.
В те года люди еще в шкурах ходили и пищу готовили на кострах …

anonymous
()
Ответ на: комментарий от anonymous

Наоборот. Большую часть кода можно легко написать на питоне, остальное на С++ или гошечке. И работь будет не только в линуксе.

На уровне голых сокетов уже сто лет никто не работает.

 Лиза.
anonymous
()
Ответ на: комментарий от Nervous

Мне тоже жалко упавшие Falkon’ы, но есть российские ракеты не падают уже пару лет, поэтому Россия может на эту тему спать спокойно.

AKonia ★★
()

Шикарная книга. Уже купил. Хотя, у меня ранее уже был английский вариант, но вдруг что не верно понял, перечитаю и на русском. В любом случае, спасибо!

lucentcode ★★★★★
()
Ответ на: комментарий от vitalif

У меня есть такая книга(и даже на русском, название искать лень). Правда когда она ко мне попала там вовсю расхваливали «только что вышедшее ядро 2.6». Было это кажись во времена когда у меня на десктопе было ядро 2.6.25 или что-то около того :-)

С тех пор я как-то попривык читать документации на еще не сдохший софт на англицком. Вот книгу по Turbo Pascal 7.0 можно читать на русском, но не более...

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)

Помогите. Мне кажется, что бесконечные циклы - это костыль. Что со мной?

anonymous
()
Ответ на: комментарий от anonymous

Помогите. Мне кажется, что бесконечные циклы - это костыль. Что со мной?

Если вы про пример с массивом, то там не бесконечный цикл, а ни разу не выполняющийся цикл. И как следствие, UB в строке с вызовом printf(). Подозреваю, что автор просто юморист и это не относилось к сути вопроса.

anonymous
()
Ответ на: комментарий от gutaper

плюсую. так и представляю, как на туда садится очередная муха-линуксойд и эта хрень ее сначала быстро хватает, а потом неспеша пережевывает.

anonymous
()
Ответ на: комментарий от anonymous

Он в сишку не умеет. Она хреново сочетается со смузи и бездельем.

anonymous
()
Ответ на: комментарий от AKonia

Верю, что преодолеете, главное, подальше от меня и чтобы не мешались.

anonymous
()
Ответ на: комментарий от Mischutka

Собрался было купить, но, почитав комментарии, передумал.

Гм.
А я вот настолько привык к электронным вариантам книг, что если бы
мне эту книгу подарили, то использовал бы ее в качестве подставки для кастрюль.

anonymous
()
Ответ на: комментарий от anonymous

А я вот настолько привык к электронным вариантам книг, что если бы мне эту книгу подарили, то использовал бы ее в качестве подставки для кастрюль.

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

anonymous
()
Ответ на: комментарий от AKonia

короче, для тех, кто сам не умеет обрабатывать. поскольку ты можешь быть еще в школе, то тебе может быть интересно узнать, чем отличаются школьные учебники 201х (202х) от более ранних. в них самое главное выделено. конспект для альтернативно одаренных, которые сами не в состоянии выделить главное по тексту. в точности то, что ты предлагаешь. «предобработка». можно вообще все предобрабатывать и для всего иметь шаблоны. вместо того, чтобы дотягивать слабых до сильных, можно бесконечно облегчать уровень для слабых.

crypt ★★★★★
()
Ответ на: комментарий от crypt

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

AKonia ★★
()
Ответ на: комментарий от AKonia

… ничего не хотят делать - ни уголь руками добывать,

И эшо: трактора используют, комбайны, газом пользуются, … - совсем … /«Гусарам молчать!»/.

anonymous
()
Ответ на: комментарий от anonymous

А что, Asio уже научился в sendmmsg/recvmmsg? Или буст настолько крут, что на менее эффективных системных вызовах реализует интерфейсы более эффективно, чем тупые сишники?

Softwayer ★★
()
Ответ на: комментарий от anonymous

Как будто что-то плохое. epoll вот тоже прибит, что никак не мешает его использовать примерно в каждом первом приложении, активно работающем с сетью (возможно, оборачивая в переносимые обёртки, если это требуется).

Softwayer ★★
()
Ответ на: комментарий от Softwayer

Авторы лучше тебя знают, почему им это не нужно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.