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 操作以来。当它
返回 false,客户端套接字是
要么从未连接,要么没有
连接时间更长。
因为只有 Connected 属性
反映连接的状态
截至最近一次操作,您
应该尝试发送或接收
消息来确定当前
状态。消息发送失败后,
该属性不再返回 true。
请注意,此行为是设计使然。
您无法可靠地测试
连接,因为,在时间
在测试和发送/接收之间,
连接可能已丢失。
您的代码应该假设套接字是
连接并优雅地处理
传输失败。
因此,当您没有阻塞并且检查 Connected 值时,读取可能尚未完成,因此 Connected 仍处于旧值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)