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


8

我知道netcat通常提出的“ wait-> stop”设计的缺点:

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中有很多选项)


对于追随者,第二个示例(“服务器接收文件”)是“典型”客户端将文件发送到服务器...而且较新版本的netcat具有“ -N -q 0”选项,这将导致更可靠转移比旧的“等待和希望”机制:)
rogerdpack 18/09/28

Answers:


6

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

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

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

md5sum由于这些极端情况,我也喜欢在每次将这样的东西拼凑在一起时在源文件和目标文件上运行。


您提到过“ trunc”和那些极端情况非常好。那么md5sum呢,在我看来,这是个问题,因为我需要在不关闭连接的情况下传输所有内容(“一次性”;))。即使您也很高兴提及其他读者:)。
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.