您的位置:首页 > 编程语言 > C#

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

2010-08-25 11:08 525 查看
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了客户端。但为什么回调函数还要执行,使其出现异常:对象已经被释放!请问回调函数应该怎么处理啊?还是在其他地方处理啊?我的目的是要只启动一个线程,维持所有客户端连接!


对我有用[0]

丢个板砖[0]

引用

举报

管理

TOP


回复次数:1
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了客户端。但为什么回调函数还要执行,使其出现异常:对象已经被释放!请问回调函数应该怎么处理啊?还是在其他地方处理啊?我的目的是要只启动一个线程,维持所有客户端连接!


对我有用[0]

丢个板砖[0]

引用

举报

管理

TOP


回复次数:1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐