
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 -u
sinalizador 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 -u
també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.