/// <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; } } } }