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.为什么?
关键可能在于TcpClient.Connected真正做的事情:
Connected属性从最后一个I/O操作开始获取Client套接字的连接状态 .当它返回false时,Client套接字从未连接,或者不再连接.
由于Connected属性仅反映最近操作时的连接状态,因此您应尝试发送或接收消息以确定当前状态.消息发送失败后,此属性不再返回true.请注意,此行为是设计使然.您无法可靠地测试连接状态,因为在测试和发送/接收之间的时间内,连接可能已丢失.您的代码应该假定套接字已连接,并正常处理失败的传输.
因此,当您没有阻止时,当您检查Connected值时,可能读取未完成,因此Connected仍处于旧值.
| 归档时间: |
|
| 查看次数: |
5870 次 |
| 最近记录: |