ncat(nmap folkの)には、すべての入力を接続されているすべてのクライアントにコピーするきちんとしたデフォルトの動作があります。たとえば、
ターミナル1でサーバーを起動します。
% mkfifo messages
% exec 8<>messages # hold the fifo open
% ncat -l 5555 -k --send-only < messages
端末 2 と 3 でクライアントのリスニングを開始します。
% nc localhost 5555
ターミナル4のfifoに何かを印刷し、接続されているすべてのクライアント(ターミナル2と3)に同じメッセージが表示されていることを確認してください。
% printf 'Hello, clients.\n' > messages
socatと同じパターンを採用することは可能ですか?
修正する:Philippeのソリューションスクリーンショット:
答え1
あなたがしたいことはおそらく不可能です。最も近い方法は次のとおりです。
第1ターミナル:
mkfifo messages
socat PIPE:messages TCP4-LISTEN:5555,fork
ターミナル2と3から:
nc localhost 5555
その時送った文字はmessages
2番ターミナルに現れることもあり、3番ターミナルに現れる時もある。これは、localhost:5555で開かれたソケットを介して提供される前にsocat
テキストが「消費」されるためです。その後、目覚めてソケットからメッセージを読み取るmessages
最初のプロセスはメッセージを受け取り、他のプロセスは何も取得しません。netcat
答え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'
アイデアは、新しい接続ごとに名前付きパイプを作成し、パイプから読み取った内容を標準出力(つまりクライアントに送信)に反映することです。標準入力(つまり、クライアントがサーバーに送信したもの)を読み取り、独自のパイプを除くすべての名前付きパイプで受信したすべての内容をエコーします。