日期:2014-05-17  浏览次数:21511 次

socket问题请教 cannot access a disposed object
我用C#写了一个socket转发的程序,先监听本地端口,当监听到某个消息时,对这个消息作出判断,然后转发给其他的电脑。 
现在出现了一个问题,偶尔会出现错误“cannot access a disposed object.object name:'System.Net.Sockets.Socket'”
有时候出现一下,,但是连接还是正常的,有时候出现这个错误后程序就直接停了,其他客户端都连不上.
网络可能不是很稳定,中间异常处理也比较少,因为刚接触,有没有高手给点建议?不胜感激!
C# code

public void OnConnectRequest(IAsyncResult ar) 
{
    try
            {
                //初始化一个SOCKET,用于其它客户端的连接
                server1 = (Socket)ar.AsyncState;
                Client = server1.EndAccept(ar);
                //将要发送给连接上来的客户端的提示字符串e
                DateTimeOffset now = DateTimeOffset.Now;
                Byte[] byteDateLine = new byte[1048576];
                remote = Client.RemoteEndPoint;
                //连接成功 写入到日志文件中
                Log.wlog(Client.RemoteEndPoint.ToString() + "连接成功。" + now.ToString("G") + "\r\n");
                userListOperate(Client.RemoteEndPoint.ToString());
                //等待新的客户端连接
                server1.BeginAccept(new AsyncCallback(OnConnectRequest), server1);
                while (true)
                {
                    int recv = Client.Receive(byteDateLine);
                    string stringdata = Encoding.UTF8.GetString(byteDateLine, 0, recv);
                    string ip = Client.RemoteEndPoint.ToString();
                    //获取客户端的IP和端口
                    if (recv <= 0)
                    {
                        //当客户端终止连接时
                        Log.wlog(ip + "   " + now.ToString("G") + "  " + "已从服务器断开" + "\r\n");
                        //在这里做处理 连接端口 释放端口 并删除userList的显示
                        if (userList.InvokeRequired)
                        {
                            MyInvoke _myinvoke = new MyInvoke(userListOperateR);
                            userList.Invoke(_myinvoke, new object[] { ip });
                        }
                        else
                        {
                            userList.Items.Remove(ip);
                        }
                        Client.Close();
                        break;
                    }

            ......转发消息的程序

        }
      catch (Exception e)
            {
                Log.wlog("异常信息或者连接断开\r\n" + e.Message + "\r\n");
                Client.Close();
            }
}
            



------解决方案--------------------
命名空间:System.Net.Sockets
汇编集:System(在 system.dll 中)

http://www.cnblogs.com/stg609/archive/2008/11/15/1333889.html