Ретрансляция TCP/IP от одного клиента к нескольким клиентам

Ретрансляция TCP/IP от одного клиента к нескольким клиентам

Я ищу инструмент Linux для работы под Fedora, который откроет сокет TCP/IP для прослушивания, позволит подключать несколько клиентов к одному порту. Затем, когда один клиент отправляет сообщение, ретранслировать его всем остальным клиентам. Вместо того, чтобы ретранслировать его обратно исходному клиенту, но если он также ретранслирует обратно исходному клиенту, это нормально. Я не уверен, что «ретрансляция» — правильный термин здесь, возможно, если бы я искал по другому ключевому слову, я бы получил лучшие результаты. Просто для ясности: на сервере не должно быть протокола поверх сокета. Если будет протокол, он будет реализован на клиенте только как при отправке, так и при получении. Еще одно требование заключается в том, что надежность — это самое главное, поэтому я ищу TCP/IP, а не UDP. Любые другие предложения по повышению надежности приветствуются.

Вот несколько мест, где я искал решение:

https://cr.yp.to/ucspi-tcp/tcpserver.htmlСоздает различные экземпляры «программы», которым затем все равно нужно взаимодействовать друг с другом, так что это лишь частичное решение.

TCP Proxy с несколькими клиентами? Решение, которое я ищу, не подключается сначала к порту, поэтому не кажется подходящим.

https://stackoverflow.com/questions/9024227/duplicate-input-unix-stream-to-multiple-tcp-clients-using-socat/11362423У меня нет процесса записи в сокет, так что это не кажется подходящим вариантом.

Несмотря на то, что вопросы по предыдущим двум ссылкам не совпадают с моими, там есть моменты, которые заставляют меня верить, что socat все еще может быть вариантом, но я не уверен.

решение1

А как насчет чего-то вроде:

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

решение2

Это сработает:

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'

Идея состоит в том, чтобы создать именованный канал для каждого нового соединения, а затем отобразить в std output (т. е. отправить клиенту) все, что считывается из канала. Std input (т. е. отправлено клиентом на сервер) считывается, и все, что получено, отобразится во всех именованных каналах, кроме собственного канала.

Связанный контент