tcp 套接字从多个连续客户端转发到与服务器的单个持久套接字连接

tcp 套接字从多个连续客户端转发到与服务器的单个持久套接字连接

我有三个程序(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,第二个socat将以其 stdin 和 stdout 直接连接到 C 的套接字来运行。

相关内容