首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

有关socket关闭时报“无法访问已经释放的对象”的有关问题

2012-02-23 
有关socket关闭时报“无法访问已经释放的对象”的问题我做了个socket服务器,有开启和关闭两种状态,关闭情况

有关socket关闭时报“无法访问已经释放的对象”的问题
我做了个socket服务器,有开启和关闭两种状态,关闭情况下客户端不能访问,只有开启了才能访问。问题是每当我要关闭服务器的时候,总会报说“无法访问已经释放的对象”,让我感到十分郁闷,请各位高手多多帮忙,我是新接触socket的,有很多东西都不太清楚。
以下是我的代码:
                public     void   StartListening()
                {
                       
                        //   Establish   the   local   endpoint   for   the   socket.
                        //   The   DNS   name   of   the   computer
                        //设置服务器的IP地址,网络端口和终结点
                        IPHostEntry   ipHostInfo   =   Dns.Resolve(Dns.GetHostName());
                        IPAddress   ipAddress   =   ipHostInfo.AddressList[0];
                        IPEndPoint   localEndPoint   =   new   IPEndPoint(ipAddress,   11000);
                        //   Create   a   TCP/IP   socket.
                        //建立服务器类型
                        listener   =   new   Socket(AddressFamily.InterNetwork,   SocketType.Stream,   ProtocolType.Tcp);
                        //   Bind   the   socket   to   the   local   endpoint   and   listen   for   incoming   connections.
                        try
                        {
                                //绑定连接终结点并开始侦听
                                listener.Bind(localEndPoint);
                                listener.Listen(10);

                                //   Start   an   asynchronous   socket   to   listen   for   connections.
                                //建立异步SOCKET来侦听传入的连接信息
                                listener.BeginAccept(new   AsyncCallback(AcceptCallback),   listener);              
                        }
                        catch   (Exception   e)
                        {
                                MessageBox.Show(e.ToString());


                        }
                }

                public   void   AcceptCallback(IAsyncResult   ar)
                {
                        //   Get   the   socket   that   handles   the   client   request.
                        //获取传入的客户端信息
                        Socket   listene   =   (Socket)ar.AsyncState;
                        Socket   handler   =   listene.EndAccept(ar);     //关闭时总是在这里报错
                        listener.BeginAccept(new   AsyncCallback(AcceptCallback),   listener);

                        listBox_IPAddress.Items.Add(handler.RemoteEndPoint.ToString());

                        //获取客户端数据
                        StateObject   state   =   new   StateObject();
                        state.workSocket   =   handler;
                        ht.Add(handler.RemoteEndPoint,   handler);

                        Receive(handler);
                }

                private   void   button_Start_Click(object   sender,   EventArgs   e)
                {
                        //判断服务器是否已经开启
                        if   (!ISListen)
                        {
                                StartListening();
                                ISListen   =   true;
                        }
                        else
                        {
                                MessageBox.Show( "服务器已经启动! ", "系统提示 ");
                        }
                }
                ///   <summary>
                ///   关闭所有的客户端会话,与所有的客户端连接会断开
                ///   </summary>


                public   virtual   void   CloseAllClient()
                {
                        foreach   (Socket   client   in   ht.Values)
                        {
                                client.Close();
                        }

                        ht.Clear();
                }

                private   void   button_Stop_Click(object   sender,   EventArgs   e)
                {
                        if   (ISListen)
                        {
                                //这个条件语句,一定要在关闭所有客户端以前调用
                                //否则在EndConn会出现错误
                                ISListen   =   false;

                                //关闭数据连接,负责客户端会认为是强制关闭连接
                                if   (listener.Connected)
                                {
                                        listener.Shutdown(SocketShutdown.Both);
                                }

                                CloseAllClient();

                                //清理资源
                                listener.Close();

                                ht   =   null;
                        }
                        else
                        {
                                MessageBox.Show( "服务器已经关闭! ", "系统提示 ");
                        }
                }


------解决方案--------------------


貌似这代码网上见到很多,都这样...   不想跳出错误就try catch一下忽略它
[解决办法]
“无法访问已经释放的对象” 这个错误一般是 你访问了已经关闭的socket
前面已经 socket.close
后面又有调用 socket.

热点排行