我在C#.Net中有客户端 - 服务器应用程序,为此我使用的是Tcp Socket。我使用了以下函数来积极关闭套接字对象。
void CloseSocket(Socket socket)
{
if(socket != null)
{
socket.ShutDown(ocketShutdown.Both);
socket.Close();
}
}
在正常条件下,此函数完美地工作,我的方法返回从Read函数返回的0字节。
但是每当客户端进程被taskmanager服务器程序块终止时,就会进入网络流的读取功能。
如何解决此读取阻止功能?我不想使用AsyncRead函数,因为整个项目使用阻塞策略所以现在写我无法将其更改为异步模式。
提前谢谢。
答案 0 :(得分:2)
我假设你所说的是当客户端没有干净地关闭连接时,服务器可以无限期地在Read
结束阻止,即使客户端实际上突然终止了。如果是这样:是的,那就发生了。因此,如果要使用同步读取方法,则应使用超时,尤其是ReceiveTimeout
。如果您有多消息协议,可能需要定期添加某种心跳消息,以便您可以从空闲连接中正确识别真正的僵尸(例如:如果您每分钟发送一次心跳,而您还没有看到连接上的任何活动3分钟,用铲子击中它。
答案 1 :(得分:1)
**you can try this may help you**
public void close()
{
if(clientSocket != null )
{
sendCommand("QUIT");
}
cleanup();
}
private void cleanup()
{
if(clientSocket!=null)
{
clientSocket.Close();
clientSocket = null;
}
logined = false;
}