![1つのクライアントから複数のクライアントへのTCP/IPリレー](https://rvso.com/image/97223/1%E3%81%A4%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%8B%E3%82%89%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%B8%E3%81%AETCP%2FIP%E3%83%AA%E3%83%AC%E3%83%BC.png)
私は、fedora で実行できる Linux ツールを探しています。これは、リスニング用の TCP/IP ソケットを開き、同じポートで複数のクライアントを接続できるようにします。次に、1 つのクライアントがメッセージを送信すると、他のすべてのクライアントにリレーします。元のクライアントにリレーバックするのではなく、元のクライアントにもリレーバックする場合は問題ありません。ここでは「リレー」が適切な用語かどうかわかりません。別のキーワードで検索すれば、より良い結果が得られたかもしれません。明確にしておくと、サーバーによってソケットの上にプロトコルがあってはなりません。プロトコルがある場合は、送信と受信の両方でクライアントにのみ実装されます。さらに、信頼性が最も重要であるという要件があるため、UDP ではなく TCP/IP を探しています。信頼性を高めるためのその他の提案があれば歓迎します。
解決策を探した場所:
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ソケットに書き込むプロセスがないので、適切ではないようです。
前の 2 つのリンクの質問は私の質問とは一致しませんが、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'
アイデアは、新しい接続ごとに名前付きパイプを作成し、パイプから読み取ったものをすべて標準出力にエコーする (つまり、クライアントに送信する) ことです。標準入力 (つまり、クライアントからサーバーに送信) が読み取られ、受信したものはすべて、独自のパイプを除くすべての名前付きパイプにエコーされます。