2009-12-27 134 views
0

我有一个继承自TcpClient的类。在那个班里,我有一个处理回答的方法。在这种方法中,我打电话给我的NetworkStream和MyBase.GetStream,并调用Read。NetworkStream.Read延迟.Net

这可以正常工作,第一次读取块的时间太长。而且太长时间我的意思是套接字已经收到了大量的数据,但直到达到任意限制时才会读取它。我可以看到它使用数据包嗅探器WireShark收到了大量的数据。

我已经将接收缓冲区设置为少量,并且非常少量(如只是几个字节)无济于事。我对传递给读取方法的缓冲区字节数组做了同样的处理,但仍然延迟。

或者换句话说。我下载600k。下载需要5秒钟(稍微超过100k /秒连接到服务器是有道理的)。最初的Read调用需要2-3秒,并告诉我只有256个字节可用(256是Recieve缓冲区和我读入的数组的大小)。然后奇迹般地,其他几十万字节可以在256字节的块中读取,每个字节只有几个进程滴答。使用数据包嗅探器,我知道在最初的2-3秒内,套接字已经收到了不止256个字节。我的连接不是.25k /秒3秒,然后400k 2秒。

当他们进来时,我如何从套接字中获取字节?

+0

你的网卡和你的应用之间还有什么?禁用防火墙,病毒扫描程序,CRL,代理,看看会发生什么。 – 2009-12-27 12:24:40

+0

nobugz,这是问题。这是我的反病毒应用程序。它必须缓冲一定数量的字节才能在将它送入套接字缓冲区之前进行扫描。 这是有道理的,因为我正在使用一个众所周知的端口,它会扫描。我不敢相信我没有想到这一点。 您应该将其作为回答发布,以便将其标记为好。 – Gilbes 2009-12-28 03:36:18

回答

0

我以前也遇到过这几次,它似乎与检查机器的Internet Explorer设置(代理设置/局域网设置等等),导致2-3秒的延迟有关。

System.Net命名空间(即WebClient,HttpWebRequest)中的类似乎在第一个请求中自动执行此操作。

您可以尝试关闭或更改IE的代理设置/ LAN设置,特别是自动设置检测选项,这可能会有所帮助。

如果这没有帮助,看看这篇文章:Mysterious delay on first use of HttpWebRequest.GetRequestStream。这不完全是TcpClient,但我认为这是同样的问题。

希望这会有所帮助。

+0

这是个好主意。但我禁用了检测代理,在IE和app.config中,并没有影响延迟。 – Gilbes 2009-12-28 03:28:52

1

编写开源C# network library时遇到了类似的问题。尝试设置:

tcpClient.NoDelay = true; 
tcpClient.Client.NoDelay = true; 

这会禁用默认情况下运行的nagle algorithm。这在发送和接收非常少量的数据时会故意造成各种随机延迟。