From 6cd0a7d95877a99b214184e22062045357872b89 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 25 Mar 2024 16:33:09 +0800 Subject: [PATCH] 1 --- server/gameserver/GGListener.cc | 56 +++++++++++++++++++++++++++++++++ server/gameserver/GGListener.h | 4 +++ 2 files changed, 60 insertions(+) diff --git a/server/gameserver/GGListener.cc b/server/gameserver/GGListener.cc index 804fe0e3..af97fc3f 100644 --- a/server/gameserver/GGListener.cc +++ b/server/gameserver/GGListener.cc @@ -14,6 +14,23 @@ #include "jsondatamgr.h" #include "handlermgr.h" +class SocketDisconnectHandler : public std::enable_shared_from_this +{ +public: + a8::CommonCbProc cb; + list_head entry; + std::shared_ptr holder; + + SocketDisconnectHandler() + { + } + + ~SocketDisconnectHandler() + { + } + +}; + class GCClientSession: public a8::MixedSession { public: @@ -113,6 +130,20 @@ void GGListener::Init() int error_id = args.Get(0); GGListener::Instance()->OnListenError(error_id); }); + f8::MsgQueue::Instance()->RegisterCallBack + ( + IM_ClientSocketDisconnect, + [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()) { + class SocketDisconnectHandler *handle = nullptr, *tmp = nullptr; + list_for_each_entry_safe(handle, tmp, &itr->second, entry) { + handle->cb(a8::Args({})); + } + } + }); } void GGListener::UnInit() @@ -161,3 +192,28 @@ bool GGListener::DebugNetMsg(int msg_id) { return false; } + +std::weak_ptr GGListener::AddSocketDisconnectListener(int socket_handle, a8::CommonCbProc cb) +{ + auto itr = disconnect_listener_hash_.find(socket_handle); + if (itr == disconnect_listener_hash_.end()) { + disconnect_listener_hash_[socket_handle] = list_head(); + itr = disconnect_listener_hash_.find(socket_handle); + INIT_LIST_HEAD(&itr->second); + } + auto p = std::make_shared(); + p->cb = cb; + list_add_tail(&p->entry, &itr->second); + p->holder = p; + return p; +} + +void GGListener::RemoveSocketDisconnectHandler(std::weak_ptr handler) +{ + if (!handler.expired()) { + auto p = handler.lock(); + p->cb = nullptr; + p->holder = nullptr; + list_del_init(&p->entry); + } +} diff --git a/server/gameserver/GGListener.h b/server/gameserver/GGListener.h index 07d082c4..ca632da6 100644 --- a/server/gameserver/GGListener.h +++ b/server/gameserver/GGListener.h @@ -12,6 +12,7 @@ namespace a8 class TcpListener; } +class SocketDisconnectHandler; class GGListener : public a8::Singleton { private: @@ -65,6 +66,8 @@ public: long long GetSendNodeNum(); long long GetSentNodeNum(); long long GetSentBytesNum(); + std::weak_ptr AddSocketDisconnectListener(int socket_handle, a8::CommonCbProc cb); + void RemoveSocketDisconnectHandler(std::weak_ptr handler); bool DebugNetMsg(int msg_id); private: @@ -72,4 +75,5 @@ private: private: std::shared_ptr tcp_listener_; + std::map disconnect_listener_hash_; };