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