trasferimento affidabile di file socat su TCP


8

Sono consapevole degli svantaggi del design "wait-> stop", che di solito viene proposto con netcat:

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

(Non è affidabile: nessun indicatore per quanto tempo è sempre possibile che ci sia stato un collo di bottiglia della rete per un secondo in più. - Un'altra cosa -> perché attendere 10 secondi se si può sapere immediatamente che i dati vengono trasferiti e iniziare a elaborarli!)

Vorrei una soluzione, con chiusura del flusso tcp affidabile e piacevole .

Ho trovato socat, con chiusura come descritto in man socat:

Quando uno dei flussi raggiunge effettivamente l'EOF, inizia la fase di chiusura. Socat trasferisce la condizione EOF sull'altro flusso, ovvero cerca di chiudere solo il suo flusso di scrittura, dandogli la possibilità di terminare con grazia.

Ho trovato i seguenti comandi funzionanti:

File di invio server:

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

File di ricezione del server:

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

È affidabile? Può essere migliorato? (Ho usato le giuste opzioni? Ci sono opzioni migliori da configurare? - Ce ne sono così tante con socat)


Per i follower, il secondo esempio ("file di ricezione del server") è il client "tipico" che invia un file a un server ... anche le versioni più recenti di netcat hanno un'opzione "-N -q 0" che dovrebbe risultare più affidabile trasferimenti rispetto al vecchio meccanismo "aspetta e spera" :)
rogerdpack,

Risposte:


6

Mi sembra che il tuo core sia solido - questo dovrebbe essere affidabile e dovrebbe uscire una volta che il file è stato inviato completamente.

Se out.txtesiste già, tuttavia, questa configurazione potrebbe comportarsi in modo imprevisto. Se out.txtè più lungo di test.txt, out.txtrimarrà l'ultima parte di , poiché socat sta sovrascrivendo il file byte per byte invece di assicurarsi che il file sia vuoto. Esistono alcuni modi per risolvere questo problema, a seconda di ciò che si desidera fare:

  • OPEN:out.txt,creat,trunccancellerà tutti i byte out.txtprima di scrivere su di esso. Questa opzione imita ciò che ti aspetteresti cped è probabilmente ciò che desideri.
  • OPEN:out.txt,creat,exclrifiuterà di scrivere out.txtse esiste già. Utilizzare questa opzione per una maggiore sicurezza.
  • OPEN:out.txt,creat,appendaggiungerà i dati a out.txt.

Mi piace anche eseguire md5sumi file di origine e di destinazione ogni volta che eseguo una serie di operazioni simili a causa di questo tipo di casi angolari.


è fantastico che tu abbia menzionato "trunc" e quei casi limite. Che dire di md5sum, nel mio caso è un problema perché devo trasferire tutte le cose senza chiudere la connessione ("one-shot";)). Anche tu, è bello menzionarlo per altri lettori :).
Grzegorz Wierzowiecki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.