Socat TCP-Dateiserver

Socat TCP-Dateiserver

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 -uFlag 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 -uauch 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.

verwandte Informationen