Ejemplo n.º 1
0
        public static void RecordCmdOutputDataSize(int cmdId, long dataSize)
        {
            PorcessCmdMoniter moniter = null;

            if (!ProcessSessionTask.cmdMoniter.TryGetValue(cmdId, out moniter))
            {
                moniter = new PorcessCmdMoniter(cmdId, 0L);
                moniter = ProcessSessionTask.cmdMoniter.GetOrAdd(cmdId, moniter);
            }
            moniter.OnOutputData(dataSize);
        }
Ejemplo n.º 2
0
        public static void RecordCmdDetail2(int cmdId, long processTime, long waitTime)
        {
            PorcessCmdMoniter moniter = null;

            if (!ProcessSessionTask.cmdMoniter.TryGetValue(cmdId, out moniter))
            {
                moniter = new PorcessCmdMoniter(cmdId, processTime);
                moniter = ProcessSessionTask.cmdMoniter.GetOrAdd(cmdId, moniter);
            }
            moniter.onProcess(processTime, waitTime);
        }
Ejemplo n.º 3
0
        public static void RecordCmdDetail(int cmdId, long processTime, long dataSize, TCPProcessCmdResults result)
        {
            PorcessCmdMoniter moniter = null;

            if (!ProcessSessionTask.cmdMoniter.TryGetValue(cmdId, out moniter))
            {
                moniter = new PorcessCmdMoniter(cmdId, processTime);
                moniter = ProcessSessionTask.cmdMoniter.GetOrAdd(cmdId, moniter);
            }
            moniter.onProcessNoWait(processTime, dataSize, result);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 命令包接收完毕后的回调事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private bool TCPCmdPacketEvent(object sender)
        {
            TCPInPacket tcpInPacket = sender as TCPInPacket;

            //接收到了完整的命令包
            TCPOutPacket         tcpOutPacket = null;
            TCPProcessCmdResults result       = TCPProcessCmdResults.RESULT_FAILED;

            GameServerClient client = null;

            if (!gameServerClients.TryGetValue(tcpInPacket.CurrentSocket, out client))
            {
                LogManager.WriteLog(LogTypes.Error, string.Format("未建立会话或会话已关闭: {0},{1}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket)));
                return(false);
            }

            //接收到了完整的命令包
            long processBeginTime = TimeUtil.NowEx();

            result = TCPCmdHandler.ProcessCmd(client, DBMgr, tcpOutPacketPool, tcpInPacket.PacketCmdID, tcpInPacket.GetPacketBytes(), tcpInPacket.PacketDataSize, out tcpOutPacket);
            long processTime = (TimeUtil.NowEx() - processBeginTime);

            if (result == TCPProcessCmdResults.RESULT_DATA && null != tcpOutPacket)
            {
                //向对方发送数据
                socketListener.SendData(tcpInPacket.CurrentSocket, tcpOutPacket);
            }
            else if (result == TCPProcessCmdResults.RESULT_FAILED)//解析失败, 直接关闭连接
            {
                LogManager.WriteLog(LogTypes.Error, string.Format("解析并执行命令失败: {0},{1}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket)));
                //socketListener.CloseSocket(tcpInPacket.CurrentSocket);
                return(false);
            }

            lock (cmdMoniter) //锁定命令监控对象
            {
                int cmdID = tcpInPacket.PacketCmdID;
                PorcessCmdMoniter moniter = null;
                if (!cmdMoniter.TryGetValue(cmdID, out moniter))
                {
                    moniter = new PorcessCmdMoniter(cmdID, processTime);
                    cmdMoniter.Add(cmdID, moniter);
                }

                moniter.onProcessNoWait(processTime);
            }
            return(true);
        }
Ejemplo n.º 5
0
        private bool TCPCmdPacketEvent(object sender)
        {
            TCPInPacket      tcpInPacket  = sender as TCPInPacket;
            TCPOutPacket     tcpOutPacket = null;
            GameServerClient client       = null;
            bool             result2;

            if (!this.gameServerClients.TryGetValue(tcpInPacket.CurrentSocket, out client))
            {
                LogManager.WriteLog(LogTypes.Error, string.Format("未建立会话或会话已关闭: {0},{1}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket)), null, true);
                result2 = false;
            }
            else
            {
                TCPManager.CurrentClient = client;
                long processBeginTime       = TimeUtil.NowEx();
                TCPProcessCmdResults result = TCPCmdHandler.ProcessCmd(client, this.DBMgr, this.tcpOutPacketPool, (int)tcpInPacket.PacketCmdID, tcpInPacket.GetPacketBytes(), tcpInPacket.PacketDataSize, out tcpOutPacket);
                long processTime            = TimeUtil.NowEx() - processBeginTime;
                if (result == TCPProcessCmdResults.RESULT_DATA && null != tcpOutPacket)
                {
                    this.socketListener.SendData(tcpInPacket.CurrentSocket, tcpOutPacket);
                }
                else if (result == TCPProcessCmdResults.RESULT_FAILED)
                {
                    LogManager.WriteLog(LogTypes.Error, string.Format("解析并执行命令失败: {0},{1}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket)), null, true);
                    return(false);
                }
                lock (TCPManager.cmdMoniter)
                {
                    int cmdID = (int)tcpInPacket.PacketCmdID;
                    PorcessCmdMoniter moniter = null;
                    if (!TCPManager.cmdMoniter.TryGetValue(cmdID, out moniter))
                    {
                        moniter = new PorcessCmdMoniter(cmdID, processTime);
                        TCPManager.cmdMoniter.Add(cmdID, moniter);
                    }
                    moniter.onProcessNoWait(processTime);
                }
                TCPManager.CurrentClient = null;
                result2 = true;
            }
            return(result2);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 命令包接收完毕后的回调事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private bool TCPCmdPacketEvent(object sender, int doType)
        {
            TCPInPacket tcpInPacket = sender as TCPInPacket;

            if (0 == doType) //正常的登录指令包
            {
                int thisTimeCheckTicks = 0;
                int checkErrorCode     = 0;

                //这里实际上是有一个指令流的拷贝,占用的很零碎的内存,这个是否考虑使用内存池????
                byte[] bytesData = CheckClientDataValid(tcpInPacket.PacketCmdID, tcpInPacket.GetPacketBytes(), tcpInPacket.PacketDataSize, tcpInPacket.LastCheckTicks, out thisTimeCheckTicks, out checkErrorCode);

                if (null != bytesData)
                {
                    tcpInPacket.LastCheckTicks = thisTimeCheckTicks; //记忆此次的心跳数据
//#if false
                    if (UseWorkerPool)
                    {
                        //杰隆的异步处理指令入口代码
                        TCPCmdWrapper wrapper = TCPCmdWrapper.Get(this, tcpInPacket.CurrentSocket, tcpClientPool, tcpRandKey, tcpOutPacketPool, tcpInPacket.PacketCmdID, bytesData, tcpInPacket.PacketDataSize - 1 - 4);

                        TCPSession session = null;
                        if (GameManager.FlagOptimizeLock3)
                        {
                            if (null != tcpInPacket.CurrentSocket)
                            {
                                session = tcpInPacket.CurrentSocket.session;
                            }
                            if (null == session)
                            {
                                LogManager.WriteLog(LogTypes.Error, string.Format("未与客户端建立会话: {0},{1}, 错误码:{2}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket), checkErrorCode));
                                return(false);
                            }
                        }
                        else
                        {
                            lock (tcpSessions)
                            {
                                if (!tcpSessions.TryGetValue(tcpInPacket.CurrentSocket, out session))
                                {
                                    LogManager.WriteLog(LogTypes.Error, string.Format("未与客户端建立会话: {0},{1}, 错误码:{2}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket), checkErrorCode));
                                    return(false);
                                }
                            }
                        }

                        int posCmdNum = 0;
                        session.addTCPCmdWrapper(wrapper, out posCmdNum);
                        if (posCmdNum > 0)
                        {
                            int banSpeedUpMinutes = GameManager.GameConfigMgr.GetGameConfigItemInt("ban-speed-up-minutes2", 10); //加速禁止登陆的时间

                            GameClient client = GameManager.ClientMgr.FindClient(tcpInPacket.CurrentSocket);
                            if (null != client)
                            {
                                GameManager.ClientMgr.NotifyImportantMsg(this.MySocketListener, tcpOutPacketPool, client, StringUtil.substitute(Global.GetLang("本游戏禁止使用加速软件,{0}分钟内将禁止登陆!"), banSpeedUpMinutes), GameInfoTypeIndexes.Error, ShowGameInfoTypes.HintAndBox);
                                BanManager.BanRoleName(Global.FormatRoleName(client, client.ClientData.RoleName), banSpeedUpMinutes);
                            }

                            LogManager.WriteLog(LogTypes.Error, string.Format("通过POSITION指令判断客户端加速: {0}, 指令个数:{1}, 断开连接", Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket), posCmdNum));
                            return(false);
                        }

                        taskExecutor.execute(new ProcessSessionTask(session));
                    }
//#else
                    else
                    {
                        TCPSession session = null;
                        if (GameManager.FlagOptimizeLock3)
                        {
                            if (null != tcpInPacket.CurrentSocket)
                            {
                                session = tcpInPacket.CurrentSocket.session;
                            }
                            if (null == session)
                            {
                                LogManager.WriteLog(LogTypes.Error, string.Format("未与客户端建立会话: {0},{1}, 错误码:{2}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket), checkErrorCode));
                                return(false);
                            }
                        }
                        else
                        {
                            lock (tcpSessions)
                            {
                                if (!tcpSessions.TryGetValue(tcpInPacket.CurrentSocket, out session))
                                {
                                    LogManager.WriteLog(LogTypes.Error, string.Format("未与客户端建立会话: {0},{1}, 错误码:{2}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket), checkErrorCode));
                                    return(false);
                                }
                            }
                        }

                        int posCmdNum = 0;
                        session.CheckCmdNum(tcpInPacket.PacketCmdID, out posCmdNum);
                        if (posCmdNum > 0)
                        {
                            int banSpeedUpMinutes = GameManager.GameConfigMgr.GetGameConfigItemInt("ban-speed-up-minutes2", 10); //加速禁止登陆的时间

                            GameClient client = GameManager.ClientMgr.FindClient(tcpInPacket.CurrentSocket);
                            if (null != client)
                            {
                                GameManager.ClientMgr.NotifyImportantMsg(this.MySocketListener, tcpOutPacketPool, client, StringUtil.substitute(Global.GetLang("本游戏禁止使用加速软件,{0}分钟内将禁止登陆!"), banSpeedUpMinutes), GameInfoTypeIndexes.Error, ShowGameInfoTypes.HintAndBox);
                                BanManager.BanRoleName(Global.FormatRoleName(client, client.ClientData.RoleName), banSpeedUpMinutes);
                            }

                            LogManager.WriteLog(LogTypes.Error, string.Format("通过POSITION指令判断客户端加速: {0}, 指令个数:{1}, 断开连接", Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket), posCmdNum));
                            return(false);
                        }

                        TCPOutPacket         tcpOutPacket     = null;
                        long                 processBeginTime = TimeUtil.NowEx();
                        TCPProcessCmdResults result           = TCPCmdHandler.ProcessCmd(this, tcpInPacket.CurrentSocket, tcpClientPool, tcpRandKey, tcpOutPacketPool, tcpInPacket.PacketCmdID, bytesData, tcpInPacket.PacketDataSize - 1 - 4, out tcpOutPacket);

                        long processTime = (TimeUtil.NowEx() - processBeginTime);
                        if (GameManager.StatisticsMode > 0 || processTime > 50 || result == TCPProcessCmdResults.RESULT_FAILED)
                        {
                            lock (ProcessSessionTask.cmdMoniter) //锁定命令监控对象
                            {
                                int cmdID = tcpInPacket.PacketCmdID;
                                PorcessCmdMoniter moniter = null;
                                if (!ProcessSessionTask.cmdMoniter.TryGetValue(cmdID, out moniter))
                                {
                                    moniter = new PorcessCmdMoniter(cmdID, processTime);
                                    ProcessSessionTask.cmdMoniter.Add(cmdID, moniter);
                                }

                                moniter.onProcessNoWait(processTime, result);
                            }
                        }

                        if (result == TCPProcessCmdResults.RESULT_DATA && null != tcpOutPacket)
                        {
                            //向登陆客户端返回数据
                            socketListener.SendData(tcpInPacket.CurrentSocket, tcpOutPacket);
                        }
                        else if (result == TCPProcessCmdResults.RESULT_FAILED)//解析失败, 直接关闭连接
                        {
                            LogManager.WriteLog(LogTypes.Error, string.Format("解析并执行命令失败: {0},{1}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket)));
                            return(false);
                        }
                    }
//#endif
                }
                else
                {
                    LogManager.WriteLog(LogTypes.Error, string.Format("校验客户端发送的指令数据完整性失败: {0},{1}, 错误码:{2}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket), checkErrorCode));
                    return(false);
                }
            }
            else if (1 == doType) //正常的登录指令包//策略验证请求
            {
                //直接发送策略数据
                DirectSendPolicyFileData(tcpInPacket);
            }
            else
            {
                LogManager.WriteLog(LogTypes.Error, string.Format("解析并执行命令时类型未知: {0},{1}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket)));
                //socketListener.CloseSocket(tcpInPacket.CurrentSocket);
                return(false);
            }

            return(true);
        }