// 业务层调用的发送 public void Send(byte[] data) { GameLog.Log("发送数据,state:{0}, data:{1}", State, data.ToHex()); if (data == null || State != ConnectState.Connected) { return; } lock (m_lockKcp) CKcp.KcpSend(m_kcp, data, data.Length); }
// 初始化KCP private void InitKCP(uint conv) { m_kcp = CKcp.KcpCreate(conv, new IntPtr(m_kcpID)); CKcp.KcpSetoutput(m_kcp, KcpOutput); /*参数一 nodelay: * 0关闭 重发步长为每次加RTO; * 大于0开启 1重发步为长每次加0.5RTO 2重发步长为每次加0.5实时RTO */ CKcp.KcpNodelay(m_kcp, 1, 10, 0, 0); CKcp.KcpWndsize(m_kcp, 256, 128); m_runningTime = 0; m_kcpStartTime = Util.GetCurrMilliSeconds(); }
// 从UDP接收数据进行处理 private void DealReceiveUdpData() { while (true) { byte[] data = m_udpClient.Receive(); if (data == null) { break; } // 数据包处理 lock (m_lockKcp) { GameLog.Log("kcp收到UDP数据包,sieze:{0}, data:{1}", data.Length, data.ToHex()); int result = CKcp.KcpInput(m_kcp, data, data.Length); } } }
// 处理接收Kcp数据包 private void DealKcpUpdateAndReceive() { // kcp 更新 驱动KCPUpdate m_runningTime = (uint)(Util.GetCurrMilliSeconds() - m_kcpStartTime); lock (m_lockKcp) CKcp.KcpUpdate(m_kcp, m_runningTime); // kcp receive while (true) { byte[] data; int rcvSize, peekSize = 0; lock (m_lockKcp) { peekSize = CKcp.KcpPeeksize(m_kcp); if (peekSize <= 0) { break; } data = m_buffers.Rent(peekSize); rcvSize = CKcp.KcpRecv(m_kcp, data, peekSize); } int headSize = data[0] * 256 + data[1] + 2; if (rcvSize != peekSize || rcvSize != headSize) { GameLog.LogWarningFormat("收到的包size验证失败,headSize+2:{0}, realSize:{1}, peekSize:{2}", headSize, rcvSize, peekSize); continue; } lock (m_lockRcv) { byte[] realData = new byte[rcvSize - 2]; Array.Copy(data, 2, realData, 0, rcvSize - 2); GameLog.LogFormat("收到kcp处理后的包,放入待接收队列,size:{0}, data:{1}", rcvSize - 2, realData.ToHex()); m_queueRcvData.Enqueue(realData); } } }