Socat zuverlässige Dateiübertragung über TCP

8

Ich bin mir der Nachteile des "wait-> stop" -Designs bewusst, die normalerweise mit netcat vorgeschlagen werden:

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

(Es ist nicht zuverlässig: Kein Zähler, wie lange Sie warten, es ist immer möglich, dass eine Sekunde lang ein Netzwerkegpass aufgetreten ist. - Eine andere Sache -> Warum 10 Sekunden warten, wenn Sie sofort wissen, dass Daten übertragen werden, und mit der Verarbeitung beginnen!)

Ich hätte gerne eine Lösung mit einem zuverlässigen und netten Schließen des TCP-Streams .

Ich habe socat gefunden, mit dem Schließen wie beschrieben in man socat:

Wenn einer der Streams EOF effektiv erreicht, beginnt die Abschlussphase. Socat überträgt die EOF-Bedingung auf den anderen Stream, dh es wird versucht, nur seinen Schreib-Stream herunterzufahren, sodass er ordnungsgemäß beendet werden kann.

Ich fand folgende Befehle funktionierend:

Server-Sende-Datei:

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

Server empfängt Datei:

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

Ist es zuverlässig? Kann es verbessert werden? (Habe ich die richtigen Optionen verwendet? Gibt es bessere Optionen zum Einrichten? - Es gibt so viele davon mit socat)

Grzegorz Wierzowiecki
quelle
Für Follower gibt es im zweiten Beispiel ("Server empfängt Datei") den "typischen" Client, der eine Datei an einen Server sendet. Auch neuere Versionen von Netcat haben die Option "-N -q 0", was zu einer höheren Zuverlässigkeit führen sollte Transfers als der alte "warten und hoffen" Mechanismus :)
Rogerdpack

Antworten:

6

Sieht für mich so aus, als ob Ihr Kern solide ist - dies sollte zuverlässig sein und beendet werden, sobald die Datei vollständig gesendet wurde.

Wenn dies jedoch out.txtbereits vorhanden ist, verhält sich dieses Setup möglicherweise unerwartet. Wenn out.txtlänger als test.txt, out.txtbleibt der letzte Teil von erhalten, da socat die Datei byteweise überschreibt, anstatt sicherzustellen, dass die Datei leer ist. Es gibt verschiedene Möglichkeiten, dies zu beheben, je nachdem, was Sie tun möchten:

  • OPEN:out.txt,creat,trunclöscht alle Bytes out.txtvor dem Schreiben. Diese Option ahmt nach, was Sie erwarten würden cp, und ist wahrscheinlich das, was Sie wollen.
  • OPEN:out.txt,creat,exclwird sich weigern zu schreiben, out.txtwenn es bereits existiert. Verwenden Sie diese Option für zusätzliche Sicherheit.
  • OPEN:out.txt,creat,appendwird Daten an anhängen out.txt.

Ich mag es auch, md5sumauf den Quell- und Zieldateien zu laufen, wenn ich so etwas zusammenschustere, wegen dieser Art von Eckfällen.

Jander
quelle
Es ist großartig, dass Sie über "Trunc" und diese Randfälle gesprochen haben. Was ist mit md5sum, in meinem Fall ist es ein Problem, weil ich alle Sachen übertragen muss, ohne die Verbindung zu schließen ("one-shot";)). Auch du, es ist gut für andere Leser zu erwähnen :).
Grzegorz Wierzowiecki