Pisanie wielowątkowego serwera TCP w systemie Linux

W pracy miałem zaimplementować serwer TCP jako część urządzenia podrzędnego Modbus. Dużo czytałem zarówno tutaj, na giełdzie stosów, jak i ogólnie w Internecie (w tym w wersji doskonałej)http://beej.us/guide/bgnet/) ale walczę z problemem projektowym. Podsumowując, moje urządzenie może akceptować tylko 2 połączenia, a na każdym połączeniu będą przychodzące żądania modbus, które muszę przetwarzać w mojej głównej pętli kontrolera, a następnie odpowiadać stanem powodzenia lub awarii. Mam następujące pomysły na wdrożenie tego.

Mieć wątek nasłuchujący, który tworzy, wiąże, nasłuchuje i akceptuje połączenia, a następnie tworzy nowy wątek, aby nasłuchiwać połączenia przychodzących danych i zamknąć połączenie po okresie bezczynności. Jeśli liczba aktywnych wątków wynosi obecnie 2, nowe połączenia są natychmiast zamykane, aby zapewnić, że dozwolone są tylko 2.

Nie spawnuj nowych wątków z wątku nasłuchującego, zamiast tego użyj select () do wykrywania przychodzących żądań połączeń, a przychodzące połączenia modbus na aktywnych połączeniach (podobnie jak w przewodniku Beejs).

Utwórz 2 wątki nasłuchujące, z których każdy tworzy gniazdo (ten sam adres IP i numer portu), które mogą blokować wywołania accept (), a następnie zamknąć gniazdo fd i poradzić sobie z połączeniem. Tutaj jestem (być może naiwnie) zakładając, że zezwoli to na maksymalnie 2 połączenia, z którymi mogę sobie poradzić za pomocą blokowania odczytów.

Używam C ++ od dłuższego czasu, ale jestem całkiem nowy w rozwoju Linuksa. Byłbym bardzo zadowolony z wszelkich sugestii co do tego, które z powyższych podejść jest najlepsze (jeśli w ogóle) i czy mój brak doświadczenia z Linuksem oznacza, że ​​którekolwiek z nich są naprawdę złymi pomysłami. Chciałbym unikać fork () i trzymać się pthreads, ponieważ przychodzące żądania modbus będą kolejkowane i odczytywane okresowo z głównej pętli kontrolera. Z góry dziękuję za wszelkie porady.

questionAnswers(3)

yourAnswerToTheQuestion