From 89306442aeaf155aa5976237c1f630e9c47995d1 Mon Sep 17 00:00:00 2001 From: HappyTanuki Date: Sat, 10 May 2025 11:32:15 +0900 Subject: [PATCH] =?UTF-8?q?IOCPPASSINDATA=20=EB=B3=B5=EC=82=AC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90,=EB=8C=80=EC=9E=85=20=EC=97=B0=EC=82=B0?= =?UTF-8?q?=EC=9E=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/src/ServerManager/ServerManager.cpp | 33 +++---------- include/Socket/IOCP.hpp | 56 ++++++++++++++++++++-- 2 files changed, 58 insertions(+), 31 deletions(-) diff --git a/Server/src/ServerManager/ServerManager.cpp b/Server/src/ServerManager/ServerManager.cpp index 5f58915..b207cc2 100644 --- a/Server/src/ServerManager/ServerManager.cpp +++ b/Server/src/ServerManager/ServerManager.cpp @@ -255,11 +255,7 @@ void ServerManager::processRoomListRequest(RoomListRequestPacket roomListRequest int packetLength = roomListResponsePacket.__data.packetLength; - Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA; - ::memcpy(ptr, data, sizeof(IOCPPASSINDATA)); - ::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED)); - ptr->recvbytes = ptr->sendbytes = 0; - ptr->wsabuf.buf = ptr->buf; + Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA(*data); ptr->wsabuf.len = packetLength + 8; roomListResponsePacket.convToN(); @@ -334,11 +330,7 @@ void ServerManager::processUsersListRequestPacket(UsersListRequestPacket usersLi int packetLength = usersListResponsePacket.__data.packetLength; - Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA; - ::memcpy(ptr, data, sizeof(IOCPPASSINDATA)); - ::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED)); - ptr->recvbytes = ptr->sendbytes = 0; - ptr->wsabuf.buf = ptr->buf; + Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA(*data); ptr->wsabuf.len = packetLength + 8; usersListResponsePacket.convToN(); @@ -382,12 +374,8 @@ void ServerManager::processDataPostPacket(DataPostPacket dataPostPacket, IOCPPAS int packetLength = dataPostPacket.__data.packetLength; for (auto dest : destinationSockets) { - Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA; - ::memcpy(ptr, data, sizeof(IOCPPASSINDATA)); - ::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED)); + Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA(*data); ptr->socket = dest; - ptr->recvbytes = ptr->sendbytes = 0; - ptr->wsabuf.buf = ptr->buf; ptr->wsabuf.len = packetLength + 8; dataPostPacket.convToN(); @@ -431,17 +419,13 @@ void ServerManager::processContinuePacket(ContinuePacket continuePacket, IOCPPAS int packetLength = continuePacket.__data.packetLength; for (auto dest : destinationSockets) { - Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA; - ::memcpy(ptr, data, sizeof(IOCPPASSINDATA)); - ::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED)); + Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA(*data); ptr->socket = dest; - ptr->recvbytes = ptr->sendbytes = 0; - ptr->wsabuf.buf = ptr->buf; - ptr->wsabuf.len = packetLength + 6; + ptr->wsabuf.len = packetLength + 8; continuePacket.convToN(); - memcpy(ptr->wsabuf.buf, continuePacket.serialized, packetLength + 6); - data->sendbytes = packetLength + 6; + memcpy(ptr->wsabuf.buf, continuePacket.serialized, packetLength + 8); + data->sendbytes = packetLength + 8; data->IOCPInstance->send(ptr, 1, 0); } } @@ -511,10 +495,7 @@ void ServerManager::run() { spdlog::info("Waiting for connection..."); listenSock_.accept(clientSock_, clientAddr_); Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA; - ::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED)); ptr->socket = std::make_shared(std::move(clientSock_)); - ptr->recvbytes = ptr->sendbytes = 0; - ptr->wsabuf.buf = ptr->buf; ptr->wsabuf.len = 1500; ptr->IOCPInstance = &iocp_; diff --git a/include/Socket/IOCP.hpp b/include/Socket/IOCP.hpp index a696122..502581d 100644 --- a/include/Socket/IOCP.hpp +++ b/include/Socket/IOCP.hpp @@ -46,6 +46,56 @@ struct IOCPPASSINDATA { #ifdef __linux__ std::shared_ptr> sendQueue; #endif + + IOCPPASSINDATA() { + event = IOCPEVENT::QUIT; + socket = nullptr; + recvbytes = 0; + sendbytes = 0; + transferredbytes = 0; + wsabuf.len = 1500; + wsabuf.buf = this->buf; + IOCPInstance = nullptr; + } + IOCPPASSINDATA(const IOCPPASSINDATA& other) + : event(other.event), + socket(other.socket), + transferredbytes(other.transferredbytes), + wsabuf(other.wsabuf), + IOCPInstance(other.IOCPInstance) +#ifdef __linux__ + , sendQueue(other.sendQueue) +#endif + { + recvbytes = 0; + sendbytes = 0; + wsabuf.buf = this->buf; + // buf는 memcpy로 복사 + std::memcpy(buf, other.buf, sizeof(buf)); + // overlapped는 0으로 초기화 (복사하면 안 됨) + std::memset(&overlapped, 0, sizeof(overlapped)); + } + + ~IOCPPASSINDATA() = default; + + // 복사 대입 연산자 + IOCPPASSINDATA& operator=(const IOCPPASSINDATA& other) { + if (this != &other) { + event = other.event; + socket = other.socket; + recvbytes = 0; + sendbytes = 0; + transferredbytes = other.transferredbytes; + wsabuf.buf = this->buf; + IOCPInstance = other.IOCPInstance; +#ifdef __linux__ + sendQueue = other.sendQueue; +#endif + std::memcpy(buf, other.buf, sizeof(buf)); + std::memset(&overlapped, 0, sizeof(overlapped)); + } + return *this; + } }; class IOCP { @@ -106,11 +156,7 @@ public: return; } } - Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA; - ::memcpy(ptr, rootIocpData, sizeof(IOCPPASSINDATA)); - ::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED)); - ptr->recvbytes = ptr->sendbytes = 0; - ptr->wsabuf.buf = ptr->buf; + Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA(*rootIocpData); ptr->wsabuf.len = 1500; int redSize = 0;