/// <summary> /// BS通知有客户端登陆 /// </summary> private ErrorCode MsgOneUserLoginTokenHandler(byte[] data, int offset, int size, int msgID) { BSToGS.OneUserLoginToken reportAllClientInf = new BSToGS.OneUserLoginToken(); reportAllClientInf.MergeFrom(data, offset, size); GS.instance.gsStorage.AddUserToken(reportAllClientInf.UserName, reportAllClientInf.Token); //回应BS客户端家已经登陆GS this.owner.SendMsgToSession(this.id, reportAllClientInf, ( int )GSToBS.MsgID.EMsgToBsfromGsOneUserLoginTokenRet); return(ErrorCode.Success); }
/// <summary> /// LS回应BS的检查登陆合法性 /// </summary> private ErrorCode MsgUserLogin(byte[] data, int offset, int size, int msgID) { GCToBS.OneClinetLogin userLoginInfo = new GCToBS.OneClinetLogin(); userLoginInfo.MergeFrom(data, offset, size); //发送第3消息:验证登陆是否成功,如果成功,请求分配GS给客户端 BSToGC.ClinetLoginCheckRet msg = new BSToGC.ClinetLoginCheckRet(); msg.LoginSuccess = userLoginInfo.LoginSuccess; this.owner.SendMsgToSession(userLoginInfo.Nsid, msg, ( int )BSToGC.MsgID.EMsgToGcfromBsOneClinetLoginCheckRet); Logger.Log($"user({userLoginInfo.Uin})({userLoginInfo.Sessionid})({userLoginInfo.Nsid}) ask login ret"); if (userLoginInfo.LoginSuccess == 0) { this.owner.DisconnectOne(userLoginInfo.Nsid); } else { //找到最空闲的网关服务器 OneGsInfo littleOne = null; foreach (KeyValuePair <int, OneGsInfo> kv in BS.instance.bsConfig.allGsInfo) { OneGsInfo theGsInfo = kv.Value; if (theGsInfo.gs_isLost) { continue; } if (littleOne == null || theGsInfo.gs_gc_count < littleOne.gs_gc_count) { littleOne = theGsInfo; } } if (littleOne == null) { return(ErrorCode.GSNotFound); } ++littleOne.gs_gc_count; //仅仅作为缓存,GS会定时汇报服务器的状态 //这条消息的路由:BS-GS-BS-GC BSToGS.OneUserLoginToken oneUserLoginToken = new BSToGS.OneUserLoginToken { Gateclient = ( int )userLoginInfo.Nsid, Token = GuidHash.GetString(), UserName = userLoginInfo.Uin, //这里ip和port最终会到达GC Ip = littleOne.gs_IpExport, Port = littleOne.gs_Port }; //通知网关服务器有客户端登陆 this.owner.SendMsgToSession(littleOne.gs_nets, oneUserLoginToken, ( int )BSToGS.MsgID.EMsgToGsfromBsOneUserLoginToken); } return(ErrorCode.Success); }
/// <summary> /// GS回应客户端已登陆 /// </summary> private ErrorCode MsgHandleOneUserLoginTokenRet(byte[] data, int offset, int size, int msgID) { if (!BS.instance.bsConfig.allGsInfo.TryGetValue(this.logicID, out OneGsInfo _)) { Logger.Error("can not find GS for loginer."); return(ErrorCode.GSNotFound); } BSToGS.OneUserLoginToken msg = new BSToGS.OneUserLoginToken(); msg.MergeFrom(data, offset, size); BSToGC.AskGateAddressRet msgSend = new BSToGC.AskGateAddressRet { UserName = msg.UserName, Token = msg.Token, //这是网关的地址 Ip = msg.Ip, Port = msg.Port }; //通知客户端GS的地址 this.owner.SendMsgToSession(( uint )msg.Gateclient, msgSend, ( int )BSToGC.MsgID.EMsgToGcfromBsAskGateAddressRet); return(ErrorCode.Success); }