diff --git a/server/wsproxy/app.cc b/server/wsproxy/app.cc index f6a5f80..25248b8 100644 --- a/server/wsproxy/app.cc +++ b/server/wsproxy/app.cc @@ -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: diff --git a/server/wsproxy/constant.h b/server/wsproxy/constant.h index b35c230..3673a5a 100644 --- a/server/wsproxy/constant.h +++ b/server/wsproxy/constant.h @@ -15,6 +15,7 @@ enum InnerMesssage_e IM_TargetConnDisconnect, IM_MasterSvrDisconnect, IM_TargetConnConnect, + IM_RequestTargetServerTimeout }; //网络处理对象 diff --git a/server/wsproxy/mastersvrmgr.cc b/server/wsproxy/mastersvrmgr.cc index 4092e12..c57ed44 100644 --- a/server/wsproxy/mastersvrmgr.cc +++ b/server/wsproxy/mastersvrmgr.cc @@ -1,6 +1,7 @@ #include "precompile.h" #include +#include #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; } diff --git a/server/wsproxy/mastersvrmgr.h b/server/wsproxy/mastersvrmgr.h index 639760a..67833b5 100644 --- a/server/wsproxy/mastersvrmgr.h +++ b/server/wsproxy/mastersvrmgr.h @@ -27,11 +27,11 @@ class MasterSvrMgr : public a8::Singleton 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: