Пример #1
0
 private LoginMachine ProcessLoginSession(LoginMachine s)
 {
     while (s.State != LoginMachine.StateCode.Finish)
     {
         if (s.State == LoginMachine.StateCode.Initiate)
         {
             s.Run();
         }
         else if (s.State == LoginMachine.StateCode.Next)
         {
             LoginMachine ns = LoginMachines.Create(s.NextMachine, s.NextParams);
             ns.Account  = s.Account;
             ns.NodeName = s.NodeName;
             ns.Session  = s.Session;
             s           = ns;
         }
         else if (s.State == LoginMachine.StateCode.Pending)
         {
             if (s.Expired)
             {
                 LogSys.Log(LOG_TYPE.ERROR, "LoginSession for account {0} is expired at phase {1}", s.Account, s.GetType().Name);
             }
             break;
         }
     }
     return(s);
 }
Пример #2
0
        /// <summary>
        /// 用户登陆, 开启一个新的登陆流程
        /// </summary>
        /// <param name="msg">登陆消息</param>
        /// <param name="handle"></param>
        /// <param name="session"></param>
        private void OnLogin(JsonMessage msg, uint handle, uint session)
        {
            StringBuilder stringBuilder = new StringBuilder(1024);
            uint          size          = (uint)stringBuilder.Capacity;

            SvrAPI.QueryServiceNameByHandle(handle, stringBuilder, ref size);
            string node_name = stringBuilder.ToString();

            var            login = msg as JsonMessageLogin;
            Authentication auth  = new Authentication(login.m_Passwd, login.m_Ip, login.m_MacAddr)
            {
                Account  = login.m_Account,
                NodeName = node_name,
                Session  = session,
            };

            int index = login_sessions_.BinarySearch(auth, lmc_);

            if (index < 0)
            {
                LogSys.Log(LOG_TYPE.INFO, ConsoleColor.Green, "LoginAccount {0} is initiating a login", login.m_Account);

                LoginMachine s = ProcessLoginSession(auth);
                if (auth.State != LoginMachine.StateCode.Finish)
                {
                    login_sessions_.Insert(~index, s);
                }
            }
            else
            {
                LogSys.Log(LOG_TYPE.WARN, "Ignore multiple login request for login account {0}", login.m_Account);
                SendLoginResult(login.m_Account, node_name, session, LoginResult.LOGIN_FAIL);
            }
        }