C# Socket连接 无法访问已释放的对象

在进行Socket长连接时,若服务器或客户端出现异常时,另外一端对Socket对话进行操作时,程序会出现无法访问已释放的对象的问题。例如客户端出现问题主动断开Socket时,当服务器操作Socket时,比如主动断开Socket会话,那么程序会出现“无法方位已释放的对象”,是由于客户端的原因导致服务器和客户端的Socket已经不存在或连接已经断开,即Socket已经释放,服务器再操作服务器和客户端的Socket肯定会报错,因此在服务器或客户端一侧操作Socket时,必须首先判断Socket是否存在、连接是否正常,只有存在且连接正常的Socket才允许操作。以服务器断开Socket为例:

                //判断Socket是否存在且连接正常,存在且连接正常的Socket才运行进行断开操作 
                  if (_cliSock != null && _cliSock.Connected)
                {
                    //关闭Socket之前,首选需要把双方的Socket Shutdown掉
                    _cliSock.Shutdown(SocketShutdown.Both);
                    //Shutdown掉Socket后主线程停止10ms,保证Socket的Shutdown完成
                    System.Threading.Thread.Sleep(10);
                    //关闭客户端Socket,清理资源
                    _cliSock.Close();
                }

  注:Socket对话就相当于两个国家(A和C)通过贸易渠道进行稀土交易,正常情况下,A、C国家正常支持该贸易,贸易可以正常进行,若C国家法律禁止稀土出口,主动关闭了该贸易通道,但是A国家并不知道,那么A国家发往C国的所有贸易请求将会被丢失,对贸易通道所有的维护都将失败,所以需要在C国执行法律时(即Close())之前,需要关闭双方的贸易通道(即 SocketShutdown.Both),然后等待最后一批在贸易通道的货物成功运送至A国(即主线层休眠10ms),再执行法律,真正关闭Socket连接。

无法访问释放对象!!!!!

10-16

以下是form1的代码:rnusing System;rnusing System.Collections.Generic;rnusing System.ComponentModel;rnusing System.Data;rnusing System.Drawing;rnusing System.Linq;rnusing System.Text;rnusing System.Windows.Forms;rnrnnamespace _20080517S2rnrn public partial class MainForm : Formrn rn From2 fa;rn public MainForm()rn rn InitializeComponent();rn fa = new From2();rn fa.MdiParent = this;rn fa.WindowState = FormWindowState.Maximized;rn fa.button1.Click += new EventHandler(button1_Click);rn rn rn rn void button1_Click(object sender, EventArgs e)rn rn MessageBox.Show(fa.Timu);rn fa.Close();rn rn rn rn rn private void 增加题目ToolStripMenuItem_Click(object sender, EventArgs e)rn rn fa.Show();rn rn rnrnrnrn下面是form2的代码:rnusing System;rnusing System.Collections.Generic;rnusing System.ComponentModel;rnusing System.Data;rnusing System.Drawing;rnusing System.Linq;rnusing System.Text;rnusing System.Windows.Forms;rnrnnamespace _20080517S2rnrn public partial class From2: Formrn rn public From2()rn rn InitializeComponent();rn rn public string Timurn rn get return this.textBox1.Text; rn rn public string XX1rn rn get return this.textBox2.Text; rn rn public string XX2 rn get return this.textBox3.Text; rn rn public string XX3 rn get return this.textBox4.Text; rn rn public string XX4 rn get return this.textBox5.Text; rn rnrn private void button1_Click(object sender, EventArgs e)rn rn MessageBox.Show(this.Timu);rn rn rn rnrnrnrn第一次点击”增加题目“时 form2 正常SHOW出来!rnrn输入完后 点FORM2的Button1关闭rnrn然后第二次点击“增加题目”的时候就会出现 “无法访问已释放的对象” 的错误rnrn为什么会这样 rnrn环境:VS2008 论坛

没有更多推荐了,返回首页