.Net Socket Read功能阻塞问题

时间:2013-10-07 11:05:31

标签: c# .net sockets network-programming

我在C#.Net中有客户端 - 服务器应用程序,为此我使用的是Tcp Socket。我使用了以下函数来积极关闭套接字对象。

void CloseSocket(Socket socket)
{
      if(socket != null)
      {
           socket.ShutDown(ocketShutdown.Both);
           socket.Close();
      } 
}

在正常条件下,此函数完美地工作,我的方法返回从Read函数返回的0字节。

但是每当客户端进程被taskmanager服务器程序块终止时,就会进入网络流的读取功能。

如何解决此读取阻止功能?我不想使用AsyncRead函数,因为整个项目使用阻塞策略所以现在写我无法将其更改为异步模式。

提前谢谢。

2 个答案:

答案 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;
        }