socat transferência confiável de arquivos via TCP

8

Estou ciente das desvantagens do design "wait- > stop", que geralmente é proposto com o netcat:

server$ cat test.dat | nc -q 10 -l -p 7878
client$ nc -w 10 remotehost 7878 > out.dat

(Não é confiável: nenhum medidor quanto tempo você espera é sempre possível que haja gargalo de rede por um segundo a mais. - Outra coisa - > por que esperar 10 segundos se você puder saber imediatamente que os dados foram transferidos e começar a processá-los! )

Eu gostaria de solução, com confiável e agradável tcp fluxo de fechamento .

Encontrei socat, com fechamento, conforme descrito em man socat :

When one of the streams effectively reaches EOF, the closing phase begins. Socat transfers the EOF condition to the other stream, i.e. tries to shutdown only its write stream, giving it a chance to terminate gracefully.

Eu encontrei os seguintes comandos trabalhando:

Arquivo de envio do servidor:

server$ socat -u FILE:test.dat TCP-LISTEN:9876,reuseaddr
client$ socat -u TCP:127.0.0.1:9876 OPEN:out.dat,creat

Arquivo de recebimento do 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

É confiável? Pode ser melhorado? (Eu usei certas opções? Existem melhores opções para configurar? - Há muitos deles com socat)

    
por Grzegorz Wierzowiecki 08.10.2011 / 13:25

1 resposta

5

Parece que seu núcleo é sólido - isso deve ser confiável e deve ser encerrado assim que o arquivo for enviado completamente.

Se out.txt já existir, então, essa configuração pode se comportar de maneira inesperada. Se out.txt for maior que test.txt , a última parte de out.txt permanecerá, pois a socat sobrescreve o byte por byte em vez de garantir que o arquivo esteja vazio. Existem algumas maneiras de corrigir isso, dependendo do que você deseja fazer:

  • OPEN:out.txt,creat,trunc excluirá todos os bytes em out.txt antes de gravar nele. Essa opção imita o que você esperaria de cp e é provavelmente o que você quer.
  • OPEN:out.txt,creat,excl se recusará a escrever out.txt se já existir. Use esta opção para segurança extra.
  • OPEN:out.txt,creat,append anexará dados a out.txt .

Eu também gosto de executar md5sum nos arquivos de origem e destino sempre que eu ligo algo assim junto, devido a esses tipos de casos de canto.

    
por 31.10.2011 / 16:33