Exemple #1
0
    // 业务层调用的发送
    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);
    }
Exemple #2
0
    // 初始化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();
    }
Exemple #3
0
    // 从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);
            }
        }
    }
Exemple #4
0
    // 处理接收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);
            }
        }
    }