세 가지 프로그램(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에 직접 연결된 소켓에서 실행됩니다.