Exemple #1
0
        /// <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;
        }
Exemple #2
0
        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;
        }