tcp encaminhamento de soquete de vários clientes sequenciais para uma única conexão de soquete persistente ao servidor

2

Eu tenho três programas (A, B e C). O programa C tem um servidor de soquete tcp esperando por conexões em uma porta específica. Normalmente o programa A abre uma conexão de socket ao programa C, envia dados, fecha o socket, abre o socket novamente, envia dados, fecha-os, etc. O problema é que cada vez que o socket é aberto em C, muita inicialização é feito no programa C, então essa constante abertura e fechamento do socket está atrasando A. Eu não tenho a habilidade de mudar o programa A, então eu não posso mudar A para fazer as coisas rodarem mais rápido.

No entanto, o que eu gostaria de fazer, é encaminhar a conexão de socket de A para um novo programa B, que irá encaminhar os dados para o programa C. Então B pode abrir apenas um socket para C, e abrir e fechar conexões de entrada de A, conforme necessário. Estou procurando um programa B para fazer o seguinte:

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

Este não é um programa complicado e eu o escreverei se necessário, mas eu esperava que alguém tivesse uma solução simples e inteligente usando utilitários existentes, ou se algum utilitário existente fizesse esse tipo de coisa junto com cenários similares mais complicados .

    
por Rob C 01.12.2016 / 23:13

1 resposta

0

com socat :

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

Ou melhor ainda (evite o fifo e a camada extra de comunicação entre processos):

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

Por causa do nofork , o segundo socat seria executado com seu stdin e stdout diretamente conectados ao soquete para C.

    
por 02.12.2016 / 07:42