Я пытаюсь настроить простой файловый сервер 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.
Я что-то упускаю или это ошибка?
У меня была та же проблема, и мне потребовались часы, чтобы понять, что я делаю не так. Я до сих пор не знаю, но я, по крайней мере, знаю, как заставить это работать. Я использовал:
socat -u FILE:/tmp/test.txt TCP-LISTEN:5778,reuseaddr,fork
И это сработало, как и ожидалось, когда я переключился на:
socat TCP-LISTEN:5778,reuseaddr,fork FILE:/tmp/test.txt
Я не уверен, что на самом деле меняется, но бросаю -u
flag и изменение порядка адресов откроет сокет для нескольких клиентских вызовов. Я наткнулся на это, пытаясь продублировать известный рабочий пример сервера.
Также мой клиент был просто socat -u TCP:localhost:5778 STDOUT
. Работает без -u
также.
мужчина мужчина
$ 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 '
...