Ich versuche, einen einfachen Socat-Dateiserver mit TCP einzurichten, um kleine Dateien (~100 KB) zu senden.
Hier sind die einzeiligen Server und Clients für eine Datei:
Server:socat -u -d -d OPEN:file.dat TCP-LISTEN:<port>,reuseaddr,fork
Klient:socat -u -d -d TCP:<server>:<port> OPEN:file.dat,creat
Der erste Datentransfer funktioniert immer, die folgenden jedoch nicht immer. Die meisten der folgenden Transfers erstellen eine leere Datei auf der Clientseite. Das Problem bleibt bestehen, wenn mehrere Clients gleichzeitig übertragen, und ich habe bestätigt, dass bei Auftreten des Fehlers keine Daten übertragen werden, aber das Protokoll und die Rückgabewerte weisen auf keine Fehler hin, sondern nur auf eine kürzere Datenschleife.
Ich habe so ziemlich jede hier erwähnte Option ausprobiert:http://www.dest-unreach.org/socat/doc/socat.html
Die einzige Möglichkeit, die ich gefunden habe, um es mehrere Male hintereinander zum Laufen zu bringen, besteht darin, die Fork-Option aus dem Server-Listener zu entfernen und die gesamte Befehlszeile in eine Bash-Schleife einzubinden. Aber das schlägt natürlich bei mehreren Clients fehl.
Ich habe es mit Ubuntu, Fedora, Redhat und FreeBSD versucht.
Übersehe ich etwas oder ist das ein Fehler?
Antwort1
Ich hatte das gleiche Problem und habe Stunden gebraucht, um herauszufinden, was ich falsch gemacht habe. Ich weiß es immer noch nicht, aber ich weiß zumindest, wie es funktioniert. Ich habe Folgendes verwendet:
socat -u FILE:/tmp/test.txt TCP-LISTEN:5778,reuseaddr,fork
Und es funktionierte wie erwartet, als ich zu Folgendem wechselte:
socat TCP-LISTEN:5778,reuseaddr,fork FILE:/tmp/test.txt
Ich bin mir nicht sicher, was sich tatsächlich ändert, aber wenn man das -u
Flag entfernt und die Reihenfolge der Adressen tauscht, wird der Socket für mehrere Client-Aufrufe geöffnet. Ich bin darüber gestolpert, als ich versuchte,ein bekanntes funktionierendes Beispiel eines Servers.
Außerdem war mein Client einfach socat -u TCP:localhost:5778 STDOUT
. Es funktioniert -u
auch ohne das.
Antwort2
Mann Mann
$ 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).
auch nur helfen
$ socat -h | grep -m1 '\-u '
...
Antwort3
Dies liegt daran, dass es auf dem Server eine einzelne Dateiquelle und mehrere Dateisenken (TCP-Verbindungen, gegabelt) gibt. Der erste Client verwendet die gesamte Datei und belässt die Dateiposition am EOF (Ende der Datei). Alle nachfolgenden TCP-Clients haben nichts zu lesen, da sie alle dieselbe Dateiquelle verwenden.
Dies ist eher ein Designaspekt von socat als ein Fehler. Ich kenne keine Möglichkeit, mit der neue Verbindungen die Suchposition in der Quelldatei zurücksetzen können.