diff --git a/server/masterserver/handlermgr.cc b/server/masterserver/handlermgr.cc index 876aaf5..85a58a5 100644 --- a/server/masterserver/handlermgr.cc +++ b/server/masterserver/handlermgr.cc @@ -48,6 +48,7 @@ void HandlerMgr::RegisterNetMsgHandlers() RegisterNetMsgHandler(&ggmsghandler, &GGListener::_SS_Ping); RegisterNetMsgHandler(&immsghandler, &IMSMgr::_SS_Ping); + RegisterNetMsgHandler(&immsghandler, &SvrMgr::_SS_IM_ReportServerInfo); RegisterNetMsgHandler(&immsghandler, &CacheMgr::_SS_IM_UserOnline); RegisterNetMsgHandler(&immsghandler, &CacheMgr::_SS_IM_UserOffline); RegisterNetMsgHandler(&immsghandler, &CacheMgr::_SS_IM_PullUserList); diff --git a/server/masterserver/svrmgr.cc b/server/masterserver/svrmgr.cc index aae719b..cc4e9a6 100644 --- a/server/masterserver/svrmgr.cc +++ b/server/masterserver/svrmgr.cc @@ -6,6 +6,7 @@ #include "svrmgr.h" #include "app.h" #include "GGListener.h" +#include "IMListener.h" void SvrMgr::Init() { @@ -38,6 +39,39 @@ void SvrMgr::_SS_WSP_RequestTargetServer(f8::MsgHdr& hdr, const ss::SS_WSP_Reque GGListener::Instance()->SendMsg(hdr.socket_handle, respmsg); } +void SvrMgr::_SS_IM_ReportServerInfo(f8::MsgHdr& hdr, const ss::SS_IM_ReportServerInfo& msg) +{ + std::string key = msg.ip() + ":" + a8::XValue(msg.port()).GetString(); + + auto itr = node_key_hash_.find(key); + if (itr != node_key_hash_.end()) { + if (itr->second.online_num != msg.online_num() || + itr->second.servicing != msg.servicing() + ) { + itr->second.online_num = msg.online_num(); + itr->second.servicing = msg.servicing(); + RearrangeNode(); + } + itr->second.last_active_tick = a8::XGetTickCount(); + } else { + SvrNode svr; + svr.key = key; + svr.node_idx = App::Instance()->NewUuid(); + svr.instance_id = msg.instance_id(); + svr.online_num = msg.online_num(); + svr.ip = msg.ip(); + svr.port = msg.port(); + svr.servicing = msg.servicing(); + svr.last_active_tick = a8::XGetTickCount(); + node_key_hash_[key] = svr; + node_sorted_list_.push_back(&node_key_hash_[key]); + RearrangeNode(); + } + + ss::SS_MS_ConfirmedServerInfo respmsg; + IMListener::Instance()->SendMsg(hdr.socket_handle, respmsg); +} + void SvrMgr::___GSList(f8::JsonHttpRequest* request) { { @@ -45,7 +79,6 @@ void SvrMgr::___GSList(f8::JsonHttpRequest* request) for (auto& pair : node_key_hash_) { a8::MutableXObject* node = a8::MutableXObject::NewObject(); - node->SetVal("node_id", pair.second.node_id); node->SetVal("instance_id", pair.second.instance_id); node->SetVal("online_num", pair.second.online_num); node->SetVal("ip", pair.second.ip); @@ -65,7 +98,6 @@ void SvrMgr::___GSList(f8::JsonHttpRequest* request) for (SvrNode* gs_node : node_sorted_list_) { a8::MutableXObject* node = a8::MutableXObject::NewObject(); - node->SetVal("node_id", gs_node->node_id); node->SetVal("instance_id", gs_node->instance_id); node->SetVal("online_num", gs_node->online_num); node->SetVal("ip", gs_node->ip); @@ -135,7 +167,7 @@ void SvrMgr::ClearTimeOutNode() { std::vector time_out_nodes; for (auto& pair : node_key_hash_) { - if (a8::XGetTickCount() - pair.second.last_active_tick > 1000 * 5) { + if (a8::XGetTickCount() - pair.second.last_active_tick > 1000 * 3) { time_out_nodes.push_back(&pair.second); } } diff --git a/server/masterserver/svrmgr.h b/server/masterserver/svrmgr.h index 859b51a..031402b 100644 --- a/server/masterserver/svrmgr.h +++ b/server/masterserver/svrmgr.h @@ -6,7 +6,6 @@ struct SvrNode { std::string key; long long node_idx = 0; - int node_id = 0; int instance_id = 0; int online_num = 0; std::string ip; @@ -30,6 +29,7 @@ class SvrMgr : public a8::Singleton void UnInit(); void _SS_WSP_RequestTargetServer(f8::MsgHdr& hdr, const ss::SS_WSP_RequestTargetServer& msg); + void _SS_IM_ReportServerInfo(f8::MsgHdr& hdr, const ss::SS_IM_ReportServerInfo& msg); void ___GSList(f8::JsonHttpRequest* request); diff --git a/server/tools/protobuild/ss_proto.proto b/server/tools/protobuild/ss_proto.proto index d23242f..d9ae877 100755 --- a/server/tools/protobuild/ss_proto.proto +++ b/server/tools/protobuild/ss_proto.proto @@ -132,6 +132,21 @@ message SS_MS_LoadGroup optional int64 group_id = 1; } +message SS_IM_ReportServerInfo +{ + optional int32 instance_id = 1; + optional int32 online_num = 2; + optional string ip = 3; + optional int32 port = 4; + optional bool servicing = 5; +} + +message SS_MS_ConfirmedServerInfo +{ + optional int32 errcode = 1; + optional string errmsg = 2; +} + message SS_IM_UserOnline { optional string account_id = 1;