netcat在8192字节后关闭连接

netcat在8192字节后关闭连接

问题描述:

当通过netcat将请求发送到程序并侦听对该请求的响应时,netcat只接收到前8192个字节并终止。netcat在8192字节后关闭连接

下面是详细信息: 如果事情是发送邮件使用的netcat和管

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

我的软件生成的definitly大于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也完成了,因为这两个命令都在开始连接到管道的写入端的子外壳。 (如果对方发送的数量很大,您可能需要修改睡眠秒数。)

+0

谢谢,这真的很有帮助,并且给了我一些东西;-)。经过测试,最终的命令是:'(echo“something”; sleep“$ SLEEP_TIMER”)| nc -q 2 localhost $ myport'。这使管道保持足够长的时间以待传输所有数据,其中$ SLEEP_TIMER设置为2。 80kb数据。 – Aeonos