我有一个继承自TcpClient的类。在那个课程中,我有一个处理响应的方法。在那个方法中,我调用我用MyBase.GetStream获取NetworkStream并调用Read。
这很好用,第一次调用读取块的时间太长了。而且太久了,我的意思是套接字已收到大量数据,但在达到某个任意限制之前不会读取它。我可以看到它使用数据包嗅探器WireShark收到了大量数据。
我已经将接收缓冲区设置为少量,并且非常少量(例如几个字节)无济于事。我已经对传递给read方法的缓冲区字节数组做了同样的事情,它仍然会延迟。
或者换句话说。我下载600k。下载需要5秒钟(与服务器连接有点超过100k /秒,这是有意义的)。初始的Read调用需要2-3秒,并告诉我只有256个字节是可用的(256是Recieve缓冲区和我读入的数组的大小)。然后神奇地,其他几十万个字节可以在256个字节的块中读取,每个块只有几个进程滴答。使用数据包嗅探器,我知道在最初的2-3秒内,套接字收到的不仅仅是256字节。我的连接不是.25k /秒,持续3秒,然后是400k持续2秒。
如何从套接字中获取字节?
答案 0 :(得分:2)
在撰写开源C# network library时,我遇到了类似的问题。尝试设置:
tcpClient.NoDelay = true;
tcpClient.Client.NoDelay = true;
默认情况下禁用nagle algorithm操作。在发送和接收非常少量的数据时,这会故意导致各种随机延迟。
答案 1 :(得分:0)
我之前也遇到过这种情况,这似乎与检查机器的Internet Explorer设置(代理设置/局域网设置等)有关,导致延迟2-3秒。
System.Net命名空间内的类(即WebClient,HttpWebRequest)似乎在第一次请求时自动执行此操作。
您可以尝试关闭或更改IE的代理设置/ LAN设置,尤其是自动设置检测选项,这可能会有所帮助。
如果这没有用,请看一下这篇文章:Mysterious delay on first use of HttpWebRequest.GetRequestStream。它不完全是TcpClient,但我认为这是同样的问题。
希望这有帮助。