Soy consciente de las desventajas del diseño "esperar-> detener", que generalmente se propone con netcat:
server$ cat test.dat | nc -q 10 -l -p 7878
client$ nc -w 10 remotehost 7878 > out.dat
(No es confiable: no mide cuánto tiempo espera, siempre es posible que haya un cuello de botella en la red por un segundo más. - Otra cosa -> ¡por qué esperar 10 segundos si puede saber de inmediato que los datos se transfieren y comenzar a procesarlos!)
Me gustaría una solución, con cierre confiable y agradable de flujo de tcp .
He encontrado socat, con cierre como se describe en man socat
:
Cuando una de las corrientes llega efectivamente a EOF, comienza la fase de cierre. Socat transfiere la condición EOF a la otra secuencia, es decir, intenta cerrar solo su secuencia de escritura, lo que le da la oportunidad de terminar con gracia.
Encontré los siguientes comandos funcionando:
Archivo de envío del servidor:
server$ socat -u FILE:test.dat TCP-LISTEN:9876,reuseaddr
client$ socat -u TCP:127.0.0.1:9876 OPEN:out.dat,creat
Archivo de recepción del servidor:
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
¿Es confiable? ¿Se puede mejorar? (¿He usado las opciones correctas? ¿Hay mejores opciones para la configuración? Hay tantas con socat)