LINUX.ORG.RU

Книга «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 ()

Господи, уже 30 лет из осиливших прочитать ман по сокетам каждое десятое чудо норовит книжонку написать.

#include "id_echo.h"

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

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

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

slovazap ★★★★★ ()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от slovazap

Ну уж Michael Kerrisk определённо имеет к ману по сокетам отношение чуть большее, чем просто «прочитал»

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

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

alpha ★★★★★ ()

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

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

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

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

crypt ★★★★★ ()
Последнее исправление: crypt (всего исправлений: 1)
Ответ на: комментарий от alpha

И, кстати сказать, Леннарт рекомендует.

Ты только что зашкварила может быть хорошую книгу.

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

Книжка больше про ядро, чем про C по-моему.

Сокеты это разве не glibc? Или там учат ядерные вызовы по одному дергать вместо глибцовых функций (маразм)?

Причем тут linux? :)

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

Так в том-то и дело, что програмный интерфейс ядра дергает glibc, а дергать его напрямую это очень плохая практика :)

Автор это знает и описывает именно дергание функций из glibc, но зачем-то обмазывает это именно каким-то линуксом.

anonymous ()

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

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

а между тем новость про выход нового pulseaudio не спешит появляться на лоре, даже спустя 5 дней после опеннета.

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

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

Но в целом даёт представление о работе Linux на низком уровне.

Я всю не прочитала конечно, штук восемь глав только, но было вполне читабельно.

alpha ★★★★★ ()

Что за организм изображен на обложке?
А то мне кажется, что это какое-то хищное растение, когда я буду спать, оно соскочит с обложки, заберётся ко мне под кожу и начнёт пожирать мою плоть…

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

io_uring есть? нет - нинужно!

если серьёзно. я бы порадовался если бы кто-то написал такую книгу по ЯДРУ. по внутренним апи. т.к. вот там с документацией всё как-то очень так себе - «читайте код».

правда книга устареет раньше, чем будет выпущена. поэтому нет, документация всё-таки лучше.)

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

Кстати, даже неплохая цена.

800 рублей * 0.7 = 560 рублей

560 / 75,68 = $7.40

fsb4000 ★★★★ ()
Ответ на: DL от qbbr

А где скачать то можно?

Прямо на сайте, заплатив 799 рублей, PDF+epub. Бумажная версия в 3,5 раза дороже.

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

Прямо на сайте, заплатив 799 рублей

если применить промокод LinuxAPI , то получите скидку 30%.

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

Теперь семья переводчика умрёт с голода…
Если серьёзно, я считаю, что в данном смысле книжку имеет поддерживать рублём, она выкладывается в неогороженном формате. А вот если 1 купит, а 99 скачают, издательство может решить «Да любись оно всё конём, в следующий раз жрите DRM».

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

«Вы скорбите о тех временах, когда мужчины были настоящими мужчинами и сами писали драйверы устройств?

🤨

fornlr ★★★★★ ()
Ответ на: Вот эта книга? от qbbr

Re: Вот эта книга?

)))))))))))))))))))))))))))))))) бугагашенька. Спасибо. Следующий перевод будет под DRM. Почитаю, если всё ок пойду и куплю, если не ок, то и читать перестану ибо нафик =)

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

Это статья издательтва «Питер» двухгодичной давности, автор новости просто скопировал, как я понял для популяризации книги.

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