transferencia de archivos confiable de socat a través de TCP

8

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)

Grzegorz Wierzowiecki
fuente
Para los seguidores, el segundo ejemplo ("archivo de recepción del servidor") es el cliente "típico" que envía un archivo a un servidor ... también las versiones más recientes de netcat tienen una opción "-N -q 0" que debería resultar en más confiable transferencias que el antiguo mecanismo de "espera y esperanza" :)
rogerdpack

Respuestas:

6

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.txtembargo, si ya existe, esta configuración podría comportarse de manera inesperada. Si out.txtes más largo que test.txt, la última parte de out.txtpermanecerá, 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,trunceliminará todos los bytes out.txtantes de escribir en él. Esta opción imita lo que esperarías cp, y es probablemente lo que quieres.
  • OPEN:out.txt,creat,exclse negará a escribir out.txtsi ya existe. Use esta opción para mayor seguridad.
  • OPEN:out.txt,creat,appendagregará datos a out.txt.

También me gusta ejecutar md5sumen los archivos de origen y de destino cada vez que improviso algo como esto, debido a este tipo de casos de esquina.

Jander
fuente
es genial que hayas mencionado sobre "trunc" y esos casos extremos. ¿Qué pasa con md5sum? En mi caso es un problema porque necesito transferir todo sin cerrar la conexión ("one-shot";)). Incluso tú, es bueno mencionarlo para otros lectores :).
Grzegorz Wierzowiecki