//====================================================================== //发送数据 //====================================================================== public bool Send(NetMessage msg) { this.LogVerbose(); msg.head.sid = Id; m_bufferSend.Attach(new byte[msg.Length], 0); msg.Serialize(m_bufferSend); NetPacket packet = new NetPacket(m_bufferSend.GetBytes()); lock (m_queueSend) { m_queueSend.Enqueue(packet); } if (m_sending == 0 && m_actived == 1) { lock (m_queueSend) { if (m_currSendingPacket == null) { if (m_queueSend.Count > 0) { m_currSendingPacket = m_queueSend.Dequeue(); SendInternal(m_saeSend); } } } } return(true); }
//====================================================================== //发送数据 //====================================================================== public bool Send(NetMessage msg) { //主线程 this.LogVerbose(); msg.head.sid = Id; m_bufferSend.Attach(new byte[msg.Length], 0); msg.Serialize(m_bufferSend); var bytes = m_bufferSend.GetBytes(); var len = m_bufferSend.Length; return(m_Kcp.Send(bytes, len) > 0); }
//====================================================================== //接收数据 //====================================================================== protected void DoReceiveInThread() { //子线程 this.LogVerbose(); bool result = false; try { EndPoint remotePoint = IPUtils.GetIPEndPointAny(AddressFamily.InterNetwork, 0); int cnt = m_socket.ReceiveFrom(m_RecvBufferTemp, m_RecvBufferTemp.Length, SocketFlags.None, ref remotePoint); if (cnt > 0) { if (!RemoteEndPoint.Equals(remotePoint)) { Debuger.LogVerbose("收到非目标服务器的数据!"); return; } m_bufferReceive.Attach(m_RecvBufferTemp, cnt); byte[] m_32b = new byte[4]; m_bufferReceive.ReadBytes(m_32b, 0, 4); uint sid = BitConverter.ToUInt32(m_32b, 0); if (sid == 0) { //Session过期了 HandleServerError((int)NetErrorCode.SessionExpire); return; } byte[] dst = new byte[cnt]; Buffer.BlockCopy(m_RecvBufferTemp, 0, dst, 0, cnt); m_RecvBufQueue.Push(dst); } } catch (Exception ex) { this.LogWarning("接收数据出错:{0}", ex.Message); onReceiveError.InvokeSafe(this, (int)NetErrorCode.UnkownError, ex.Message); } }
private void DoReceiveInThread() { EndPoint remotePoint = IPUtils.GetIPEndPointAny(AddressFamily.InterNetwork, 0); int cnt = m_socket.ReceiveFrom(m_RecvBufferTemp, m_RecvBufferTemp.Length, SocketFlags.None, ref remotePoint); if (cnt > 0) { m_bufferReceive.Attach(m_RecvBufferTemp, cnt); byte[] m_32b = new byte[4]; m_bufferReceive.ReadBytes(m_32b, 0, 4); uint sid = BitConverter.ToUInt32(m_32b, 0); lock (m_mapSession) { KcpSession session = null; if (sid == 0) { //来自Client的第1个包,只能是鉴权包 session = new KcpSession(NewSessionID(), m_listener); m_mapSession.Add(session.Id, session); } else { session = m_mapSession[sid]; } if (session != null) { session.Active(m_socket, remotePoint as IPEndPoint); session.DoReceiveInGateway(m_RecvBufferTemp, cnt); } else { this.LogWarning("无效的包! sid:{0}", sid); //需要返回给客户端,Session无效了,直接返回一个Sid为0的包 //当客户端收到包好,会抛出Session过期事件 //因为正常情况下,客户端收到的Session肯定不为0 m_socket.SendTo(new byte[4], remotePoint); } } } }
//====================================================================== //发送数据 //====================================================================== public bool Send(NetMessage msg) { this.Log(); if (!IsActived) { Debuger.LogWarning("Session已经不活跃了!"); return(false); } msg.head.sid = Id; m_bufferSend.Attach(new byte[msg.Length], 0); msg.Serialize(m_bufferSend); var bytes = m_bufferSend.GetBytes(); var len = m_bufferSend.Length; return(m_Kcp.Send(bytes, len) == 0); }
private void OnReceiveCompleted(object sender, SocketAsyncEventArgs e) { this.LogVerbose(e.SocketError.ToString()); if (e.SocketError != SocketError.Success) { this.LogWarning("接收出错!{0}", e.SocketError); onReceiveError.InvokeSafe(this, (int)NetErrorCode.SocketError, e.SocketError.ToString()); ReceiveInternal(); return; } if (e.BytesTransferred < 1) { this.LogWarning("接收出错!{0}", e.SocketError); onReceiveError.InvokeSafe(this, (int)NetErrorCode.SocketError, e.SocketError.ToString()); ReceiveInternal(); return; } m_bufferReceive.Attach(e.Buffer, e.BytesTransferred); NetMessage msg = new NetMessage(); if (msg.Deserialize(m_bufferReceive)) { lock (m_queueReceive) { m_queueReceive.Enqueue(msg); } } else { this.LogError("反序列化失败!"); onReceiveError.InvokeSafe(this, (int)NetErrorCode.DeserializeError, "反序列化失败"); } ReceiveInternal(); }
private void OnReceiveCompleted(object sender, SocketAsyncEventArgs e) { this.Log(e.SocketError.ToString()); if (e.SocketError != SocketError.Success) { this.LogWarning(e.SocketError.ToString()); } else { if (e.BytesTransferred == 0) { this.LogWarning("收到的数据长度为0"); } else { m_bufferReceive.Attach(e.Buffer, e.BytesTransferred); NetMessage msg = new NetMessage(); if (msg.Deserialize(m_bufferReceive)) { lock (m_mapSession) { UdpSession session = null; if (msg.head.sid == 0) { session = new UdpSession(NewSessionID(), m_pool, m_listener); m_mapSession.Add(session.Id, session); } else { session = m_mapSession[msg.head.sid]; if (session == null) { //对于UDP,可以重新分配SessionId session = new UdpSession(NewSessionID(), m_pool, m_listener); m_mapSession.Add(session.Id, session); } } if (session != null) { session.Active(m_socket, (IPEndPoint)e.RemoteEndPoint); session.DoReceiveInGateway(msg); } else { this.LogWarning("无效的包! sid:{0}", msg.head.sid); //需要返回给客户端,Session无效了 UdpSession.ReturnErrorMessage(m_socket, (IPEndPoint)e.RemoteEndPoint, NetErrorCode.SessionExpire, "Session Expired!"); } } } else { this.LogError("反序列化失败!"); } } } this.ReceiveAsync(); }