调用Socket.Receive后,C#Socket.Connected属性更改为false

int readCount; byte[] buffer = new byte[128]; SocketError socketError; TcpClient tcpClient = tcpListener.AcceptTcpClient(); tcpClient.Client.ReceiveTimeout = 500; // #1 // tcpClient.Client.Connected is **true** here. readCount = tcpClient.Client.Receive(buffer, 0, buffer.Length, SocketFlags.None, out socketError); // reacCount > 0 // tcpClient.Client.Connected is **false** here. 

如果#1被替换为tcpClient.Client.Blocking = false; ,tcpClient.Client.Connected具有正确的值(true)。


我已将Socket.ReceiveTime属性设置为100并调用Socket.Receive()Receive()返回大于零的整数值。 没有例外。 在我使用复制缓冲区完成工作后 – 我没有使用任何与Socket相关的方法 – ,Socket.Connected属性已更改为false。 为什么?

关键可能在于TcpClient.Connected真正做的事情:

Connected属性从最后一个I / O操作开始获取Client套接字的连接状态。 当它返回false时,Client套接字从未连接,或者不再连接。

由于Connected属性仅反映最近操作时的连接状态,因此您应尝试发送或接收消息以确定当前状态。 消息发送失败后,此属性不再返回true。 请注意,此行为是设计使然。 您无法可靠地测试连接状态,因为在测试和发送/接收之间的时间内,连接可能已丢失。 您的代码应该假定套接字已连接,并正常处理失败的传输。

因此,当您没有阻止时,当您检查连接值时,读取可能未完成,因此“已连接”仍处于其旧值。

如果远程主机不再连接到套接字,则可能会发生这种情况。 连接的另一端是否超时可能已被超过?