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

Hon*_*oon 4 c# sockets

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.
Run Code Online (Sandbox Code Playgroud)

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


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

Ida*_*n K 5

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

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

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

因此,当您没有阻止时,当您检查Connected值时,可能读取未完成,因此Connected仍处于旧值.


Gee*_*Gee 0

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