From 70302e90ab51a9030479f0b4e5fefd2c484989e6 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 25 Mar 2024 20:19:35 +0800 Subject: [PATCH] 1 --- server/gameserver/GGListener.cc | 23 ++++++++++++++++------- server/gameserver/GGListener.h | 7 +++++++ server/gameserver/handlermgr.cc | 3 ++- server/gameserver/pbutils.cc | 18 ++++++------------ server/gameserver/playermgr.cc | 28 ++++++++++++++-------------- server/gameserver/playermgr.h | 7 +++---- 6 files changed, 48 insertions(+), 38 deletions(-) diff --git a/server/gameserver/GGListener.cc b/server/gameserver/GGListener.cc index cf245511..737f869c 100644 --- a/server/gameserver/GGListener.cc +++ b/server/gameserver/GGListener.cc @@ -13,6 +13,7 @@ #include "app.h" #include "jsondatamgr.h" #include "handlermgr.h" +#include "playermgr.h" class SocketDisconnectHandler : public std::enable_shared_from_this { @@ -136,14 +137,17 @@ void GGListener::Init() [this] (const a8::Args& args) { int gg_socket = args.Get(0); - auto itr = disconnect_listener_hash_.find(gg_socket); - if (itr != disconnect_listener_hash_.end()) { + PlayerMgr::Instance()->OnGateDisconnect(gg_socket); + { std::vector> del_handlers; - { - SocketDisconnectHandler *handle = nullptr, *tmp = nullptr; - list_for_each_entry_safe(handle, tmp, &itr->second, entry) { - del_handlers.push_back(handle->holder); - handle->cb(a8::Args({})); + for (auto& pair : disconnect_listener_hash_) { + unsigned short parent_socket_handle = (pair.first >> 16) & 0xFFFF; + if (parent_socket_handle == gg_socket) { + SocketDisconnectHandler *handle = nullptr, *tmp = nullptr; + list_for_each_entry_safe(handle, tmp, &pair.second, entry) { + del_handlers.push_back(handle->holder); + handle->cb(a8::Args({})); + } } } for (auto handler : del_handlers) { @@ -224,3 +228,8 @@ void GGListener::RemoveSocketDisconnectHandler(std::weak_ptrentry); } } + +void GGListener::OnClientDisconnect(int socket_handle) +{ + PlayerMgr::Instance()->OnClientDisconnect(socket_handle); +} diff --git a/server/gameserver/GGListener.h b/server/gameserver/GGListener.h index ca632da6..73544d2f 100644 --- a/server/gameserver/GGListener.h +++ b/server/gameserver/GGListener.h @@ -6,6 +6,11 @@ #include #include +namespace ss +{ + class SS_WSP_SocketDisconnect; +} + //game client listener namespace a8 { @@ -69,9 +74,11 @@ public: std::weak_ptr AddSocketDisconnectListener(int socket_handle, a8::CommonCbProc cb); void RemoveSocketDisconnectHandler(std::weak_ptr handler); bool DebugNetMsg(int msg_id); + void _SS_WSP_SocketDisconnect(f8::MsgHdr* hdr, const ss::SS_WSP_SocketDisconnect& msg); private: void OnListenError(int errorid); + void OnClientDisconnect(int socket_handle); private: std::shared_ptr tcp_listener_; diff --git a/server/gameserver/handlermgr.cc b/server/gameserver/handlermgr.cc index cd28342f..cd44b551 100644 --- a/server/gameserver/handlermgr.cc +++ b/server/gameserver/handlermgr.cc @@ -101,7 +101,8 @@ void HandlerMgr::UnInit() void HandlerMgr::RegisterNetMsgHandlers() { - RegisterNetMsgHandler(&ggmsghandler, &PlayerMgr::_SS_WSP_SocketDisconnect); + RegisterNetMsgHandler(&ggmsghandler, &GGListener::_SS_WSP_SocketDisconnect); + RegisterNetMsgHandler(&ggmsghandler, &PlayerMgr::_SS_Ping); RegisterNetMsgHandler(&ggmsghandler, &RoomMgr::_CMJoin); RegisterNetMsgHandler(&ggmsghandler, &RoomMgr::_CMReconnect); diff --git a/server/gameserver/pbutils.cc b/server/gameserver/pbutils.cc index b429056e..bdd7356f 100644 --- a/server/gameserver/pbutils.cc +++ b/server/gameserver/pbutils.cc @@ -51,6 +51,7 @@ #include "custom_battle.h" #include "custom_team.h" #include "custom_member.h" +#include "GGListener.h" #include "mt/Param.h" #include "mt/Buff.h" @@ -2448,24 +2449,17 @@ Player* PlayerMgr::CreatePlayerByCMJoin(Player* hum, return hum; } -void PlayerMgr::_SS_WSP_SocketDisconnect(f8::MsgHdr* hdr, const ss::SS_WSP_SocketDisconnect& msg) -{ - Player* hum = GetPlayerBySocket(hdr->socket_handle); - if (hum) { - RemovePlayerBySocket(hdr->socket_handle); - hum->room->OnPlayerOffline(hum); - } -#if MYDEBUG - a8::XPrintf("remove socket1 %d\n", {hdr->socket_handle}); -#endif -} - void PlayerMgr::_SS_Ping(f8::MsgHdr* hdr, const ss::SS_Ping& msg) { ss::SS_Pong respmsg; GGListener::Instance()->SendToClient(hdr->socket_handle, 0, respmsg); } +void GGListener::_SS_WSP_SocketDisconnect(f8::MsgHdr* hdr, const ss::SS_WSP_SocketDisconnect& msg) +{ + OnClientDisconnect(hdr->socket_handle); +} + void Team::FillSMGameOver(cs::SMGameOver& msg) { auto p = msg.mutable_settlement_new(); diff --git a/server/gameserver/playermgr.cc b/server/gameserver/playermgr.cc index d6f1a59b..45144009 100644 --- a/server/gameserver/playermgr.cc +++ b/server/gameserver/playermgr.cc @@ -14,14 +14,6 @@ void PlayerMgr::Init() { - f8::MsgQueue::Instance()->RegisterCallBack - ( - IM_ClientSocketDisconnect, - [this] (const a8::Args& args) - { - int gg_socket = args.Get(0); - OnClientDisconnect(gg_socket); - }); } void PlayerMgr::UnInit() @@ -39,7 +31,7 @@ Player* PlayerMgr::GetPlayerBySocket(int socket) return itr != socket_hash_.end() ? itr->second : nullptr; } -void PlayerMgr::OnClientDisconnect(int gg_socket) +void PlayerMgr::OnGateDisconnect(int gg_socket) { std::vector socket_list; @@ -50,11 +42,19 @@ void PlayerMgr::OnClientDisconnect(int gg_socket) } } for (int socket_handle : socket_list) { - Player* hum = GetPlayerBySocket(socket_handle); - if (hum) { - RemovePlayerBySocket(socket_handle); - hum->room->OnPlayerOffline(hum); - } + OnClientDisconnect(socket_handle); + } +} + +void PlayerMgr::OnClientDisconnect(int socket_handle) +{ + Player* hum = GetPlayerBySocket(socket_handle); + if (hum) { + RemovePlayerBySocket(socket_handle); + hum->room->OnPlayerOffline(hum); +#if MYDEBUG + a8::XPrintf("remove socket1 %d\n", {socket_handle}); +#endif } } diff --git a/server/gameserver/playermgr.h b/server/gameserver/playermgr.h index a96ad377..c9ff8190 100644 --- a/server/gameserver/playermgr.h +++ b/server/gameserver/playermgr.h @@ -27,20 +27,19 @@ class PlayerMgr : public a8::Singleton void Init(); void UnInit(); - void _SS_WSP_SocketDisconnect(f8::MsgHdr* hdr, const ss::SS_WSP_SocketDisconnect& msg); void _SS_Ping(f8::MsgHdr* hdr, const ss::SS_Ping& msg); int OnlineNum(); Player* GetPlayerBySocket(int socket); Player* CreatePlayerByCMJoin(Player* hum, long ip_saddr, int socket, const cs::CMJoin& msg); - void RemovePlayerBySocket(int socket_handle); size_t GetAccountNum() { return account_num_hash_.size(); } void IncAccountNum(const std::string& account_id); void DecAccountNum(const std::string& account_id); void ReBindSocket(Player* hum); + void RemovePlayerBySocket(int socket_handle); + void OnGateDisconnect(int gg_socket); + void OnClientDisconnect(int socket_handle); -private: - void OnClientDisconnect(int gg_socket); private: std::map socket_hash_; std::map account_num_hash_;