![socat TCP 文件服务器](https://linux22.com/image/658626/socat%20TCP%20%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我正在尝试设置一个简单的 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。我不知道新连接如何重置源文件上的搜索位置。