void OnRecvCompleted(object sender, SocketAsyncEventArgs e)
        {
            if (e.BytesTransferred == 0)
            {
                //  传输为0,表示客户端已经被关闭,触发断开事件
                NetProfile.Instatnce.DisconnectCount++;

                //  触发关闭连接事件
                var disconnectTemp = SocketDisconnect;
                if (disconnectTemp != null)
                {
                    var arg = new SocketDisconnectEventArgs <T>();
                    arg.Session = this;

                    try
                    {
                        disconnectTemp(this, arg);
                    }
                    catch (Exception ex)
                    {
                        Logs.Error("On socket close event error.", ex);
                    }

                    //  清理工作由内部的发送缓冲检查出错误后内部进行处理
                }
            }
            else
            {
                //  正常收到数据
                var buff = RecvBuffer;
                buff.Length = e.BytesTransferred;  //  设置buff的有效长度


                NetProfile.Instatnce.RecvCount++;
                NetProfile.Instatnce.RecvLength += buff.Length;

                var recvTemp = SocketRecv;
                if (recvTemp != null)
                {
                    var ev = new SocketRecvEventArgs <T>();

                    ev.Buffer  = buff;
                    ev.Session = this;
                    try
                    {
                        recvTemp(this, ev);
                    }
                    catch (Exception ex)
                    {
                        Logs.Error("OnSocketRecv event error.", ex);
                    }
                }

                buff.Release();

                //  在处理完消息包后,再进行投递
                //  因为在这之前是先投递再执行数据操作
                //  这样会存在一定的多线程并发下的错误
                //  因为数据处理的逻辑是解包头,然后把包数据压入消息处理队列
                //  因此先处理包消息,再投递,不会影响包接收的性能
                SyncRecvData();
            }
        }
Beispiel #2
0
 void m_Socket_SocketDisconnect(object sender, SocketDisconnectEventArgs <NetState> e)
 {
     m_Running = false;
 }