/// <summary> /// 处理心跳包 /// </summary> /// <param name="session"></param> public static void TResult(UserSession session) { int offset = Interlocked.Add(ref m_offset, size) & mask; long nowTicks = WriteTime(offset + 6); session.SendAsync(new Sinan.Collections.BytesSegment(m_bin, offset, len)); TimeControl t = session.Buffer; if (t == null) return; //每个计时周期表示一百纳秒,即一千万分之一秒。1 毫秒内有 10,000 个计时周期 //大于间隔,计数清零,连续8次间隔小于指定间隔,则断开客户端 long tick = nowTicks - t.Ticks; if (tick > 5000 * 10000) { //重置警告 t.SpeenWarn = 0; } //大于20毫秒,小于4900毫秒,则进行警告计数 else if (tick > 20 * 10000 && tick < 4900 * 10000) { //连续8次警告,则断开客户端 if (Interlocked.Increment(ref t.SpeenWarn) == 8) { try { session.SendAsync(FastErr); logger.Info(session.ToString("ForceExit|")); } finally { session.Close(); } return; } } t.Ticks = nowTicks; }
protected static string DecodeCommand(UserSession user, int command) { //心跳 if (command == 103) { TResult(user); return string.Empty; } UserBuffer buffer = user.Buffer; if (buffer == null) return null; string name = null; //检查命令范围 if (command > 100 && command <= CommandManager.MaxCommand) { //检查调用频繁度 int ct = CommandManager.ControlTicks[command]; if (ct > 0) { long interval = buffer.LastInterval(command); if (interval < ct) { if (string.IsNullOrEmpty(user.UserID)) { user.Close(); return null; } else if (buffer.CallTicks[0]++ > 20000) { //发送操作太快信息 try { user.SendAsync(FastErr); LogWrapper.Warn(user.ToString("Operating too fast|")); } finally { user.Close(); } return null; } return string.Empty; } } name = CommandManager.Instance.ReadString(command); } if (name == null) { //命令不存在时.如果用户未登录,或登录用户总计16次出错则断开 if (string.IsNullOrEmpty(user.UserID)) { user.Close(); } else if (buffer.CallTicks[1]++ > 16) { LogWrapper.Warn(user.ToString("Protocol error|")); user.Close(); } } return name; }