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(); } }
void m_Socket_SocketDisconnect(object sender, SocketDisconnectEventArgs <NetState> e) { m_Running = false; }