socat 通过 TCP 进行可靠的文件传输

socat 通过 TCP 进行可靠的文件传输

我知道“等待->停止”设计的缺点,通常是由 netcat 提出的:

server$ cat test.dat | nc -q 10 -l -p 7878
client$ nc -w 10 remotehost 7878 > out.dat

(这是不可靠的:没有计量器您等待了多长时间,总是有可能存在网络瓶颈多一秒。-另一件事->如果您可以立即知道数据已传输并开始处理它们,为什么要等待 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

服务器接收文件:

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

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

答案1

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

但是,如果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由于存在这些极端情况,每当我将类似的东西拼凑在一起时,我也喜欢在源文件和目标文件上运行。

相关内容