【问题标题】:NetworkStream.Read delay .NetNetworkStream.Read 延迟.Net
【发布时间】:2010-12-30 05:58:48
【问题描述】:

我有一个继承自 TcpClient 的类。在该课程中,我有一种处理响应的方法。在我调用的那个方法中,我使用 MyBase.GetStream 获取 NetworkStream 并对其调用 Read。

这很好用,除了第一次调用读取块太长。太长了,我的意思是套接字已经接收到大量数据,但在达到某个任意限制之前不会读取它。我可以看到它使用数据包嗅探器 WireShark 收到了大量数据。

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

或者换一种说法。我下载600k。下载需要 5 秒(与服务器的连接速度略高于 100k/秒,这是有道理的)。初始读取调用需要 2-3 秒,并告诉我只有 256 个字节可用(256 是接收缓冲区和我读入的数组的大小)。然后神奇地,其他几十万字节可以在 256 字节块中读取,每个块只需几个进程滴答。使用数据包嗅探器,我知道在最初的 2-3 秒内,套接字收到的不仅仅是 256 个字节。我的连接在 3 秒内不是 0.25k/秒,在 2 秒内不是 400k。

如何从套接字中获取传入的字节?

【问题讨论】:

  • 您的 NIC 和您的应用程序之间还有什么?禁用防火墙、病毒扫描程序、CRL、代理,看看会发生什么。
  • nobugz,这就是问题所在。这是我的防病毒应用程序。它必须缓冲一定数量的字节以在将其馈送到套接字缓冲区之前对其进行扫描。这是有道理的,因为我正在使用它会扫描的众所周知的端口。我不敢相信我没有考虑到这一点。您应该将其发布为答案,以便我将其标记为好。

标签: .net sockets tcpclient networkstream


【解决方案1】:

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

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

这将禁用默认运行的nagle algorithm。当发送和接收非常少量的数据时,这会故意导致各种随机延迟。

【讨论】:

    【解决方案2】:

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

    System.Net 命名空间内的类(即 WebClient、HttpWebRequest)似乎会在第一次请求时自动执行此操作。

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

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

    希望这会有所帮助。

    【讨论】:

    • 这是个好主意。但是我在 IE 和 app.config 中禁用了检测代理,它并没有影响延迟。
    猜你喜欢
    • 2010-12-15
    • 2011-06-16
    • 2019-04-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多