socat TCP 文件服务器

socat TCP 文件服务器

我正在尝试设置一个简单的 socat 文件服务器,使用 TCP 来发送小文件(~100KB)。

以下是一个文件的单行服务器和客户端:

服务器: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 的设计问题,而不是 bug。我不知道新连接如何重置源文件上的搜索位置。

相关内容