netcat 在 8192 字节后关闭连接

netcat closes connection after 8192 bytes

当通过 netcat 向程序发送请求并侦听对该请求的响应时,netcat 仅收到前 8192 个字节,然后终止。

详情如下: 如果使用 netcat 和管道发送某些内容

echo "something" | netcat -q 10 -i 3 -w 10 localhost myport

我的软件生成一个肯定大于 8192 字节的响应并将其发送回 netcat。我验证了所有字节实际上都是从我的程序发送回 netcat,所以没有问题。 如果使用命令行版本:

netcat -q 10 -i 3 -w 10 localhost myport
something

收到应用程序发送的所有字节。我尝试了 -q -i 和 -w 标志的各种组合来更改接收到的字节数,但在管道命令版本中它始终是 8192。

如何解决?

发生这种情况是因为 netcat 正在从其标准输入接收文件结尾。也就是说,命令 echo "something" 导致字符串 something\n 被发送到连接到 netcat 的标准输入的管道;然后管道关闭(因为 echo 命令终止)。因此,在管道的第一个 read 上,netcat 将收到该字符串,但在下一个 read 上,它将收到 EOF。这会导致它断开与对等方的连接,即使对等方可能尚未完成发送。

本质上,在如上启动后,netcat将继续将其标准输入发送到套接字,并将套接字发送到其标准输出,直到其中一个关闭.然后退出。

所以您只需要做一些事情来确保 netcat 在套接字上获得 EOF 之前不会在其标准输入上接收到 EOF。像这样的事情可能会做到:

(echo "something" ; sleep 1) | netcat localhost $myport

现在 echo "something" 的输出被发送到连接到 netcat 输入的管道,但是管道实际上不会关闭,直到 sleep 1 也完成,因为这两个命令都是在子中启动的-shell 连接到管道的写入端。 (如果对等方发送的数量很大,您可能需要调整睡眠秒数。)