我知道“等待->停止”设计的缺点,通常是由 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,trunc
out.txt
将在写入之前删除所有字节。此选项模仿了您的期望cp
,并且可能就是您想要的。OPEN:out.txt,creat,excl
out.txt
如果已经存在,将拒绝写入。使用此选项可提高安全性。OPEN:out.txt,creat,append
将附加数据到out.txt
.
md5sum
由于存在这些极端情况,每当我将类似的东西拼凑在一起时,我也喜欢在源文件和目标文件上运行。