基于 TCP 的 socat 可靠文件传输

Grz*_*cki 9 file-sharing file-transfer tcp

我知道 "wait->stop" 设计的缺点,通常是用 netcat 提出的:

server$ cat test.dat | nc -q 10 -l -p 7878
client$ nc -w 10 remotehost 7878 > out.dat
Run Code Online (Sandbox Code Playgroud)

(这是不可靠的:不知道你等了多久,网络瓶颈总是可能多一秒钟。-另一件事->如果你能立即知道数据被传输并开始处理它们,为什么要等 10 秒!)

我想要解决方案,可靠且漂亮的 tcp 流关闭

我找到了 socat,关闭如下man socat

当其中一个流有效地到达 EOF 时,结束阶段就开始了。Socat 将 EOF 条件传输到另一个流,即尝试仅关闭其写入流,使其有机会正常终止。

我发现以下命令有效:

服务器发送文件:

server$ socat -u FILE:test.dat TCP-LISTEN:9876,reuseaddr
client$ socat -u TCP:127.0.0.1:9876 OPEN:out.dat,creat
Run Code Online (Sandbox Code Playgroud)

服务器接收文件:

server$ socat -u TCP-LISTEN:9876,reuseaddr OPEN:out.txt,creat && cat out.txt
client$ socat -u FILE:test.txt TCP:127.0.0.1:9876
Run Code Online (Sandbox Code Playgroud)

它可靠吗?可以改进吗?(我是否使用了正确的选项?是否有更好的设置选项?- socat 有很多选项)

Jan*_*der 7

在我看来,您的核心是可靠的——这应该是可靠的,并且在文件完全发送后应该退出。

out.txt但是,如果已经存在,则此设置的行为可能会出乎意料。如果out.txt大于test.txt,则最后一部分out.txt将保留,因为 socat 正在逐字节覆盖文件而不是确保文件为空。有几种方法可以解决此问题,具体取决于您要执行的操作:

  • OPEN:out.txt,creat,truncout.txt在写入之前删除所有字节。此选项模仿您对 的期望cp,并且可能是您想要的。
  • OPEN:out.txt,creat,exclout.txt如果它已经存在,将拒绝写入。使用此选项可提高安全性。
  • OPEN:out.txt,creat,append将数据附加到out.txt.

md5sum每当我拼凑这样的东西时,我也喜欢在源文件和目标文件上运行,因为这些极端情况。