Retransmisión TCP/IP de un cliente a varios clientes

Retransmisión TCP/IP de un cliente a varios clientes

Estoy buscando una herramienta de Linux para ejecutar en Fedora que abra un socket tcp/ip para escuchar y le permita conectar varios clientes en el mismo puerto. Luego, cuando un cliente envía un mensaje, remítalo a todos los demás clientes. Es mejor no retransmitirlo al cliente original, pero si también lo retransmite al cliente de origen, está bien. No estoy seguro de si "retransmisión" es el término correcto aquí, tal vez si hubiera buscado otra palabra clave habría obtenido mejores resultados. Para que quede claro: no debería haber un protocolo encima del socket del servidor. Si va a haber un protocolo, se implementará en el cliente únicamente tanto en el envío como en la recepción. Un requisito adicional es que la confiabilidad es lo más importante, por eso estoy buscando TCP/IP y no UDP. Cualquier otra sugerencia para hacerlo más confiable es bienvenida.

Algunos lugares donde busqué una solución:

https://cr.yp.to/ucspi-tcp/tcpserver.htmlGenera diferentes instancias de "programa" que aún necesitan comunicarse entre sí, por lo que es sólo una solución parcial.

¿Proxy TCP con múltiples clientes? La solución que estoy buscando no se conecta primero a un puerto, por lo que no parece adecuada.

https://stackoverflow.com/questions/9024227/duplicate-input-unix-stream-to-multiple-tcp-clients-using-socat/11362423No tengo un proceso de escritura en un socket, por lo que no parece adecuado.

Aunque las preguntas de los dos enlaces anteriores no coinciden con las mías, hay cosas que me hacen creer que socat aún podría ser una opción, pero no estoy seguro.

Respuesta1

¿Qué tal algo como:

socat tcp-listen:1234,fork,reuseaddr \
      'system:tail -fn +0 file & cat >> file'

Respuesta2

Esto funcionará:

socat tcp-listen:5555,fork,reuseaddr \
'system:
PIPE=$(mktemp -u /tmp/pns_XXX)
mkfifo $PIPE
while read PIPE_MESSAGE<$PIPE; do
  echo $PIPE_MESSAGE
done &
PID=$!
while read CLIENT_MESSAGE; do
  for OTHER_PIPE in $(ls /tmp/pns_*); do
    [ $PIPE != $OTHER_PIPE ] && echo $CLIENT_MESSAGE > $OTHER_PIPE
  done
done
kill $PID
rm $PIPE'

La idea es crear una canalización con nombre para cada nueva conexión y luego hacer eco en la salida estándar (es decir, enviar al cliente) todo lo que se lea en la canalización. La entrada estándar (es decir, el envío del cliente al servidor) se lee y todo lo que se recibe se repite en todas las canalizaciones con nombre, excepto en la propia canalización.

información relacionada