diff --git a/server/masterserver/gsmgr.cc b/server/masterserver/gsmgr.cc index 947f053..3e359aa 100644 --- a/server/masterserver/gsmgr.cc +++ b/server/masterserver/gsmgr.cc @@ -26,20 +26,31 @@ void GSMgr::_SS_WSP_RequestTargetServer(f8::MsgHdr& hdr, const ss::SS_WSP_Reques { ss::SS_MS_ResponseTargetServer respmsg; respmsg.set_context_id(msg.context_id()); - GSNode* node = GetNodeByTeamId(msg.team_id()); - if (node) { - respmsg.set_host(node->ip); - respmsg.set_port(node->port); - } else { - node = AllocNode(); + if (msg.is_reconnect()) { + GSNode* node = GetNodeByNodeKey(msg.server_info()); if (node) { respmsg.set_host(node->ip); respmsg.set_port(node->port); - team_hash_[msg.team_id()] = node; } else { respmsg.set_error_code(1); respmsg.set_error_msg("无法分配节点"); } + } else { + GSNode* node = GetNodeByTeamId(msg.team_id()); + if (node) { + respmsg.set_host(node->ip); + respmsg.set_port(node->port); + } else { + node = AllocNode(); + if (node) { + respmsg.set_host(node->ip); + respmsg.set_port(node->port); + team_hash_[msg.team_id()] = node; + } else { + respmsg.set_error_code(1); + respmsg.set_error_msg("无法分配节点"); + } + } } GGListener::Instance()->SendMsg(hdr.socket_handle, respmsg); } @@ -151,6 +162,12 @@ GSNode* GSMgr::GetNodeByTeamId(const std::string& team_id) return itr != team_hash_.end() ? itr->second : nullptr; } +GSNode* GSMgr::GetNodeByNodeKey(const std::string& node_key) +{ + auto itr = node_key_hash_.find(node_key); + return itr != node_key_hash_.end() ? &itr->second : nullptr; +} + GSNode* GSMgr::AllocNode() { if (node_sorted_list_.empty()) { diff --git a/server/masterserver/gsmgr.h b/server/masterserver/gsmgr.h index 5ad7e40..13a8348 100644 --- a/server/masterserver/gsmgr.h +++ b/server/masterserver/gsmgr.h @@ -39,6 +39,7 @@ class GSMgr : public a8::Singleton private: GSNode* GetNodeByTeamId(const std::string& team_id); + GSNode* GetNodeByNodeKey(const std::string& node_key); GSNode* AllocNode(); void RearrangeNode(); void ClearTimeOutNode(); diff --git a/server/tools/protobuild/ss_proto.proto b/server/tools/protobuild/ss_proto.proto index be04905..aecbd44 100755 --- a/server/tools/protobuild/ss_proto.proto +++ b/server/tools/protobuild/ss_proto.proto @@ -19,6 +19,8 @@ message SS_WSP_RequestTargetServer optional int64 context_id = 1; optional string account_id = 2; optional string team_id = 3; + optional string server_info = 4; + optional int32 is_reconnect = 5; } message SS_MS_ResponseTargetServer