Sockets netcat在8192字节后关闭连接

Sockets netcat在8192字节后关闭连接,sockets,pipe,netcat,Sockets,Pipe,Netcat,通过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 localhos

通过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标志的各种组合来更改接收字节的数量,但在pipe命令版本中,它始终是8192

如何解决这个问题呢?

这是因为netcat正在从其标准输入接收文件的结尾。也就是说,echo something命令会将字符串something\n发送到连接到netcat标准输入的管道;然后,由于echo命令终止,管道关闭。因此,在第一次读取管道时,netcat将接收该字符串,但在下一次读取时,它将接收EOF。这会导致它中断与对等方的连接,即使对等方可能尚未完成发送

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

因此,您只需要做一些事情,以确保netcat在其标准输入上没有接收到EOF,然后才能在套接字上获得EOF。像这样的事情可能会做到:

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

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

谢谢,这非常有帮助,请告诉我;-。测试后的最终命令是:echo something;sleep$sleep|u TIMER | nc-q2 localhost$myport。这将使管道保持足够长的活动时间,以便传输所有数据,其中对于约80kb的数据,$SLEEP_TIMER设置为2。