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 有很多选项)
在我看来,您的核心是可靠的——这应该是可靠的,并且在文件完全发送后应该退出。
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
每当我拼凑这样的东西时,我也喜欢在源文件和目标文件上运行,因为这些极端情况。
归档时间: |
|
查看次数: |
15360 次 |
最近记录: |