Написание многопоточного TCP-сервера в Linux

На работе мне поручили реализовать TCP-сервер как часть ведомого устройства Modbus. Я сделал много читал как здесь, по обмену стеками, так и в Интернете в целом (включая отличный http://beej.us/guide/bgnet/), но я борюсь с проблемой дизайна. устройство может принимать только 2 соединения, и на каждое соединение будут входящие запросы Modbus, которые я должен обработать в своем основном цикле контроллера, а затем ответить статусом успеха или неудачи.У меня есть следующие идеи, как это реализовать.

  1. Есть слушатель поток, который создает, связывает, прослушивает и принимает соединения, а затем порождает новый pthread для прослушивания соединения на наличие входящих данных и закрытия соединения после периода простоя.Если количество активных потоков в настоящее время равно 2, новые соединения мгновенно закрываются, чтобы гарантировать допускается только 2.

  2. Не создавайте новые потоки из потока прослушивателя, вместо этого используйте select() для обнаружения входящих запросов на подключение, а также входящих подключений Modbus для активных подключений (аналогично подходу в руководстве Beejs).

  3. Создайте 2 потока прослушивания, каждый из которых создает сокет (с тем же IP-адресом и номером порта), который может блокировать вызовы accept(), затем закройте сокет fd и обработайте соединение. Здесь я (возможно, наивно) предполагаю, что это позволит максимум 2 соединения, с которыми я могу справиться, используя блокировку чтения.

Я давно использую C++, но я новичок в разработке под Linux. Я был бы очень рад любым предложениям относительно того, какой из вышеперечисленных подходов лучше (если таковые имеются), и если мой неопытный с Linux означает, что любой из них действительно очень плохие идеи. Я стараюсь избегать fork() и придерживаться pthreads, так как входящие запросы Modbus будут ставиться в очередь и периодически считываться из основного цикла контроллера. Спасибо заранее за любые советы.

6
задан mathematician1975 12 June 2012 в 09:11
поделиться