This commit is contained in:
aozhiwei 2019-05-15 17:38:28 +08:00
parent fc5ed7f577
commit 351d3c8eda
6 changed files with 111 additions and 11 deletions

View File

@ -13,6 +13,28 @@ message SS_CMLogin_CMReConnect_CommonHead
optional int32 server_id = 1;
}
message SS_CMLogin_CMReConnect_CommonHead2
{
optional int32 server_id = 1;
optional string team_uuid = 2;
}
message SS_WSP_RequestTargetServer
{
optional int64 context_id = 1;
optional string account_id = 2;
optional string team_id = 3;
}
message SS_MS_ResponseTargetServer
{
optional int32 error_code = 1;
optional string error_msg = 2;
optional int64 context_id = 3;
optional string host = 4;
optional int32 port = 5;
}
message SS_SMRpcError
{
optional int32 error_code = 1;

View File

@ -21,12 +21,11 @@
#include "ss_msgid.pb.h"
#include "ss_proto.pb.h"
#include "target_conn.h"
#include "target_conn_mgr.h"
#if MASTER_MODE
#include "mastersvr.h"
#include "mastersvrmgr.h"
#else
#include "target_conn.h"
#include "target_conn_mgr.h"
#endif
struct MsgNode
@ -98,11 +97,8 @@ void App::Init(int argc, char* argv[])
GCListener::Instance()->Init();
uuid.SetMachineId(instance_id);
GameClientMgr::Instance()->Init();
#if MASTER_MODE
MasterSvrMgr::Instance()->Init();
#else
TargetConnMgr::Instance()->Init();
#endif
a8::UdpLog::Instance()->Info("masterserver starting instance_id:%d pid:%d", {instance_id, getpid()});
{
@ -124,11 +120,8 @@ void App::UnInit()
if (terminated) {
return;
}
#if MASTER_MODE
MasterSvrMgr::Instance()->UnInit();
#else
TargetConnMgr::Instance()->UnInit();
#endif
GameClientMgr::Instance()->UnInit();
GCListener::Instance()->UnInit();
JsonDataMgr::Instance()->UnInit();
@ -346,6 +339,23 @@ void App::ProcessClientMsg(f8::MsgHdr& hdr)
return;
}
#if MASTER_MODE
TargetConn* conn = nullptr;
if (hdr.msgid == ss::_SS_CMLogin || hdr.msgid == ss::_SS_CMReConnect) {
ss::SS_CMLogin_CMReConnect_CommonHead2 msg;
bool ok = msg.ParseFromArray(hdr.buf + hdr.offset, hdr.buflen - hdr.offset);
if (ok) {
MasterSvrMgr::Instance()->RequestTargetServer(hdr, msg.team_uuid());
}
return;
} else {
GameClient* client = GameClientMgr::Instance()->GetGameClientBySocket(hdr.socket_handle);
if (client) {
conn = client->conn;
}
}
if (conn) {
conn->ForwardClientMsg(hdr);
}
#else
TargetConn* conn = nullptr;
if (hdr.msgid == ss::_SS_CMLogin || hdr.msgid == ss::_SS_CMReConnect) {
@ -407,6 +417,7 @@ void App::ProcessIMMsg()
case IM_ClientSocketDisconnect:
{
GameClientMgr::Instance()->OnClientDisconnect(pdelnode->params);
MasterSvrMgr::Instance()->OnClientDisconnect(pdelnode->params);
}
break;
case IM_TargetConnDisconnect:

View File

@ -1,11 +1,18 @@
#include "precompile.h"
#include <a8/openssl.h>
#include "mastersvrmgr.h"
#include "mastersvr.h"
#include "jsondatamgr.h"
#include "ss_proto.pb.h"
#include "framework/cpp/netmsghandler.h"
void MasterSvrMgr::Init()
{
curr_context_id_ = a8::MakeInt64(0, time(nullptr) + 1000 * 60 * 10);
auto master_svr_cluster_conf = JsonDataMgr::Instance()->GetMasterServerClusterConf();
for (int i = 0; i < master_svr_cluster_conf->Size(); ++i) {
auto master_svr_conf = master_svr_cluster_conf->At(i);
@ -30,3 +37,48 @@ MasterSvr* MasterSvrMgr::GetConnByInstanceId(int instance_id)
auto itr = mastersvr_hash_.find(instance_id);
return itr != mastersvr_hash_.end() ? itr->second : nullptr;
}
void MasterSvrMgr::RequestTargetServer(f8::MsgHdr& hdr, const std::string& team_id)
{
if (GetConextId(hdr.socket_handle) == 0) {
return;
}
unsigned int code = a8::openssl::Crc32((unsigned char*)team_id.data(), team_id.size());
MasterSvr* svr = GetConnByInstanceId(code % mastersvr_hash_.size() + 1);
if (svr) {
++curr_context_id_;
ss::SS_WSP_RequestTargetServer msg;
msg.set_context_id(curr_context_id_);
msg.set_team_id(team_id);
svr->SendMsg(msg);
pending_socket_hash_[hdr.socket_handle] = curr_context_id_;
}
}
void MasterSvrMgr::OnClientDisconnect(a8::XParams& param)
{
long long conext_id = GetConextId(param.sender);
if (conext_id != 0) {
f8::MsgHdr* hdr = GetHdr(conext_id);
if (hdr) {
if (hdr->buf) {
free((char*)hdr->buf);
}
delete hdr;
pending_request_hash_.erase(conext_id);
}
pending_socket_hash_.erase(param.sender);
}
}
long long MasterSvrMgr::GetConextId(int socket_handle)
{
auto itr = pending_socket_hash_.find(socket_handle);
return itr != pending_socket_hash_.end() ? itr->second : 0;
}
f8::MsgHdr* MasterSvrMgr::GetHdr(long long conext_id)
{
auto itr = pending_request_hash_.find(conext_id);
return itr != pending_request_hash_.end() ? itr->second : nullptr;
}

View File

@ -1,5 +1,10 @@
#pragma once
namespace f8
{
struct MsgHdr;
}
class MasterSvr;
class MasterSvrMgr : public a8::Singleton<MasterSvrMgr>
{
@ -12,8 +17,18 @@ class MasterSvrMgr : public a8::Singleton<MasterSvrMgr>
void Init();
void UnInit();
void RequestTargetServer(f8::MsgHdr& hdr, const std::string& team_id);
void OnClientDisconnect(a8::XParams& param);
private:
long long GetConextId(int socket_handle);
f8::MsgHdr* GetHdr(long long conext_id);
MasterSvr* GetConnByInstanceId(int instance_id);
private:
long long curr_context_id_ = 0;
std::map<int, MasterSvr*> mastersvr_hash_;
std::map<int, long long> pending_socket_hash_;
std::map<long long, f8::MsgHdr*> pending_request_hash_;
};

@ -1 +1 @@
Subproject commit bc1e1e002cdfbbac07abdf14151afb0bbd8025a8
Subproject commit fc99a3615db9aabc1a77489e069a4e6af26d50d5

@ -1 +1 @@
Subproject commit 18133846b6672634219c080064b7a24720d17588
Subproject commit fd72ea56059dc8545920e33d436dad5a1d3700fb