Фреймворк для серверного приложения (желательно с использованием BOOST C ++) - PullRequest
3 голосов
/ 18 ноября 2010

Я думаю о написании серверного приложения - по аналогии с MySQL или Apache.

Основные требования:

  1. Клиенты будут связываться с сервером через TCP / IP (сокеты)
  2. Сервер создаст новый дочерний процесс для обработки запросов (аля Apache)

В идеале я хотел бы использовать библиотеки BOOST, а не пытаться изобретать свои собственные. Где-то должен быть код, который делает большую часть того, что я пытаюсь сделать, - чтобы я мог использовать его (или хотя бы его часть в качестве отправной точки), может кто-нибудь указать мне полезную ссылку?

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

Мое главное беспокойство - как узнать, когда один из детей разбился. AFAIK, есть два способа сделать это:

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

Каков наилучший способ информирования родителей о том, что ребенок умер?

[Изменить]

Кстати, я занимаюсь разработкой / запуском / развертыванием в Linux

Ответы [ 6 ]

4 голосов
/ 18 ноября 2010

На какой платформе (Windows / Linux / обе)?Процессы в Windows считаются более тяжелыми, чем в Linux, поэтому вы действительно можете рассматривать потоки.

Кроме того, я думаю, что лучше (как это делает Apache) не создавать процесс для каждого запроса, а иметьпул процессов, поэтому вы экономите на создании процесса, особенно в Windows.

Если вы работаете в Linux, может ли waitpid() быть вам полезен?Вы можете использовать его в неблокирующем режиме, чтобы периодически проверять с некоторым интервалом, завершился ли один из дочерних процессов

2 голосов
/ 18 ноября 2010

Я могу с уверенностью сказать, что Пион - ваш единственный стабильный вариант.
Я никогда не использовал его, но намерен, и API выглядит очень чисто.

Что касается библиотек Boost, вам потребуется:

  • Boost.Asio
  • Boost.Threading
  • Boost.Spirit (или что-то похожее на синтаксический анализ протокола HTTP)
  • Boost.IPC
1 голос
/ 18 ноября 2010

А как насчет использования потоков (которые поддерживаются Boost), а не разветвления процесса?Это позволит вам делать запросы о состоянии дочернего элемента, и, imho, потоки проще обрабатывать, чем разветвление.

0 голосов
/ 06 декабря 2011

Я создал библиотеку FOSS для модульного создания приложений на C ++.Он размещен на

https://github.com/chilabot/chila

вот мой блог: http://chilatools.blogspot.com/view/sidebar

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

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

0 голосов
/ 18 ноября 2010

Сначала взгляните на CPPCMS . Это может уже соответствовать вашим потребностям.

Теперь, как отмечают другие, boost :: asio - хорошая отправная точка, но на самом деле основа задачи.

Возможно, вас больше заинтересуют работы, выполняемые с серверным кодом на основе boost :: asio: cpp-netlib (который должен быть представлен в boost после завершения) Блог автора .

0 голосов
/ 18 ноября 2010

Как правило, Boost.Asio - хороший момент для начала.

Но следует учитывать несколько моментов:

  1. Boost.Asio - очень хорошая библиотека, но онане очень хорошо разбирается в форке, поэтому не пытайтесь разделять цикл событий Asio между несколькими процессами форка - это не сработает (то есть - если boost::asio::io_service было создано до форка - не используйте его более чем в одном процессе после него)

    Также он не позволяет освободить обработчик файлов от boost::asio::XX::socket, поэтому единственный способ - вызвать dup и затем передать его дочернему процессу.

    Но, если честно?Я не думаю, что вы найдете какую-либо библиотеку циклов сетевых событий, поддерживающую разветвление (возможно, за исключением CppCMS booster.aio, который я написал для разборки самостоятельно).

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

    С asio вы можете использовать трюк "self-pipe", чтобы вывести цикл из спящего режима из обработчика сигнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...