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)
fuente
Respuestas:
Me parece que su núcleo es sólido: esto debería ser confiable y debería cerrarse una vez que el archivo se haya enviado por completo.
Sin
out.txt
embargo, si ya existe, esta configuración podría comportarse de manera inesperada. Siout.txt
es más largo quetest.txt
, la última parte deout.txt
permanecerá, ya que socat está sobrescribiendo el archivo byte por byte en lugar de asegurarse de que el archivo esté vacío. Hay algunas maneras de arreglar esto, dependiendo de lo que quieras hacer:OPEN:out.txt,creat,trunc
eliminará todos los bytesout.txt
antes de escribir en él. Esta opción imita lo que esperaríascp
, y es probablemente lo que quieres.OPEN:out.txt,creat,excl
se negará a escribirout.txt
si ya existe. Use esta opción para mayor seguridad.OPEN:out.txt,creat,append
agregará datos aout.txt
.También me gusta ejecutar
md5sum
en los archivos de origen y de destino cada vez que improviso algo como esto, debido a este tipo de casos de esquina.fuente