Retransmissão TCP/IP de um cliente para vários clientes

Retransmissão TCP/IP de um cliente para vários clientes

Estou procurando uma ferramenta Linux para rodar no fedora que abra um soquete tcp/ip para escuta, permitindo conectar vários clientes na mesma porta. Então, quando um cliente envia uma mensagem, retransmite-a para todos os outros clientes. Em vez disso, não retransmita para o cliente original, mas se isso também retransmitir para o cliente de origem, tudo bem. Não tenho certeza se "retransmissão" é o termo correto aqui, talvez se eu tivesse pesquisado outra palavra-chave, teria obtido melhores resultados. Só para ficar claro: não deve haver um protocolo em cima do soquete do servidor. Se houver um protocolo ele será implementado no cliente apenas tanto no envio quanto no recebimento. Outro requisito é que a confiabilidade seja a coisa mais importante, é por isso que estou procurando TCP/IP e não UDP. Quaisquer outras sugestões para torná-lo mais confiável são bem-vindas.

Alguns lugares onde procurei uma solução:

https://cr.yp.to/ucspi-tcp/tcpserver.htmlGera diferentes instâncias de "programa" que ainda precisam se comunicar entre si, portanto é apenas uma solução parcial.

Proxy TCP com vários clientes? A solução que procuro não se conecta primeiro a uma porta, por isso não parece adequada.

https://stackoverflow.com/questions/9024227/duplicate-input-unix-stream-to-multiple-tcp-clients-using-socat/11362423Não tenho um processo gravando em um soquete, então não parece adequado.

Mesmo que as perguntas dos dois links anteriores não correspondam às minhas, há coisas aí que me fazem acreditar que o socat ainda pode ser uma opção, mas não tenho certeza.

Responder1

Que tal algo como:

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

Responder2

Isto irá fazer o truque:

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'

A idéia é criar um canal nomeado para cada nova conexão e então ecoar para a saída padrão (ou seja, enviar ao cliente) tudo o que for lido no canal. A entrada padrão (ou seja, enviada do cliente para o servidor) é lida e tudo o que é recebido é ecoado para todos os pipes nomeados, exceto o próprio pipe.

informação relacionada