servidor de arquivos TCP socat

servidor de arquivos TCP socat

Estou tentando configurar um servidor de arquivos socat simples usando TCP para enviar arquivos pequenos (~ 100 KB).

Aqui estão os servidores e clientes do unifilar para um arquivo:

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

A primeira transferência de dados sempre funciona, mas as seguintes nem sempre funcionam. A maior parte da transferência a seguir cria um arquivo vazio no lado do cliente. O problema persiste com a transferência de vários clientes uma vez, e verifiquei que os dados não são transferidos quando o bug ocorre, mas o log e os valores de retorno não indicam nenhum erro, apenas um loop de dados mais curto.

Eu tentei praticamente todas as opções mencionadas aqui:http://www.dest-unreach.org/socat/doc/socat.html

A única maneira que encontrei de fazê-lo funcionar várias vezes consecutivas é remover a opção fork do ouvinte do servidor e agrupar toda a linha de comando em um loop bash, mas é claro que falha para vários clientes.

Tentei com Ubuntu, Fedora, Redhat e FreeBSD.

Estou faltando alguma coisa ou isso é um bug?

Responder1

Eu tive o mesmo problema e levei horas para descobrir o que estava fazendo de errado. Ainda não sei, mas sei pelo menos como fazer funcionar. Eu estava usando:

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

E funcionou como esperado quando mudei para:

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

Não tenho certeza do que realmente está mudando, mas eliminar o -usinalizador e trocar a ordem dos endereços abrirá o soquete para várias chamadas de clientes. Eu tropecei nisso enquanto tentava duplicarum exemplo funcional conhecido de um servidor.

Além disso, meu cliente era simplesmente socat -u TCP:localhost:5778 STDOUT. Funciona sem o -utambém.

Responder2

homem, homem

$ 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).

mesmo apenas ajudar

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

...

Responder3

Isso ocorre porque no servidor há uma única origem de arquivo e vários coletores de arquivos (conexões TCP, bifurcadas). O primeiro cliente consome todo o arquivo, deixando a posição do arquivo em EOF (fim do arquivo). Quaisquer clientes TCP subsequentes não terão nada para ler, pois todos estão usando a mesma fonte de arquivo.

Este é mais um aspecto de design do socat do que um bug. Não conheço uma maneira de novas conexões redefinirem a posição de busca no arquivo de origem.

informação relacionada