Модель для многопоточного / разветвленного демона сервера - PullRequest
1 голос
/ 05 мая 2011

Я разрабатываю подключенный к базе данных демон Linux на C ++, который будет выступать в роли «сервера» для некоторых сетевых контроллеров.Он должен иметь некоторую форму параллелизма, чтобы иметь возможность обслуживать несколько устройств одновременно.Сервер будет прослушивать входящие соединения и fork / thread / select () / что угодно для каждого подключенного устройства.Это соединение должно оставаться открытым, пока оно не упадет или не закроется.Клиенты не будут многопоточными, поэтому они могут иметь только одно соединение за раз.

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

Подумайте о какой-то форме «авторизации» на одном устройстве, которая заставляет другое устройство получать команду исделай что-нибудь.Я не могу просто отправить команды «peer-to-peer» между устройствами, потому что все должно быть зарегистрировано на сервере, и запросы к базе данных могут быть необходимы.

Я озадачен связью между потоками / процессами,Я предполагаю наличие класса для клиента (т.е. Device) и создание объекта в каждом отдельном процессе или потоке.Я знаю именованные каналы и разделяемую память при использовании fork (), а также способы взаимодействия с другими потоками, но я беспокоюсь о синхронизации и потенциальных проблемах со стабильностью.Я был в восторге от форка, его простоты использования и простоты, пока я не затронул эту проблему.Стабильность - это проблема № 1.

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


Я прошу прощения как за длину этого вопроса, так и за довольно расплывчатую природу.Это скорее вопрос дизайна, нежели прямой ответ.Я не был уверен, принадлежит ли он программистам или здесь, в SO.Не стесняйтесь двигаться в случае необходимости.

Спасибо всем, кто пытается спасти мое здравомыслие.

Обновление : если я использую Boost.Asio для этого, могуКто-нибудь даст мне краткое объяснение / образец кода или укажет мне правильное направление?

1 Ответ

1 голос
/ 05 мая 2011

Вы должны взглянуть на Boost :: Asio и на шаблон активного объекта. На boost'Con 2010 есть хорошее видео / беседа на эту тему, которую вы можете найти на blip.tvB

...