1
This commit is contained in:
parent
fc5ed7f577
commit
351d3c8eda
@ -13,6 +13,28 @@ message SS_CMLogin_CMReConnect_CommonHead
|
|||||||
optional int32 server_id = 1;
|
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
|
message SS_SMRpcError
|
||||||
{
|
{
|
||||||
optional int32 error_code = 1;
|
optional int32 error_code = 1;
|
||||||
|
@ -21,12 +21,11 @@
|
|||||||
#include "ss_msgid.pb.h"
|
#include "ss_msgid.pb.h"
|
||||||
#include "ss_proto.pb.h"
|
#include "ss_proto.pb.h"
|
||||||
|
|
||||||
|
#include "target_conn.h"
|
||||||
|
#include "target_conn_mgr.h"
|
||||||
#if MASTER_MODE
|
#if MASTER_MODE
|
||||||
#include "mastersvr.h"
|
#include "mastersvr.h"
|
||||||
#include "mastersvrmgr.h"
|
#include "mastersvrmgr.h"
|
||||||
#else
|
|
||||||
#include "target_conn.h"
|
|
||||||
#include "target_conn_mgr.h"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct MsgNode
|
struct MsgNode
|
||||||
@ -98,11 +97,8 @@ void App::Init(int argc, char* argv[])
|
|||||||
GCListener::Instance()->Init();
|
GCListener::Instance()->Init();
|
||||||
uuid.SetMachineId(instance_id);
|
uuid.SetMachineId(instance_id);
|
||||||
GameClientMgr::Instance()->Init();
|
GameClientMgr::Instance()->Init();
|
||||||
#if MASTER_MODE
|
|
||||||
MasterSvrMgr::Instance()->Init();
|
MasterSvrMgr::Instance()->Init();
|
||||||
#else
|
|
||||||
TargetConnMgr::Instance()->Init();
|
TargetConnMgr::Instance()->Init();
|
||||||
#endif
|
|
||||||
|
|
||||||
a8::UdpLog::Instance()->Info("masterserver starting instance_id:%d pid:%d", {instance_id, getpid()});
|
a8::UdpLog::Instance()->Info("masterserver starting instance_id:%d pid:%d", {instance_id, getpid()});
|
||||||
{
|
{
|
||||||
@ -124,11 +120,8 @@ void App::UnInit()
|
|||||||
if (terminated) {
|
if (terminated) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#if MASTER_MODE
|
|
||||||
MasterSvrMgr::Instance()->UnInit();
|
MasterSvrMgr::Instance()->UnInit();
|
||||||
#else
|
|
||||||
TargetConnMgr::Instance()->UnInit();
|
TargetConnMgr::Instance()->UnInit();
|
||||||
#endif
|
|
||||||
GameClientMgr::Instance()->UnInit();
|
GameClientMgr::Instance()->UnInit();
|
||||||
GCListener::Instance()->UnInit();
|
GCListener::Instance()->UnInit();
|
||||||
JsonDataMgr::Instance()->UnInit();
|
JsonDataMgr::Instance()->UnInit();
|
||||||
@ -346,6 +339,23 @@ void App::ProcessClientMsg(f8::MsgHdr& hdr)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#if MASTER_MODE
|
#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
|
#else
|
||||||
TargetConn* conn = nullptr;
|
TargetConn* conn = nullptr;
|
||||||
if (hdr.msgid == ss::_SS_CMLogin || hdr.msgid == ss::_SS_CMReConnect) {
|
if (hdr.msgid == ss::_SS_CMLogin || hdr.msgid == ss::_SS_CMReConnect) {
|
||||||
@ -407,6 +417,7 @@ void App::ProcessIMMsg()
|
|||||||
case IM_ClientSocketDisconnect:
|
case IM_ClientSocketDisconnect:
|
||||||
{
|
{
|
||||||
GameClientMgr::Instance()->OnClientDisconnect(pdelnode->params);
|
GameClientMgr::Instance()->OnClientDisconnect(pdelnode->params);
|
||||||
|
MasterSvrMgr::Instance()->OnClientDisconnect(pdelnode->params);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case IM_TargetConnDisconnect:
|
case IM_TargetConnDisconnect:
|
||||||
|
@ -1,11 +1,18 @@
|
|||||||
#include "precompile.h"
|
#include "precompile.h"
|
||||||
|
|
||||||
|
#include <a8/openssl.h>
|
||||||
|
|
||||||
#include "mastersvrmgr.h"
|
#include "mastersvrmgr.h"
|
||||||
#include "mastersvr.h"
|
#include "mastersvr.h"
|
||||||
#include "jsondatamgr.h"
|
#include "jsondatamgr.h"
|
||||||
|
#include "ss_proto.pb.h"
|
||||||
|
|
||||||
|
#include "framework/cpp/netmsghandler.h"
|
||||||
|
|
||||||
void MasterSvrMgr::Init()
|
void MasterSvrMgr::Init()
|
||||||
{
|
{
|
||||||
|
curr_context_id_ = a8::MakeInt64(0, time(nullptr) + 1000 * 60 * 10);
|
||||||
|
|
||||||
auto master_svr_cluster_conf = JsonDataMgr::Instance()->GetMasterServerClusterConf();
|
auto master_svr_cluster_conf = JsonDataMgr::Instance()->GetMasterServerClusterConf();
|
||||||
for (int i = 0; i < master_svr_cluster_conf->Size(); ++i) {
|
for (int i = 0; i < master_svr_cluster_conf->Size(); ++i) {
|
||||||
auto master_svr_conf = master_svr_cluster_conf->At(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);
|
auto itr = mastersvr_hash_.find(instance_id);
|
||||||
return itr != mastersvr_hash_.end() ? itr->second : nullptr;
|
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;
|
||||||
|
}
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
namespace f8
|
||||||
|
{
|
||||||
|
struct MsgHdr;
|
||||||
|
}
|
||||||
|
|
||||||
class MasterSvr;
|
class MasterSvr;
|
||||||
class MasterSvrMgr : public a8::Singleton<MasterSvrMgr>
|
class MasterSvrMgr : public a8::Singleton<MasterSvrMgr>
|
||||||
{
|
{
|
||||||
@ -12,8 +17,18 @@ class MasterSvrMgr : public a8::Singleton<MasterSvrMgr>
|
|||||||
void Init();
|
void Init();
|
||||||
void UnInit();
|
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);
|
MasterSvr* GetConnByInstanceId(int instance_id);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
long long curr_context_id_ = 0;
|
||||||
std::map<int, MasterSvr*> mastersvr_hash_;
|
std::map<int, MasterSvr*> mastersvr_hash_;
|
||||||
|
std::map<int, long long> pending_socket_hash_;
|
||||||
|
std::map<long long, f8::MsgHdr*> pending_request_hash_;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
2
third_party/a8engine
vendored
2
third_party/a8engine
vendored
@ -1 +1 @@
|
|||||||
Subproject commit bc1e1e002cdfbbac07abdf14151afb0bbd8025a8
|
Subproject commit fc99a3615db9aabc1a77489e069a4e6af26d50d5
|
2
third_party/framework
vendored
2
third_party/framework
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 18133846b6672634219c080064b7a24720d17588
|
Subproject commit fd72ea56059dc8545920e33d436dad5a1d3700fb
|
Loading…
x
Reference in New Issue
Block a user