複数の連続クライアントからサーバーへの単一の永続ソケット接続でtcpソケットを転送する

複数の連続クライアントからサーバーへの単一の永続ソケット接続でtcpソケットを転送する

3つのプログラム(A、B、C)があります。プログラムCには、特定のポートで接続を待機するTCPソケットサーバーがあります。通常、プログラムAは、プログラムCへのソケット接続を開き、データを送信し、ソケットを閉じ、ソケットを再び開き、データを送信して閉じます。問題は、Cでソケットが開かれるたびにプログラムCで多くの初期化が行われているため、ソケットを開いたり閉じたりするとA速度が遅くなることです。私はプログラムAを変更する能力がないので、プログラムを速く実行するためにAを変更することはできません。

しかし、私が望むのは、Aのソケット接続を新しいプログラムBに渡すことです。このプログラムはデータをプログラムCに渡します。その後、BはCのソケットを開き、以下の要件に従ってAから着信接続を開閉できます。以下を実行するプログラムBを探しています。

open socket to C
send request to C to do the time-consuming initialization on C (just this once)
while true
  listen for socket connection from A
  until socket from A is closed
    read data from A, write same data to C
    read data from C, write same data to A

これは複雑なプログラムではなく、必要に応じて作成しますが、誰かが既存のユーティリティを使用してシンプルで賢い解決策を持っている場合、またはそのような作業とより複雑な同様のシーンを実行できる既存のユーティリティがあると思います。

答え1

そしてsocat

mkfifo pipe &&
<pipe socat tcp-listen:"$portB",reuseaddr,fork,bind=localhost - |
  socat - tcp:localhost:"$portC" >pipe

または、より良い方法は次のとおりです(fifoと追加のプロセス間の通信層の防止)。

socat "tcp:localhost:$portC" \
      "exec:\"socat - tcp-listen:$portB,reuseaddr,fork,bind=localhost\",nofork"

その後のnofork2番目は、socatstdinとstdoutがCに直接接続されているソケットで実行されます。

関連情報