Estou ciente das desvantagens do design "wait-> stop", que geralmente são propostas com o netcat:
server$ cat test.dat | nc -q 10 -l -p 7878
client$ nc -w 10 remotehost 7878 > out.dat
(Não é confiável: não importa quanto tempo você espera, sempre é possível que exista um gargalo na rede por mais um segundo. - Outra coisa -> por que esperar 10 segundos se você pode saber imediatamente que os dados são transferidos e começar a processá-los!)
Eu gostaria de uma solução, com fechamento de fluxo tcp confiável e agradável .
Eu encontrei socat, com fechamento como descrito em man socat
:
Quando um dos fluxos atinge efetivamente o EOF, a fase de fechamento começa. O Socat transfere a condição EOF para o outro fluxo, ou seja, tenta desligar apenas seu fluxo de gravação, dando a chance de terminar normalmente.
Encontrei os seguintes comandos funcionando:
Servidor enviando arquivo:
server$ socat -u FILE:test.dat TCP-LISTEN:9876,reuseaddr
client$ socat -u TCP:127.0.0.1:9876 OPEN:out.dat,creat
Servidor que recebe o arquivo:
server$ socat -u TCP-LISTEN:9876,reuseaddr OPEN:out.txt,creat && cat out.txt
client$ socat -u FILE:test.txt TCP:127.0.0.1:9876
É confiável? Pode ser melhorado? (Eu usei as opções corretas? Existem opções melhores para configurar? - Existem muitas delas com socat)