/// <summary>
        /// 发送
        /// </summary>
        private void SendTrapMsg()
        {
            if (m_need_send && m_session_conn_idx > 0)
            {
                //加入队列
                CheckItem item = new CheckItem();
                item.check_delay_time = MathUtils.RandRange(SHC_MIN_TIME, SHC_MAX_TIME);
                item.sh_check_sn      = MathUtils.RandRange(0, int.MaxValue);
                item.check_send_time  = Time.time;
                m_send_checks.Add(item);

                //发给客户端
                gs2c.SpeedCheck msg = PacketPools.Get(gs2c.msg.SPEED_CHECK) as gs2c.SpeedCheck;
                msg.delay_time = item.check_delay_time;
                msg.check_sn   = item.sh_check_sn;
                ClientSession session = ClientSessionManager.Instance.GetSession(m_session_conn_idx);
                if (session != null)
                {
                    session.Send(msg);
                }

                m_need_send = false;
                ++m_total_times;
            }
        }
        /// <summary>
        /// 收到检查消息
        /// </summary>
        /// <param name="check_sn"></param>
        public void OnRecvTrapMsg(int check_sn)
        {
            if (m_send_checks.Count == 0)
            {
                this.CloseSession(1);
                return;
            }

            //查询收到的检测项
            bool find           = false;
            long find_send_time = 0;
            long current_time   = Time.time;

            for (int i = 0; i < m_send_checks.Count; ++i)
            {
                CheckItem check_item = m_send_checks[i];
                if (check_item.sh_check_sn != check_sn)
                {
                    continue;
                }

                // 检测是否加速(提前收到)
                int delta_time = (int)(check_item.check_send_time + check_item.check_delay_time - current_time);
                if (delta_time > SHC_TOLERANCE_INC)
                {
                    this.CloseSession(2);
                    return;
                }

                find           = true;
                find_send_time = check_item.check_send_time;
                m_send_checks.RemoveAt(i);// 可以移除已经成功的
                break;
            }

            // 收到错误的数据
            if (!find)
            {
                this.CloseSession(3);
                return;
            }

            // 删除已经过期的
            for (int i = m_send_checks.Count - 1; i >= 0; --i)
            {
                CheckItem check_item = m_send_checks[i];
                if (check_item.check_send_time < find_send_time)
                {
                    m_send_checks.RemoveAt(i);
                }
            }

            // 继续进行下一轮
            if (m_send_checks.Count == 0)
            {
                m_need_send = true;
            }
        }
        public void Update()
        {
            if (ServerConfig.net_info.speed_hack_check == 0)
            {
                return;
            }

            // 检测减速以及超时(超时未收到)
            if (Time.frameCount % 8 == 0)// 更新间隔
            {
                if (m_need_send)
                {
                    // 首次或者新的一次
                    SendTrapMsg();
                }
                else if (m_send_checks.Count > 0)
                {
                    int  sh_check_timeout_count = 0;
                    long current_time           = Time.time;
                    for (int i = 0; i < m_send_checks.Count; ++i)
                    {
                        CheckItem check_item = m_send_checks[i];
                        if (check_item.is_timeout)
                        {
                            sh_check_timeout_count++;
                            continue;
                        }

                        int delta_time = (int)(current_time - (check_item.check_send_time + check_item.check_delay_time));
                        if (delta_time > SHC_TOLERANCE_DEC)
                        {
                            sh_check_timeout_count++;
                            check_item.is_timeout = true;
                        }
                    }

                    if (sh_check_timeout_count >= MAX_ALLOW_SEND_COUND)
                    {
                        this.CloseSession(4);
                        return;
                    }
                    else if (sh_check_timeout_count == m_send_checks.Count && m_send_checks.Count < MAX_ALLOW_SEND_COUND)
                    {
                        // 全部过期 且未满 再次发送
                        m_need_send = true;
                        // 再次发送
                        SendTrapMsg();
                        return;
                    }
                }
            }
        }