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 连接到管道的写入端。 (如果对等方发送的数量很大,您可能需要调整睡眠秒数。)
当通过 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 连接到管道的写入端。 (如果对等方发送的数量很大,您可能需要调整睡眠秒数。)