socat は接続された各クライアントに標準入力をコピーします。

socat は接続された各クライアントに標準入力をコピーします。

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

その時送った文字はmessages2番ターミナルに現れることもあり、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'

アイデアは、新しい接続ごとに名前付きパイプを作成し、パイプから読み取った内容を標準出力(つまりクライアントに送信)に反映することです。標準入力(つまり、クライアントがサーバーに送信したもの)を読み取り、独自のパイプを除くすべての名前付きパイプで受信したすべての内容をエコーし​​ます。

関連情報