89 lines
2.2 KiB
C++
89 lines
2.2 KiB
C++
#include "precompile.h"
|
|
|
|
#include <a8/mutable_xobject.h>
|
|
|
|
#include "gsmgr.h"
|
|
#include "GGListener.h"
|
|
|
|
void GSMgr::Init()
|
|
{
|
|
|
|
}
|
|
|
|
void GSMgr::UnInit()
|
|
{
|
|
|
|
}
|
|
|
|
void GSMgr::_SS_WSP_RequestTargetServer(f8::MsgHdr& hdr, const ss::SS_WSP_RequestTargetServer& msg)
|
|
{
|
|
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 (node) {
|
|
team_hash_[msg.team_id()] = node;
|
|
} else {
|
|
respmsg.set_error_code(1);
|
|
respmsg.set_error_msg("无法分配节点");
|
|
}
|
|
}
|
|
GGListener::Instance()->SendProxyMsg(hdr.socket_handle, respmsg);
|
|
}
|
|
|
|
void GSMgr::___GSReport(f8::JsonHttpRequest* request)
|
|
{
|
|
std::string ip = request->request.Get("ip");
|
|
int port = request->request.Get("port");
|
|
int online_num = request->request.Get("online_num");
|
|
int room_num = request->request.Get("room_num");
|
|
int instance_id = request->request.Get("instance_id");
|
|
int node_id = request->request.Get("node_id");
|
|
std::string key = ip + a8::XValue(port).GetString();
|
|
|
|
auto itr = node_key_hash_.find(key);
|
|
if (itr != node_key_hash_.end()) {
|
|
itr->second.online_num = online_num;
|
|
itr->second.room_num = room_num;
|
|
} else {
|
|
GSNode gs;
|
|
gs.node_id = node_id;
|
|
gs.instance_id = instance_id;
|
|
gs.online_num = online_num;
|
|
gs.room_num = room_num;
|
|
gs.ip = ip;
|
|
gs.port = port;
|
|
node_key_hash_[key] = gs;
|
|
}
|
|
|
|
request->resp_xobj->SetVal("errcode", 0);
|
|
request->resp_xobj->SetVal("errmsg", "");
|
|
}
|
|
|
|
GSNode* GSMgr::GetNodeByTeamId(const std::string& team_id)
|
|
{
|
|
auto itr = team_hash_.find(team_id);
|
|
return itr != team_hash_.end() ? itr->second : nullptr;
|
|
}
|
|
|
|
GSNode* GSMgr::AllocNode()
|
|
{
|
|
std::array<GSNode*, 5> nodes = {};
|
|
size_t i = 0;
|
|
for (auto& pair : node_desc_hash_) {
|
|
nodes[i] = &pair.second;
|
|
++i;
|
|
if (i >= nodes.size()) {
|
|
break;
|
|
}
|
|
}
|
|
if (i <= 0) {
|
|
return nullptr;
|
|
}
|
|
return nodes[rand() % i];
|
|
}
|