1
This commit is contained in:
parent
1e555756fa
commit
559a50f82c
@ -417,7 +417,7 @@ void App::ProcessIMMsg()
|
||||
case IM_ClientSocketDisconnect:
|
||||
{
|
||||
GameClientMgr::Instance()->OnClientDisconnect(pdelnode->params);
|
||||
MasterSvrMgr::Instance()->OnClientDisconnect(pdelnode->params);
|
||||
MasterSvrMgr::Instance()->RemoveRequest(pdelnode->params.param1, pdelnode->params.sender);
|
||||
}
|
||||
break;
|
||||
case IM_TargetConnConnect:
|
||||
|
@ -15,6 +15,7 @@ enum InnerMesssage_e
|
||||
IM_TargetConnDisconnect,
|
||||
IM_MasterSvrDisconnect,
|
||||
IM_TargetConnConnect,
|
||||
IM_RequestTargetServerTimeout
|
||||
};
|
||||
|
||||
//网络处理对象
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include "precompile.h"
|
||||
|
||||
#include <a8/openssl.h>
|
||||
#include <a8/timer.h>
|
||||
|
||||
#include "mastersvrmgr.h"
|
||||
#include "mastersvr.h"
|
||||
@ -8,6 +9,7 @@
|
||||
#include "ss_proto.pb.h"
|
||||
#include "target_conn.h"
|
||||
#include "target_conn_mgr.h"
|
||||
#include "app.h"
|
||||
|
||||
#include "framework/cpp/netmsghandler.h"
|
||||
|
||||
@ -36,7 +38,7 @@ void MasterSvrMgr::UnInit()
|
||||
|
||||
void MasterSvrMgr::_SS_MS_ResponseTargetServer(f8::MsgHdr& hdr, const ss::SS_MS_ResponseTargetServer& msg)
|
||||
{
|
||||
f8::MsgHdr* context_hdr = GetHdr(msg.context_id());
|
||||
f8::MsgHdr* context_hdr = GetHdrByContextId(msg.context_id());
|
||||
if (context_hdr) {
|
||||
if (msg.error_code() == 0) {
|
||||
std::string key = msg.host() + ":" + a8::XValue(msg.port()).GetString();
|
||||
@ -45,13 +47,7 @@ void MasterSvrMgr::_SS_MS_ResponseTargetServer(f8::MsgHdr& hdr, const ss::SS_MS_
|
||||
conn->ForwardClientMsg(hdr);
|
||||
}
|
||||
}
|
||||
|
||||
pending_request_hash_.erase(msg.context_id());
|
||||
pending_socket_hash_.erase(hdr.socket_handle);
|
||||
if (context_hdr->buf) {
|
||||
free((char*)context_hdr->buf);
|
||||
}
|
||||
free(context_hdr);
|
||||
RemoveRequest(context_hdr->socket_handle, msg.context_id());
|
||||
}
|
||||
}
|
||||
|
||||
@ -63,47 +59,65 @@ MasterSvr* MasterSvrMgr::GetConnById(int instance_id)
|
||||
|
||||
void MasterSvrMgr::RequestTargetServer(f8::MsgHdr& hdr, const std::string& team_id)
|
||||
{
|
||||
if (GetConextId(hdr.socket_handle) == 0) {
|
||||
if (GetContextIdBySocket(hdr.socket_handle) == 0) {
|
||||
return;
|
||||
}
|
||||
unsigned int code = a8::openssl::Crc32((unsigned char*)team_id.data(), team_id.size());
|
||||
MasterSvr* svr = GetConnById(code % mastersvr_hash_.size() + 1);
|
||||
if (svr) {
|
||||
++curr_context_id_;
|
||||
a8::TimerAttacher* timer_attacher = new a8::TimerAttacher();
|
||||
f8::MsgHdr* new_hdr = hdr.Clone();
|
||||
new_hdr->user_data = timer_attacher;
|
||||
|
||||
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_;
|
||||
assert(pending_request_hash_.find(curr_context_id_) == pending_request_hash_.end());
|
||||
pending_request_hash_[curr_context_id_] = hdr.Clone();
|
||||
pending_request_hash_[curr_context_id_] = new_hdr;
|
||||
a8::Timer::Instance()->AddDeadLineTimerAndAttach(1000 * 10,
|
||||
a8::XParams()
|
||||
.SetSender(curr_context_id_)
|
||||
.SetParam1(hdr.socket_handle),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
App::Instance()->AddIMMsg(IM_RequestTargetServerTimeout,
|
||||
a8::XParams()
|
||||
.SetSender(param.sender)
|
||||
.SetParam1(param.param1));
|
||||
},
|
||||
&timer_attacher->timer_list_);
|
||||
}
|
||||
}
|
||||
|
||||
void MasterSvrMgr::OnClientDisconnect(a8::XParams& param)
|
||||
void MasterSvrMgr::RemoveRequest(int socket_handle, long long context_id)
|
||||
{
|
||||
long long conext_id = GetConextId(param.sender);
|
||||
if (conext_id != 0) {
|
||||
f8::MsgHdr* hdr = GetHdr(conext_id);
|
||||
if (context_id == GetContextIdBySocket(socket_handle)) {
|
||||
f8::MsgHdr* hdr = GetHdrByContextId(context_id);
|
||||
if (hdr) {
|
||||
a8::TimerAttacher* timer_attacher = (a8::TimerAttacher*)hdr->user_data;
|
||||
delete timer_attacher;
|
||||
if (hdr->buf) {
|
||||
free((char*)hdr->buf);
|
||||
}
|
||||
free(hdr);
|
||||
pending_request_hash_.erase(conext_id);
|
||||
pending_request_hash_.erase(context_id);
|
||||
}
|
||||
pending_socket_hash_.erase(param.sender);
|
||||
pending_socket_hash_.erase(socket_handle);
|
||||
}
|
||||
}
|
||||
|
||||
long long MasterSvrMgr::GetConextId(int socket_handle)
|
||||
long long MasterSvrMgr::GetContextIdBySocket(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)
|
||||
f8::MsgHdr* MasterSvrMgr::GetHdrByContextId(long long context_id)
|
||||
{
|
||||
auto itr = pending_request_hash_.find(conext_id);
|
||||
auto itr = pending_request_hash_.find(context_id);
|
||||
return itr != pending_request_hash_.end() ? itr->second : nullptr;
|
||||
}
|
||||
|
@ -27,11 +27,11 @@ class MasterSvrMgr : public a8::Singleton<MasterSvrMgr>
|
||||
|
||||
void _SS_MS_ResponseTargetServer(f8::MsgHdr& hdr, const ss::SS_MS_ResponseTargetServer& msg);
|
||||
void RequestTargetServer(f8::MsgHdr& hdr, const std::string& team_id);
|
||||
void OnClientDisconnect(a8::XParams& param);
|
||||
void RemoveRequest(int socket_handle, long long context_id);
|
||||
|
||||
private:
|
||||
long long GetConextId(int socket_handle);
|
||||
f8::MsgHdr* GetHdr(long long conext_id);
|
||||
long long GetContextIdBySocket(int socket_handle);
|
||||
f8::MsgHdr* GetHdrByContextId(long long context_id);
|
||||
MasterSvr* GetConnById(int instance_id);
|
||||
|
||||
private:
|
||||
|
Loading…
x
Reference in New Issue
Block a user