不显示删除回复显示所有回复显示星级回复显示得分回复 C# socket异步回调函数处理?

            
            
private static Dictionary < string , Socket > clicentSocket = new Dictionary < string , Socket > (); // 保存客户端Socket Thread clientwork = new Thread( new ThreadStart(ClientWorkRece)); // 开启一个线程用于处理所有客户端数据 clientwork.Start(); public static void ClientWorkRece() { while ( true ) { List < string > ipList = new List < string > (); // 用于存放客户端计算机IP foreach (Socket client in clicentSocket.Values) { StateObject state = new StateObject(); state.workSocket = client; try { client.BeginReceive(state.buffer, 0 , StateObject.BufferSize, 0 , new AsyncCallback(ClientReadCallback), state); } catch (SocketException) { // 其他处理..... string ip = ((IPEndPoint)client.RemoteEndPoint).Address.ToString(); // 获取远程计算机IP ipList.Add(ip); // 将断开的计算机放入list中 } } for ( int i = 0 ; i < ipList .Count; i ++ ) { // 其他处理.... clicentSocket[ipList[i]].Shutdown(SocketShutdown.Both); clicentSocket[ipList[i]].Close(); clicentSocket.Remove(ipList[i]); // 将此计算机移除 Console.WriteLine( " 客户端断开! " + listen); } Thread.Sleep( 1 ); } } // 获取客户端信息的回调函数 public static void ClientReadCallback(IAsyncResult ar) { StateObject state = (StateObject)ar.AsyncState; Socket handler = state.workSocket; try { int recData = handler.EndReceive(ar); string ip = ((IPEndPoint)handler.RemoteEndPoint).Address.ToString(); // 获取远程计算机IP try { if (recData > 0 ) // 有数据 { // 数据处理 } } catch (SocketException err) { Console.WriteLine( " Socket异常: " + err.ToString()); Console.WriteLine(clicentSocket.Count.ToString()); } } 问题在于当客户端断开后,回调函数总是报异常:好像是对象已经被释放,我的理解是当客户端断开后,应该在 client.BeginReceive(state.buffer, 0 , StateObject.BufferSize, 0 , new AsyncCallback(ClientReadCallback), state); 就会出现异常,程序运行也是这样,而且也捕获了异常的,而且之后我也在下面的代码中Close了客户端。但为什么回调函数还要执行,使其出现异常:对象已经被释放!请问回调函数应该怎么处理啊?还是在其他地方处理啊?我的目的是要只启动一个线程,维持所有客户端连接!
 
 
id="tad2" height="0" marginheight="0" src="/u/t5/include/ad2.asp?pdate=2010-08-24 12:07:18&ba=DotNET&sa=CSharp" frameborder="0" width="100%" marginwidth="0" scrolling="no" style="height: 46px">
            
            
private static Dictionary < string , Socket > clicentSocket = new Dictionary < string , Socket > (); // 保存客户端Socket Thread clientwork = new Thread( new ThreadStart(ClientWorkRece)); // 开启一个线程用于处理所有客户端数据 clientwork.Start(); public static void ClientWorkRece() { while ( true ) { List < string > ipList = new List < string > (); // 用于存放客户端计算机IP foreach (Socket client in clicentSocket.Values) { StateObject state = new StateObject(); state.workSocket = client; try { client.BeginReceive(state.buffer, 0 , StateObject.BufferSize, 0 , new AsyncCallback(ClientReadCallback), state); } catch (SocketException) { // 其他处理..... string ip = ((IPEndPoint)client.RemoteEndPoint).Address.ToString(); // 获取远程计算机IP ipList.Add(ip); // 将断开的计算机放入list中 } } for ( int i = 0 ; i < ipList .Count; i ++ ) { // 其他处理.... clicentSocket[ipList[i]].Shutdown(SocketShutdown.Both); clicentSocket[ipList[i]].Close(); clicentSocket.Remove(ipList[i]); // 将此计算机移除 Console.WriteLine( " 客户端断开! " + listen); } Thread.Sleep( 1 ); } } // 获取客户端信息的回调函数 public static void ClientReadCallback(IAsyncResult ar) { StateObject state = (StateObject)ar.AsyncState; Socket handler = state.workSocket; try { int recData = handler.EndReceive(ar); string ip = ((IPEndPoint)handler.RemoteEndPoint).Address.ToString(); // 获取远程计算机IP try { if (recData > 0 ) // 有数据 { // 数据处理 } } catch (SocketException err) { Console.WriteLine( " Socket异常: " + err.ToString()); Console.WriteLine(clicentSocket.Count.ToString()); } } 问题在于当客户端断开后,回调函数总是报异常:好像是对象已经被释放,我的理解是当客户端断开后,应该在 client.BeginReceive(state.buffer, 0 , StateObject.BufferSize, 0 , new AsyncCallback(ClientReadCallback), state); 就会出现异常,程序运行也是这样,而且也捕获了异常的,而且之后我也在下面的代码中Close了客户端。但为什么回调函数还要执行,使其出现异常:对象已经被释放!请问回调函数应该怎么处理啊?还是在其他地方处理啊?我的目的是要只启动一个线程,维持所有客户端连接!
 
 
id="tad2" height="0" marginheight="0" src="/u/t5/include/ad2.asp?pdate=2010-08-24 12:07:18&ba=DotNET&sa=CSharp" frameborder="0" width="100%" marginwidth="0" scrolling="no" style="height: 46px">

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值