【问题标题】:TcpClient.ReceiveTimeout is not working on small values?TcpClient.ReceiveTimeout 不适用于小值?
【发布时间】:2015-06-29 07:57:39
【问题描述】:

我尝试了以下情况并使用秒表来测量套接字接收的实际时间。请注意,超时以毫秒为单位。

Dim NextClient As New TcpClient
NextClient.ReceiveTimeout = 1 //Case 1
NextClient.Client.ReceiveTimeout = 1 //Case 2
Dim ns As Net.Sockets.NetworkStream = client.GetStream()
ns.ReadTimeout = 1 //Case 3
Dim sw As New Stopwatch
sw.Start()
ns.Read(gbytes, 0, 5997)
sw.Stop()

顺便说一句,ns.CanTimeout 返回真。此外,我并不真正期望 1 毫秒的精度,它仅用于测试目的。我实际上是从 500 毫秒开始的,但首先想用这个进行测试。

在所有情况及其组合中,即使我每次使用秒表测量 100 多毫秒,我都会毫无例外地收到数据。但是,如果我故意将响应延迟几秒钟,我就会得到异常。但即使是我对服务器的 ping / 2 也远远超过 1 毫秒。

奇怪的是,如果我将超时设置为 1000 毫秒并且服务器响应大约需要 1020 毫秒,则会触发异常。

那么,有最小值还是别的什么?

【问题讨论】:

    标签: c# vb.net tcp timeout tcpclient


    【解决方案1】:

    MSDN:

    ReceiveTimeout 属性确定 Read 方法在能够接收数据之前将阻塞的时间量。该时间以毫秒为单位。如果在读取成功完成之前超时到期,则 TcpClient 将引发 IOException。默认没有超时。

    ...如果我将超时设置为 1000 毫秒并且服务器响应大约需要 1020 毫秒,则会触发异常。好吧,如果响应时间超过配置的超时时间,您将得到例外。

    如果超过超时时间,Receive 方法将抛出 SocketException。

    ...是否有最小值或其他什么?

    适用的值从 -1 到 0 到 MAX_INT_32 不等。

    超时值,以毫秒为单位。默认值为 0,表示无限超时。指定 -1 也表示无限超时。

    但是,底层硬件和/或操作系统决定了超时的结果/粒度(例如,Windows 通常具有 15.625 毫秒的默认计时器分辨率。因此,仅在 15.625 毫秒的倍数时引发异常)。

    【讨论】:

    • 我的特殊情况是:接收平均需要 250 毫秒,我设置的超时时间是 1 毫秒,我在 Windows 8 服务器上并且超时“从不”触发。那么唯一的原因可能是硬件?
    【解决方案2】:

    微软的定义似乎在这里: https://msdn.microsoft.com/en-us/library/bk6w7hs8%28v=vs.110%29.aspx

    反对它的评论是:

    "如果读取操作没有在该属性指定的时间内完成,读取操作会抛出 IOException。"

    所以这个问题有点复杂,因为像往常一样,它依赖于准确而清晰地写出的措辞。

    该定义未提及任何类型的计时器量或任何计时器的限制,因此如果您指定 1000 毫秒的超时并且在 1000 毫秒内未收到读取,则必须抛出异常,否则该机制不符合其定义。

    为了使其正确,任何定义都必须指定计时器精度的某个值,否则没有“超过”的可行定义。仅仅因为超时被指定为一个整数并不意味着在 1001 毫秒之后超过了间隔 - 你可以有理由说它在 1000.0000000000000001 毫秒之后被超过。

    当它声明“如果读取操作没有完成......”时,也没有“完成”的定义。

    这是否意味着它没有读取您请求的所有字节,或者如果您请求部分读取,是否意味着它没有读取任何内容?

    只是措辞不太好,我怀疑微软会说定义错误而不是功能错误,这对您没有多大帮助,因为他们可能会以某种方式改变功能在版本之间的工作方式这可能会破坏您的代码,甚至无需对其进行评论。

    如果它仍然按照描述执行,那么它仍然按照规范工作,并且如果您使用“未记录”的功能 - 换句话说,您观察到它所做的事情而不是规范所说的事情 - 那么这很难。

    不幸的是,这根本不符合规范的规定,因此您所能做的就是使用和利用其“观察到的行为”并希望它保持不变。

    【讨论】:

      猜你喜欢
      • 2017-12-15
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 2012-04-10
      • 1970-01-01
      相关资源
      最近更新 更多