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

来源:互联网 发布:手机网络赚钱项目 编辑:程序博客网 时间:2024/04/30 05:17

private static Dictionary<string, Socket> clicentSocket = new Dictionary<string, Socket>();//保存客户端SocketThread 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了客户端。但为什么回调函数还要执行,使其出现异常:对象已经被释放!请问回调函数应该怎么处理啊?还是在其他地方处理啊?我的目的是要只启动一个线程,维持所有客户端连接!
   
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
回复次数:1
private static Dictionary<string, Socket> clicentSocket = new Dictionary<string, Socket>();//保存客户端SocketThread 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了客户端。但为什么回调函数还要执行,使其出现异常:对象已经被释放!请问回调函数应该怎么处理啊?还是在其他地方处理啊?我的目的是要只启动一个线程,维持所有客户端连接!
   
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
回复次数:1