ncat(来自 nmap 社区)有一个简洁的默认操作,可以将任何输入复制到所有连接的客户端。例如:
在终端 1 上启动服务器:
% mkfifo messages
% exec 8<>messages # hold the fifo open
% ncat -l 5555 -k --send-only < messages
Run Code Online (Sandbox Code Playgroud)
启动客户端侦听终端 2 和 3:
% nc localhost 5555
Run Code Online (Sandbox Code Playgroud)
向终端 4 上的 fifo 输出一些内容,并观察所有连接的客户端(终端 2 和 3)上出现的相同消息:
% printf 'Hello, clients.\n' > messages
Run Code Online (Sandbox Code Playgroud)
socat 是否可以使用相同的模式?
更新:菲利普的解决方案截图:
该命令将执行以下操作:
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'
Run Code Online (Sandbox Code Playgroud)
这个想法是为每个新连接创建一个命名管道,然后回显到标准输出(即发送到客户端)从管道中读取的任何内容。读取标准输入(即由客户端发送到服务器),并将接收到的任何内容回显到除自己的管道之外的所有命名管道。