私はtcp / ipソケットを開いてリッスンし、同じポートに複数のクライアントを接続できるFedoraで実行されているLinuxツールを探しています。その後、あるクライアントがメッセージを送信すると、他のすべてのクライアントに転送されます。元のクライアントに戻すのではなく、元のクライアントに戻しても問題ありません。ここで、「リレー」が正しい用語であるかどうかはわかりません。おそらく他のキーワードを検索すると、より良い結果が得られます。明確に言えば、サーバーにはソケットの上にプロトコルがあってはなりません。プロトコルがある場合は、送受信時にのみクライアントに実装されます。追加の要件は、安定性が最も重要であることです。これが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'
アイデアは、新しい接続ごとに名前付きパイプを作成し、パイプから読み取った内容を標準出力(つまりクライアントに送信)に反映することです。標準入力(つまり、クライアントがサーバーに送信したもの)を読み取り、独自のパイプを除くすべての名前付きパイプで受信したすべての内容をエコーします。