我尝试过以下情况,并使用秒表来测量套接字接收所需的实际时间。请注意,超时以毫秒为单位。
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()
则BTW、ns.CanTimeout
返回true。此外,我并没有真正期望1毫秒的精度,这只是为了测试目的。事实上,我从500毫秒开始,但首先想用这个测试。
在所有情况及其组合中,即使我每次都用秒表测量了100多毫秒,我也会无一例外地收到数据。然而,如果我故意将响应延迟几秒钟,我可以得到异常。但即使是我对服务器的ping/2也远不止1毫秒。
奇怪的是,如果我将超时设置为1000毫秒,而服务器响应大约需要1020毫秒,则会触发异常。
那么,有一个最小值或其他什么吗?
MSDN:
ReceiveTimeout属性确定Read方法在能够接收数据之前将阻止的时间量。此时间以毫秒为单位。如果在读取成功完成之前超时,TcpClient将抛出IOException。默认情况下没有超时。
。。。如果我将超时设置为1000毫秒,并且服务器响应大约需要1020毫秒,则会触发异常好吧,如果响应所花费的时间比配置的超时时间长,那么就会得到异常。
如果超过超时时间,Receive方法将抛出SocketException。
。。。有最小值或其他什么吗
适用的值从-1到0到MAX_INT_32不等。
超时值,以毫秒为单位。默认值为0,表示无限超时。指定-1也表示无限的超时时间。
但是,底层硬件和/或操作系统决定超时的结果/粒度(例如,Windows的默认计时器分辨率通常为15.625毫秒。因此,异常仅以15.625毫秒的倍数出现)。
来自Microsoft的定义如下:https://msdn.microsoft.com/en-us/library/bk6w7hs8%28v=vs.110%29.aspx
反对它的评论是:
如果读取操作没有在此属性指定的时间内完成,读取操作将抛出IOException
因此,这个问题有点复杂,因为和往常一样,它依赖于准确清晰的措辞。
该定义没有引用任何类型的计时器量程或任何计时器的限制,因此,如果您指定了1000mS的超时,并且在1000mS内没有收到读取,则必须抛出异常,否则该机制不符合其定义。
为了使其正确,任何定义都必须指定计时器精度的某个值,否则就没有可行的"超过"定义。仅仅因为超时被指定为整数并不意味着间隔在1001mS之后被超过——你可以理直气壮地说它在1000.00000000000000001ms之后被超过。
当"如果读取操作未完成…"时,也没有"完成"的定义。
这是否意味着它没有读取你要求的所有字节,或者,如果你要求部分读取,这是否意味意味着它什么都没有读取?
它只是措辞不太好,我怀疑微软会说定义是错误的,而不是函数是错误的。这对你没有多大帮助,因为他们可能会在不同版本之间改变函数的工作方式,甚至可能在不评论的情况下破坏你的代码。
如果它仍然按照描述所说的那样工作,那么它仍然按照规范工作,如果你使用"未记录"的功能——换句话说,你观察到它所做的事情,而不是规范所说的事情——那么这就很难了。
不幸的是,这根本没有达到规范的要求,所以你所能做的就是使用和利用它的"观察到的行为",并希望它保持不变。