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"
その後のnofork
2番目は、socat
stdinとstdoutがCに直接接続されているソケットで実行されます。