使用Accept方法创建的TcpClient实例用于管理客户端连接。当我需要终止服务器线程时,问题就出现了,因为它被阻塞在接收调用上。
所以我设置了TcpClient ReceiveTimeout,以便每隔n毫秒循环一次以测试退出条件。结果是,Receive操作引发异常(SocketException),错误代码为SocketError.TimedOut。好吧,我在想...
问题在于属性Socket.Connected返回false,但正如MSDN文档中所述:
Connected属性的值反映了最近一次操作时连接的状态。如果您需要确定连接的当前状态,请进行非阻塞、零字节的Send调用。如果调用成功返回或抛出WAEWOULDBLOCK错误代码(10035),则套接字仍处于连接状态;否则,套接字不再连接。
所以,我按照说明做了:
try {
// Receive operation on socket stream
// Send operation on socket stream
} catch (SocketException e) {
if (e.SocketErrorCode == SocketError.TimedOut) {
try {
IAsyncResult asyncResult;
int sResult;
asyncResult = mSocket.Client.BeginSend(new byte[] {}, 0, 0, SocketFlags.None, delegate(IAsyncResult result) { }, null);
sResult = mSocket.Client.EndSend(asyncResult);
Debug.Assert(asyncResult.IsCompleted == true);
if (mSocket.Connected == false)
throw new Exception("not more connected"); // Always thrown
} catch (Exception e) {
// ...
}
}
但是,即使执行了异步发送操作,属性 mSocket.Connected 总是为false,导致外部循环终止(其他线程调用Disconnect方法来终止服务器线程)。
我错过了什么吗?