Netcat:传输完成前连接丢失

Netcat:传输完成前连接丢失

CentOS 5 或 6(nc-1.84-10.fc6 或 nc-1.84-22.el6.x86_64)中的 Netcat(nc)有一个有趣的问题。我该如何解决这个问题?我找不到有关此问题的错误,但是

它模拟了文件传输到远程主机的过程,在远程主机上对文件进行转换,然后返回结果。在这个例子中,转换是“cat”。

服务器(本地主机):

$ mkfifo nctest.fifo
$ while :; do
      nc -l 5000 <nctest.fifo | cat >nctest.fifo
      echo -n .
      sleep 1
  done

客户端(本地主机):

$ cat testfile | nc 127.0.0.1 5000 > outfile
$ ls -l
total 9724
prw-r--r-- 1 root root       0 Nov  4 14:17 nctest.fifo
-rw-r--r-- 1 root root 4930560 Nov  4 14:17 outfile
-rw-r--r-- 1 root root 5000000 Nov  4 14:09 testfile

Outfile 的大小从零到 5000000 不等。我可以向客户端添加“-w2”,但这没用。

答案1

嗯...好的,我思考我知道这是怎么回事。由于您使用管道命令(使用“|”符号)启动服务器,因此进程nccat进程之间存在关系。当nc处理在 TCP 连接上看到 EOF 时,它会退出……这会导致进程cat也退出(即使它尚未从管道读取所有内容)。

您可以通过将管道更改为如下方式来解决此问题:

  nc -l 5000 <nctest.fifo | cat >nctest.fifo &
  wait
  echo -n .

...注意,'&' 和wait调用。当然,这可能会让后台作业继续运行,因此您需要在 shell 脚本中添加 SIGCHLD 处理程序,以确保在完成后将其射入头部(我将把这部分留作练习)。

相关内容