当通过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.
如何修复?
答案 0 :(得分:1)
这种情况正在发生,因为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中启动的它连接到管道的写端。 (如果对等体发送的数量很大,您可能需要修改睡眠的秒数。)