从一个客户端到多个客户端的 TCP/IP 中继

从一个客户端到多个客户端的 TCP/IP 中继

我正在寻找一个在 Fedora 下运行的 Linux 工具,它将打开一个 tcp/ip 套接字进行监听,让它在同一端口上连接多个客户端。然后,当一个客户端发送消息时,将其转发给所有其他客户端。而不是将其转发回原始客户端,但如果它也转发回原始客户端,那就可以了。我不确定“中继”在这里是否是正确的术语,也许如果我搜索另一个关键字,我会得到更好的结果。需要明确的是:服务器不应在套接字之上有协议。如果有一个协议,它将仅在发送和接收时在客户端上实现。进一步的要求是可靠性是最重要的,这就是为什么我正在寻找 TCP/IP 而不是 UDP。欢迎任何其他使它更可靠的建议。

我在一些地方寻找解决方案:

https://cr.yp.to/ucspi-tcp/tcpserver.html产生不同的“程序”实例,然后它们仍然需要相互通信,所以这只是一个部分解决方案。

具有多个客户端的 TCP 代理?我正在寻找的解决方案并不首先连接到端口,因此似乎不合适。

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'

这个想法是为每个新连接创建一个命名管道,然后回显到标准输出(即发送到客户端)从管道中读取的任何内容。读取标准输入(即由客户端发送到服务器),并将接收到的任何内容回显到除自己的管道之外的所有命名管道。

相关内容