From 74e73ccc23e81734b43b57450b7610fc803fdc3a Mon Sep 17 00:00:00 2001 From: HappyTanuki Date: Fri, 9 May 2025 23:00:27 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=A3=A8=ED=8B=B4=EC=9D=84=20IOCP=EB=A1=9C=20=EB=84=98?= =?UTF-8?q?=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Client/src/ClientManager/ClientManager.cpp | 5 ++++ Server/src/ServerManager/ServerManager.cpp | 7 +++++ include/Socket/IOCP.hpp | 32 ++++++++++++++-------- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/Client/src/ClientManager/ClientManager.cpp b/Client/src/ClientManager/ClientManager.cpp index 030dc3c..09f841f 100644 --- a/Client/src/ClientManager/ClientManager.cpp +++ b/Client/src/ClientManager/ClientManager.cpp @@ -7,6 +7,11 @@ namespace Chattr { void ClientManager::_IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDATA* data) { + if (data->event == IOCPEVENT::QUIT) { + delete data; + return; + } + Chattr::Packet pack; int packetSize = data->transferredbytes; diff --git a/Server/src/ServerManager/ServerManager.cpp b/Server/src/ServerManager/ServerManager.cpp index 02d2e44..6456cca 100644 --- a/Server/src/ServerManager/ServerManager.cpp +++ b/Server/src/ServerManager/ServerManager.cpp @@ -5,6 +5,13 @@ namespace Chattr { void ServerManager::_IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDATA* data) { + if (data->event == IOCPEVENT::QUIT) { + if (userSocket2UID_.find(data->socket) != userSocket2UID_.end()) + deleteUser(userSocket2UID_[data->socket]); + delete data; + return; + } + Chattr::Packet pack; int packetSize = data->transferredbytes; diff --git a/include/Socket/IOCP.hpp b/include/Socket/IOCP.hpp index 6d03c79..7fd5057 100644 --- a/include/Socket/IOCP.hpp +++ b/include/Socket/IOCP.hpp @@ -28,7 +28,7 @@ namespace Chattr { class IOCP; enum class IOCPEVENT { - ERROR_, + QUIT, READ, WRITE }; @@ -59,9 +59,11 @@ public: DWORD cbTransfrred; int retVal = GetQueuedCompletionStatus(completionPort_, &cbTransfrred, (PULONG_PTR)&sock, (LPOVERLAPPED*)&data, INFINITE); if (retVal == 0 || cbTransfrred == 0) { - spdlog::debug("Client disconnected. [{}]", (std::string)(data->socket->remoteAddr)); - delete data; + data->event = IOCPEVENT::QUIT; + spdlog::debug("Disconnected. [{}]", (std::string)(data->socket->remoteAddr)); + threadPool->enqueueJob(callback, data); threadPool->enqueueJob(iocpWather, completionPort_, callback); + // delete data; return; } data->transferredbytes = cbTransfrred; @@ -85,9 +87,11 @@ public: int rc = rootIocpData->socket->recv(peekBuffer, 1, MSG_PEEK); if (rc > 0); else if (rc == 0) { - spdlog::debug("Client disconnected. [{}]", (std::string)(rootIocpData->socket->remoteAddr)); + rootIocpData->event = IOCPEVENT::QUIT; + spdlog::debug("Disconnected. [{}]", (std::string)(rootIocpData->socket->remoteAddr)); ::epoll_ctl(epollfd, EPOLL_CTL_DEL, rootIocpData->socket->sock, NULL); - delete rootIocpData; + threadPool->enqueueJob(callback, rootIocpData); + // delete rootIocpData; return; } else { @@ -123,9 +127,11 @@ public: return; } else if (redSize == 0) { - spdlog::debug("Client disconnected. [{}]", (std::string)ptr->socket->remoteAddr); + ptr->event = IOCPEVENT::QUIT; + spdlog::debug("Disconnected. [{}]", (std::string)(ptr->socket->remoteAddr)); ::epoll_ctl(epollfd, EPOLL_CTL_DEL, ptr->socket->sock, NULL); - delete ptr; + threadPool->enqueueJob(callback, ptr); + // delete ptr; return; } totalRedSize += redSize; @@ -151,9 +157,11 @@ public: return; } else if (redSize == 0) { - spdlog::debug("Client disconnected. [{}]", (std::string)ptr->socket->remoteAddr); + ptr->event = IOCPEVENT::QUIT; + spdlog::debug("Disconnected. [{}]", (std::string)(ptr->socket->remoteAddr)); ::epoll_ctl(epollfd, EPOLL_CTL_DEL, ptr->socket->sock, NULL); - delete ptr; + threadPool->enqueueJob(callback, ptr); + // delete ptr; return; } totalRedSize += redSize; @@ -196,9 +204,11 @@ public: spdlog::warn("buffer full"); continue; } - spdlog::error("send() [{}]", strerror(errno)); + data->event = IOCPEVENT::QUIT; + spdlog::debug("Disconnected. [{}]", (std::string)(data->socket->remoteAddr)); ::epoll_ctl(epollfd, EPOLL_CTL_DEL, data->socket->sock, NULL); - delete data; + threadPool->enqueueJob(callback, data); + // delete data; return; } totalSentSize += sentSize;