servidor de archivos socat TCP

servidor de archivos socat TCP

Estoy intentando configurar un servidor de archivos socat simple usando TCP para enviar archivos pequeños (~100 KB).

Aquí están los servidores y el cliente de una línea para un archivo:

Servidor:socat -u -d -d OPEN:file.dat TCP-LISTEN:<port>,reuseaddr,fork

Cliente:socat -u -d -d TCP:<server>:<port> OPEN:file.dat,creat

La primera transferencia de datos siempre funciona, pero las siguientes no siempre funcionan. La mayoría de las siguientes transferencias crean un archivo vacío en el lado del cliente. El problema persiste con varios clientes transfiriéndose una vez, y verifiqué que los datos no se transfieren cuando ocurre el error, pero los valores de registro y retorno no indican ningún error, solo un bucle de datos más corto.

Probé prácticamente todas las opciones mencionadas aquí:http://www.dest-unreach.org/socat/doc/socat.html

La única forma que encontré para que funcione varias veces consecutivas es eliminar la opción fork del escucha del servidor y envolver toda la línea de comando en un bucle bash, pero, por supuesto, falla para varios clientes.

Probé con Ubuntu, Fedora, Redhat y FreeBSD.

¿Me estoy perdiendo algo o es un error?

Respuesta1

Tuve el mismo problema y me llevó horas darme cuenta de qué estaba haciendo mal. Todavía no lo sé, pero al menos sé cómo hacerlo funcionar. Estaba usando:

socat -u FILE:/tmp/test.txt TCP-LISTEN:5778,reuseaddr,fork

Y funcionó como se esperaba cuando cambié a:

socat TCP-LISTEN:5778,reuseaddr,fork FILE:/tmp/test.txt

No estoy seguro de qué está cambiando realmente, pero soltar la -ubandera e intercambiar el orden de las direcciones abrirá el socket para múltiples llamadas de clientes. Me encontré con él mientras intentaba duplicar.un ejemplo de trabajo conocido de un servidor.

Además mi cliente era simplemente socat -u TCP:localhost:5778 STDOUT. Funciona sin el -utambién.

Respuesta2

hombre hombre

$ man socat | grep -m1 '\-u' -A3
       -u     Uses  unidirectional  mode.  The  first address is only used for
              reading, and the second address is only used for writing  (exam-
              ple).

incluso solo ayuda

$ socat  -h | grep -m1 '\-u '

...

Respuesta3

Esto se debe a que en el servidor hay un único origen de archivo y varios receptores de archivos (conexiones TCP, bifurcadas). El primer cliente consume todo el archivo, dejando la posición del archivo en EOF (fin del archivo). Los clientes TCP posteriores se encuentran sin nada que leer, ya que todos utilizan el mismo origen de archivo.

Esto es más un aspecto de diseño de socat que un error. No conozco una forma para que las nuevas conexiones restablezcan la posición de búsqueda en el archivo fuente.

información relacionada