Eu tenho um provedor (A) que deseja nos enviar dados através de uma conexão TCP de entrada. Infelizmente, o serviço consumidor (B) não pode receber conexões TCP de entrada. Também não possui um IP estático, outro requisito.
Uma maneira de resolver isso seria um serviço que conecta a porta TCP A de entrada a outra porta TCP B, para que o consumidor possa fazer uma conexão de saída com B.
Este não é um problema único [1] [2] , e com o socat eu posso fazer algo muito próximo do que eu quero:
socat -d -d -d -u TCP4-LISTEN:PORT-A,reuseaddr TCP4-LISTEN:PORT-B,reuseaddr
No entanto, isso tem os seguintes problemas:
- Se B desconectar, ele não poderá se reconectar. Com
TCP4-LISTEN:PORT-B,reuseaddr,fork
, ele pode se conectar, mas não recebe dados. - B não pode conectar-se antes que A estabeleça uma conexão (superável)
- Somente uma conexão pode ser estabelecida para
PORT-B
(superável)
Existe uma maneira de ajustar o comando para que ele se torne "permanente" e resistente a falhas?
O mundo real está bagunçado.
No mundo real, às vezes as conexões TCP morrem, isso pode acontecer, por exemplo, se um firewall com estado ou NAT for reiniciado, se a conexão demorar muito sem tráfego, se a conexão subjacente estiver inativa por muito tempo.
Além disso, às vezes, quando as conexões morrem, elas não morrem simetricamente. Se uma conexão que carrega muitos dados morre, é provável que o remetente note que está morto muito antes do destinatário. Isso tem alguns efeitos colaterais.
Além disso, as conexões TCP são um fluxo de bytes, NÃO um fluxo de mensagens; portanto, quando sua conexão morre, você pode receber uma mensagem parcial.
O resultado líquido disso leva-me a concluir que uma solução robusta requer uma compreensão do protocolo do aplicativo para que sua solução possa entender.
fonte