socat TCP файловый сервер

socat TCP файловый сервер

Я пытаюсь настроить простой файловый сервер SOCAT, использующий TCP для отправки небольших файлов (~100 КБ).

Вот однострочные серверы и клиент для одного файла:

Сервер:socat -u -d -d OPEN:file.dat TCP-LISTEN:<port>,reuseaddr,fork

Клиент:socat -u -d -d TCP:<server>:<port> OPEN:file.dat,creat

Первая передача данных всегда работает, но последующие не всегда. Большинство следующих передач создают пустой файл на стороне клиента. Проблема сохраняется, когда несколько клиентов передают данные один раз, и я подтвердил, что данные не передаются, когда возникает ошибка, но журнал и возвращаемые значения не указывают на какие-либо ошибки, а только на более короткий цикл данных.

Я перепробовал практически все варианты, упомянутые здесь:http://www.dest-unreach.org/socat/doc/socat.html

Единственный способ, который я нашел, чтобы это работало несколько раз подряд, — это удалить опцию fork из прослушивателя сервера и обернуть всю строку команды в цикл bash, но, конечно, для нескольких клиентов это не сработает.

Я пробовал Ubuntu, Fedora, Redhat и FreeBSD.

Я что-то упустил или это ошибка?

решение1

У меня была та же проблема, и мне потребовались часы, чтобы понять, что я делаю неправильно. Я до сих пор не понимаю, но я, по крайней мере, знаю, как заставить это работать. Я использовал:

socat -u FILE:/tmp/test.txt TCP-LISTEN:5778,reuseaddr,fork

И все заработало, как и ожидалось, когда я переключился на:

socat TCP-LISTEN:5778,reuseaddr,fork FILE:/tmp/test.txt

Я не уверен, что именно меняется, но сброс флага -uи изменение порядка адресов откроет сокет для множественных клиентских вызовов. Я наткнулся на это, когда пытался дублироватьизвестный рабочий пример сервера.

Также мой клиент был просто socat -u TCP:localhost:5778 STDOUT. Он работает -uи без .

решение2

мужчина мужчина

$ 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).

даже просто помочь

$ socat  -h | grep -m1 '\-u '

...

решение3

Это происходит потому, что на сервере есть один источник файла и несколько приемников файлов (TCP-подключения, разветвленные). Первый клиент потребляет весь файл, оставляя позицию файла на EOF (конец файла). Все последующие TCP-клиенты оказываются без возможности что-либо прочитать, поскольку все они используют один и тот же источник файла.

Это скорее аспект дизайна socat, чем ошибка. Я не знаю способа для новых подключений сбросить позицию поиска в исходном файле.

Связанный контент