Vb.net 为什么TCP发送超时似乎没有连接到任何东西?

Vb.net 为什么TCP发送超时似乎没有连接到任何东西?,vb.net,tcp,timeout,Vb.net,Tcp,Timeout,使用代码: Dim client As New System.Net.Sockets.TcpClient() client.ReceiveTimeout = 250 client.SendTimeout = 250 client.Connect(New System.Net.IPEndPoint(New System.Net.IPAddress({***, ***, ***, ***}), *****)) Assert.IsTrue(client.GetStream.CanTimeout) T

使用代码:

Dim client As New System.Net.Sockets.TcpClient()
client.ReceiveTimeout = 250
client.SendTimeout = 250
client.Connect(New System.Net.IPEndPoint(New System.Net.IPAddress({***, ***, ***, ***}), *****))
Assert.IsTrue(client.GetStream.CanTimeout)

Try
  While True
    Dim sent As Integer = client.Client.Send({0})
    System.Threading.Thread.Sleep(100)
    ' Cable is physically disconnected while this loop is active.
  End While
Catch ex As Exception
End Try

环路需要18秒才能意识到硬断开。如果超时时间是250毫秒,怎么会花这么长时间呢?

哦,伙计,不要像那样连接到TCP客户端,不要在catch中不做任何操作就设置try/catch,当然也不要使用使用睡眠的忙循环检查超时。看看这个使用begin connect的示例(如果需要,可以通过C#到VB转换器运行):精细手册不是特别清楚,但暗示您需要调用
GetStream().Write(…)
,如果tcpclient在超时时间内没有得到写入套接字的字节数的确认,则会引发异常。。请注意,我不一定认为这意味着字节来自另一端/在传输过程中遇到了错误,您随后很快就会了解到。在这个有缓冲IO和多个地理位置不同的系统的世界中,任何事情都不能合理地保证总是在250ms内发生-您可能会在250毫秒后超时,字节到达OK@CaiusJard我知道这两种方法是等效的,但是使用GetStream().Write()甚至使用GetStream().Flush()进行后续操作,不会改变行为。@David我对代码审查不感兴趣,这是一个用来证明特定功能的单元测试。如果您的评论实质性地改变了我所质疑的行为,请让我知道如何,我将做出适当的回应。@JCollins-转到链接的SO线程,您将看到如何异步设置该线程以正确处理连接超时。