Escribiendo un servidor TCP multiproceso en Linux

En el trabajo se me ha asignado la tarea de implementar un servidor TCP como parte de un dispositivo esclavo Modbus. He leído mucho tanto aquí en el intercambio de pila como en Internet en general (incluyendo la excelentehttp://beej.us/guide/bgnet/) pero estoy luchando con un problema de diseño. En resumen, mi dispositivo puede aceptar solo 2 conexiones y en cada conexión habrá solicitudes modbus entrantes que debo procesar en mi circuito del controlador principal y luego responder con éxito o estado de falla. Tengo las siguientes ideas de cómo implementar esto.

Tener un hilo de escucha que crea, enlaza, escucha y acepta conexiones, luego genera un nuevo pthread para escuchar en la conexión los datos entrantes y cerrar la conexión después de un período de inactividad. Si el número de subprocesos activos es actualmente 2, las nuevas conexiones se cierran instantáneamente para garantizar que solo se permiten 2.

No genere nuevos hilos a partir del hilo de escucha, en su lugar use select () para detectar solicitudes de conexión entrantes, así como conexiones modbus entrantes en conexiones activas (similar al enfoque en la guía de Beejs).

Cree 2 hilos de escucha, cada uno de los cuales crea un socket (la misma IP y número de puerto) que puede bloquear en las llamadas accept (), luego cierra el socket fd y se ocupa de la conexión. Aquí estoy (quizás ingenuamente) asumiendo que esto solo permitirá un máximo de 2 conexiones con las que puedo lidiar usando lecturas de bloqueo.

He estado usando C ++ durante mucho tiempo pero soy bastante nuevo en el desarrollo de Linux. Realmente agradecería cualquier sugerencia en cuanto a cuál de los enfoques anteriores es mejor (si corresponde) y si mi inexperiencia con Linux significa que cualquiera de ellos es realmente una mala idea. Estoy dispuesto a evitar fork () y atenerme a pthreads, ya que las solicitudes de modbus entrantes se pondrán en cola y se leerán periódicamente en un bucle de controlador principal. Gracias de antemano por cualquier consejo.

Respuestas a la pregunta(3)

Su respuesta a la pregunta