首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于C#异步时零字节的处理

2013-08-01 
关于C#异步时0字节的处理本帖最后由 sostonesi 于 2013-07-25 18:30:47 编辑1、Socket服务端,客户端是用C语

关于C#异步时0字节的处理
本帖最后由 sostonesi 于 2013-07-25 18:30:47 编辑 1、Socket服务端,客户端是用C语言写的移动设备。在C#接收设备发过来的信息时有个现象,当设备断开连接的时候,服务端无法获知,只是接收到大量的0字节的包。
2、服务端采用异步方式进行获取,以下为代码


        void asyncAcceptCall(IAsyncResult ar)
        {
            //服务器的Socket
            //AsyncState 状态 获取用户定义的对象
            Socket ServerSocket = (Socket)ar.AsyncState;
            //异步接受传入的连接尝试,并创建新的 Socket 来处理远程主机通信
            Socket ClientSocket = ServerSocket.EndAccept(ar);
            IPEndPoint ipEnde = (IPEndPoint)ClientSocket.RemoteEndPoint;

            SocketInfo socketInfo = new SocketInfo();

            allDone.Set();

            try
            {
                readDone.Reset();

                if (ClientSocket.Connected)
                {

                    socketInfo.Client.BeginReceive(
                          socketInfo.Buff, 
                          0, 
                          2048, 
                          SocketFlags.None, 
                          new AsyncCallback(asynReceCall), 
                          socketInfo


                    );
                }
            }
            catch (SocketException)
            {
            }
            catch (Exception e)
            {
                Console.log(e.ToString());
            }
            finally
            {
                readDone.WaitOne();
            }
        }


当设备意外断开连接的时候,回调函数(asynReceCall)就不会执行。因此在执行了一段时间之后发现线程池的线程挂起数非常多。网络上查询是由于接收到0字节就不会调用到回调函数,应该用什么方法结束掉这些挂起的线程。

最高100分,还请高人指点. C# Socket BeginReceive 0字节 回调函数
[解决办法]
allDone.Set();
readDone.Reset();

这都是什么设计啊?既然异步编程,还搞什么异步的形式来模拟同步阻塞代码,而且还阻塞不止一个,这种骗人的异步要它干什么呢?
[解决办法]
如果都是0能作为异常断开的判断,那就根据此,结束这个线程,不要挂在那里一直等待,如果不能,那就考虑心跳
[解决办法]
做协议,数据以什么结尾代表发送结束。
[解决办法]
“当设备断开连接的时候,服务端无法获知”???
设备在发送过数据给服务器后,再断开连接的情况在服务端就表现为接收到0字节的包,不会有异常,也不会告诉服务端我断开了。明白了这个原理后,你只要判断是否为0字节接收即可,主动关闭和设备的连接。

热点排行