From 4e03b84b1d8b0ddeef279ece9c2500ce508e9b9f Mon Sep 17 00:00:00 2001 From: HappyTanuki Date: Sat, 3 May 2025 18:55:13 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9E=90=EC=9E=98=ED=95=9C=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=ED=94=BD=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Client/src/client.cpp | 2 - Server/src/ServerManager/ServerManager.cpp | 49 ++++++++++++++++++++-- include/Packet/Packet.hpp | 8 ++++ include/Socket/IOCP.hpp | 2 +- 4 files changed, 54 insertions(+), 7 deletions(-) diff --git a/Client/src/client.cpp b/Client/src/client.cpp index b173c3a..2a7ba86 100644 --- a/Client/src/client.cpp +++ b/Client/src/client.cpp @@ -88,6 +88,4 @@ int main() { Chattr::ResponsePacket packet; sock.recv(&packet.serialized, 10, 0); packet.convToH(); - - sleep(1000000); } \ No newline at end of file diff --git a/Server/src/ServerManager/ServerManager.cpp b/Server/src/ServerManager/ServerManager.cpp index 7c507f1..cbc305e 100644 --- a/Server/src/ServerManager/ServerManager.cpp +++ b/Server/src/ServerManager/ServerManager.cpp @@ -30,7 +30,7 @@ void ServerManager::_IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDA case PacketSet::LOGINREQUEST: { pack.convToN(); LoginRequestPacket loginRequestPacket; - std::memcpy(&loginRequestPacket.serialized, &pack, 8 + pack.__data.packetLength); + std::memcpy(&loginRequestPacket.serialized, &pack, 8 + packetLength); loginRequestPacket.convToH(); std::string userName( @@ -44,12 +44,14 @@ void ServerManager::_IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDA loginResponsePacket.__data.dataType = Chattr::DataType::TEXT; loginResponsePacket.__data.packetLength = sizeof(Chattr::ResponseStatusCode) + sizeof(Snowflake); loginResponsePacket.__data.responseStatusCode = Chattr::ResponseStatusCode::OK; - ::memcpy(loginResponsePacket.__data.yourId, &userSocket2UID_[data->socket], sizeof(Snowflake)); + Snowflake yourId = userSocket2UID_[data->socket]; + ::memcpy(loginResponsePacket.__data.yourId, &yourId, sizeof(Snowflake)); loginResponsePacket.convToN(); memcpy(data->wsabuf.buf, loginResponsePacket.serialized, 16); data->sendbytes = 16; data->transferredbytes = 16; + data->wsabuf.len = 16; data->IOCPInstance->send(data, 1, 0); } break; @@ -61,11 +63,47 @@ void ServerManager::_IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDA break; case PacketSet::ROOMEXITREQUEST: break; - case PacketSet::USERSLISTREQUEST: + case PacketSet::USERSLISTREQUEST: { + pack.convToN(); + UsersListRequestPacket usersListRequestPacket; + std::memcpy(&usersListRequestPacket.serialized, &pack, 8 + packetLength); + usersListRequestPacket.convToH(); + + auto usersList = getUserList(); + + for (auto user : usersList) { + UsersListResponsePacket usersListResponsePacket; + usersListResponsePacket.__data.packetType = Chattr::PacketCategory::PACKET_RESPONSE; + usersListResponsePacket.__data.requestType = Chattr::RequestType::USERS_LIST; + usersListResponsePacket.__data.dataType = Chattr::DataType::BINARY; + usersListResponsePacket.__data.packetLength = sizeof(Chattr::ResponseStatusCode) + sizeof(std::uint32_t) + sizeof(Snowflake) + user.second.size(); + usersListResponsePacket.__data.responseStatusCode = Chattr::ResponseStatusCode::OK; + usersListResponsePacket.__data.usersCount = usersList.size(); + ::memcpy(usersListResponsePacket.__data.userId, &user.first, sizeof(Snowflake)); + ::memcpy(usersListResponsePacket.__data.name, user.second.c_str(), user.second.size()); + + int sendPacketLength = usersListResponsePacket.__data.packetLength; + + Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA; + ::memset(&ptr->overlapped, 0, sizeof(OVERLAPPED)); + ptr->socket = data->socket; + ptr->recvbytes = ptr->sendbytes = 0; + ptr->wsabuf.buf = ptr->buf; + ptr->wsabuf.len = 1500; + ptr->IOCPInstance = data->IOCPInstance; + + usersListResponsePacket.convToN(); + memcpy(ptr->wsabuf.buf, usersListResponsePacket.serialized, sendPacketLength + 8); + data->sendbytes = sendPacketLength + 8; + data->transferredbytes = sendPacketLength + 8; + data->wsabuf.len = sendPacketLength + 8; + data->IOCPInstance->send(ptr, 1, 0); + } + } break; case PacketSet::DATAPOSTTEXT: { pack.convToN(); - std::memcpy(&dataPostPacket.serialized, &pack, 8 + pack.__data.packetLength); + std::memcpy(&dataPostPacket.serialized, &pack, 8 + packetLength); dataPostPacket.convToH(); Snowflake destID = {}; @@ -95,6 +133,7 @@ void ServerManager::_IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDA memcpy(data->wsabuf.buf, responsePacket.serialized, 10); data->sendbytes = 10; data->transferredbytes = 10; + data->wsabuf.len = 10; data->IOCPInstance->send(data, 1, 0); for (auto dest : destinationSockets) { @@ -114,6 +153,7 @@ void ServerManager::_IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDA memcpy(ptr->wsabuf.buf, dataPostPacket.serialized, packetLength + 6); data->sendbytes = packetLength + 6; data->transferredbytes = packetLength + 6; + data->wsabuf.len = packetLength + 6; data->IOCPInstance->send(ptr, 1, 0); } } @@ -134,6 +174,7 @@ void ServerManager::_IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDA memcpy(data->wsabuf.buf, responsePacket.serialized, 10); data->sendbytes = 10; data->transferredbytes = 10; + data->wsabuf.len = 10; data->IOCPInstance->send(data, 1, 0); break; } diff --git a/include/Packet/Packet.hpp b/include/Packet/Packet.hpp index ff744ed..67ca1cf 100644 --- a/include/Packet/Packet.hpp +++ b/include/Packet/Packet.hpp @@ -216,12 +216,14 @@ public: }; std::uint8_t* convToN() { __data.packetLength = ::htons(__data.packetLength); + __data.responseStatusCode = (ResponseStatusCode)::htons((std::uint16_t)__data.responseStatusCode); for (int i = 0; i < 4; i++) __data.yourId[i] = ::htons(__data.yourId[i]); return serialized; } std::uint8_t* convToH() { __data.packetLength = ::ntohs(__data.packetLength); + __data.responseStatusCode = (ResponseStatusCode)::ntohs((std::uint16_t)__data.responseStatusCode); for (int i = 0; i < 4; i++) __data.yourId[i] = ::ntohs(__data.yourId[i]); return serialized; @@ -244,12 +246,14 @@ public: }; std::uint8_t* convToN() { __data.packetLength = ::htons(__data.packetLength); + __data.responseStatusCode = (ResponseStatusCode)::htons((std::uint16_t)__data.responseStatusCode); for (int i = 0; i < 4; i++) __data.createdRoomId[i] = ::htons(__data.createdRoomId[i]); return serialized; } std::uint8_t* convToH() { __data.packetLength = ::ntohs(__data.packetLength); + __data.responseStatusCode = (ResponseStatusCode)::ntohs((std::uint16_t)__data.responseStatusCode); for (int i = 0; i < 4; i++) __data.createdRoomId[i] = ::ntohs(__data.createdRoomId[i]); return serialized; @@ -273,6 +277,7 @@ public: }; std::uint8_t* convToN() { __data.packetLength = ::htons(__data.packetLength); + __data.responseStatusCode = (ResponseStatusCode)::htons((std::uint16_t)__data.responseStatusCode); __data.roomCount = ::htonl(__data.roomCount); for (int i = 0; i < 4; i++) __data.roomId[i] = ::htons(__data.roomId[i]); @@ -280,6 +285,7 @@ public: } std::uint8_t* convToH() { __data.packetLength = ::ntohs(__data.packetLength); + __data.responseStatusCode = (ResponseStatusCode)::ntohs((std::uint16_t)__data.responseStatusCode); __data.roomCount = ::ntohl(__data.roomCount); for (int i = 0; i < 4; i++) __data.roomId[i] = ::ntohs(__data.roomId[i]); @@ -308,12 +314,14 @@ public: }; std::uint8_t* convToN() { __data.packetLength = ::htons(__data.packetLength); + __data.responseStatusCode = (ResponseStatusCode)::htons((std::uint16_t)__data.responseStatusCode); for (int i = 0; i < 4; i++) __data.userId[i] = ::htons(__data.userId[i]); return serialized; } std::uint8_t* convToH() { __data.packetLength = ::ntohs(__data.packetLength); + __data.responseStatusCode = (ResponseStatusCode)::ntohs((std::uint16_t)__data.responseStatusCode); for (int i = 0; i < 4; i++) __data.userId[i] = ::ntohs(__data.userId[i]); return serialized; diff --git a/include/Socket/IOCP.hpp b/include/Socket/IOCP.hpp index 2e6dec1..4a5dca8 100644 --- a/include/Socket/IOCP.hpp +++ b/include/Socket/IOCP.hpp @@ -53,7 +53,7 @@ public: threadPool->enqueueJob(iocpWather, completionPort_, callback); return; } - data->transfrredbytes = cbTransfrred; + data->transferredbytes = cbTransfrred; threadPool->enqueueJob(callback, data); threadPool->enqueueJob(iocpWather, completionPort_, callback); };