qq_30350467 2016-09-01 09:01 采纳率: 0%
浏览 2273

Socket.beginreceive 抛出无法访问已释放资源

我的客户端登陆的时候显示已经进入系统,但是服务端在进行Socket.beginReceive的时候报错,无法访问已释放的对象。对象名:“System.Net.Sockets.Socket”。
代码如下:
public Form1()
{
InitializeComponent();
}

    private void Form1_Load(object sender, EventArgs e)
    {
        txtIP.Text = "10.30.62.49" ;
        txtPort.Text = "4001";

    }            

    private void button2_Click(object sender, EventArgs e)
    {
        try
        {
            if (txtIP.Text != "" && txtPort.Text != "")
            {
                ip = IPAddress.Parse(txtIP.Text.Trim());
                port = int.Parse(txtPort.Text.Trim());
                ServerInfo = new IPEndPoint(ip, port);
            }
            else
            {
                MessageBox.Show("请将IP和端口都填写完整!");
                return;
            }

            flag = true;


            ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            ServerSocket.Bind(ServerInfo);    //绑定
            ServerSocket.Listen(10);          //监听
            ClientSocket = new Socket[65535]; //套接字
            MsgBuffer = new byte[65535];
            ClientNumb = 0;
            userInfo = new string[65535];


            ServerThread = new Thread(RecieveAccept);
            ServerThread.IsBackground = true;
            ServerThread.Start();

            SkManThread = new Thread(SkManager);  //发送线程
             SkManThread.IsBackground = true;
             SkManThread.Start();
            CheckForIllegalCrossThreadCalls = false;
            this.btnstart.Enabled = false;
            this.btnstop.Enabled = true;
        }
        catch (Exception ex)
        { throw ex; }

    }
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        DialogResult dr = MessageBox.Show("确定要退出程序吗?", "退出提示", MessageBoxButtons.OKCancel);

        if (dr.Equals(DialogResult.OK))
        {
            // Application.Exit();

        }
        else
        {
            e.Cancel = true;
        }
    }

   private void RecieveAccept()
    {

         while (true)
            {
        try
        {

                ClientSocket[ClientNumb] = ServerSocket.Accept();

                    ClientSocket[ClientNumb].BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), ClientSocket[ClientNumb]);
                    this.txtnew.AppendText(ClientSocket[ClientNumb].RemoteEndPoint.ToString() + " 成功连接服务器." + "\n");
                    this.listBox1.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString());
                    userInfo[ClientNumb] = ClientNumb.ToString();
                    userInfo[ClientNumb] += ClientSocket[ClientNumb].RemoteEndPoint.ToString();
                    ClientNumb++;
                    this.label4.Text = ClientNumb.ToString();

        }
        catch
        {

        }
            }
    }
    private void RecieveCallBack(IAsyncResult AR)
    {

        try
        {
            if (flag)
            {
                if ( (Socket)AR.AsyncState != null)
                {
                    Socket RSocket = (Socket)AR.AsyncState;

                    int REnd = RSocket.EndReceive(AR);

                    this.txtnew.AppendText(Encoding.Default.GetString(MsgBuffer, 0, REnd) + "\n");


                    RSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), RSocket);
                }
            }
        }
        catch (Exception ex)
        {
            return;
        }

    }
    private void SkManager()
    {
        try
        {

            while (true)
            {
                Thread.Sleep(2000);
                #region 将消息轮发给所有在线用户
                for (int j = 0; j < ClientNumb; j++)
                {
                    if (!ClientSocket[j].Connected && ClientSocket[j]!= null)
                    {

                        this.listBox1.Items.Remove(ClientSocket[j].RemoteEndPoint.ToString());
                        this.txtnew.AppendText(ClientSocket[j].RemoteEndPoint.ToString() + "断开与服务器的连接!\n");
                        ClientSocket[j].Close();
                        ClientSocket[j].Dispose();
                        ClientNumb = ClientNumb - 1;
                        this.label4.Text = ClientNumb.ToString();
                    }
                    else
                    {
                        ClientSocket[j].Send(Encoding.Default.GetBytes("服务器:1122" + "\n"));
                        this.txtnew.AppendText("服务器:" + "1122" + "\n");
                    }
                }


                #endregion

            }
        }

        catch(Exception ex)
        { throw ex; }

    }

    private void btnstop_Click(object sender, EventArgs e)
    {
        try
        {
            //flag = false;
            ServerThread.Abort();
            SkManThread.Abort();
            ServerSocket.Close();
            ServerSocket.Dispose();

            for (int i = 0; i <  ClientNumb; i++)
            {
                if (ClientSocket[i].Connected)
                {
                    ClientSocket[i].Close();
                }
            }


        }
        catch { }
        flag = false;
        this.btnstart.Enabled = true;
        this.btnstop.Enabled = false;
        this.listBox1.Items.Clear();
    }
  • 写回答

1条回答 默认 最新

  • dabocaiqq 2017-02-22 20:15
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了