From 40d522e755cd06e8b2460b596b6495763a91c3f6 Mon Sep 17 00:00:00 2001 From: HappyTanuki Date: Fri, 2 May 2025 12:05:57 +0900 Subject: [PATCH] =?UTF-8?q?iocp=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../include/ServerManager/ServerManager.hpp | 3 ++- Server/src/server.cpp | 27 +++++++------------ impl/Socket/IOCP.cpp | 6 +++++ impl/Socket/Socket.cpp | 4 +++ include/Socket/IOCP.hpp | 1 + include/Socket/Socket.hpp | 1 + 6 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Server/include/ServerManager/ServerManager.hpp b/Server/include/ServerManager/ServerManager.hpp index 5f22497..03ad76e 100644 --- a/Server/include/ServerManager/ServerManager.hpp +++ b/Server/include/ServerManager/ServerManager.hpp @@ -4,7 +4,8 @@ namespace Chattr { class ServerManager { public: - + void init(); + void }; } \ No newline at end of file diff --git a/Server/src/server.cpp b/Server/src/server.cpp index 743cde8..950c51a 100644 --- a/Server/src/server.cpp +++ b/Server/src/server.cpp @@ -14,7 +14,7 @@ #include "precomp.hpp" -void _TCPRecvClient(Chattr::ThreadPool* threadPool, Chattr::IOCPPASSINDATA* data); +void _IOCPClient(Chattr::ThreadPool* threadPool, Chattr::IOCPPASSINDATA* data); void _TCPSendClient(Chattr::ThreadPool* threadPool, Chattr::TCPSocket sock, std::queue packets); int main() { @@ -22,13 +22,15 @@ int main() { Chattr::log::setDefaultLogger(config.logLevel, config.logFileName, config.logfileSize, config.logfileCount); Chattr::ThreadPool threadPool(0); Chattr::IOCP iocp; - iocp.init(&threadPool, _TCPRecvClient); + iocp.init(&threadPool, _IOCPClient); // struct Chattr::WSAManager wsaManager; Chattr::TCPSocket sock; struct Chattr::Address serveraddr; Chattr::TCPSocket clientSock; struct Chattr::Address clientAddr; + bool enable = true; + sock.setsockopt(SOL_SOCKET, SO_KEEPALIVE, (const char*)&enable, sizeof(enable)); if (config.ipVersion == 4) { sock.init(AF_INET); serveraddr.set(AF_INET, INADDR_ANY, config.listenPort); @@ -54,6 +56,8 @@ int main() { while (true) { spdlog::info("Waiting for connection..."); sock.accept(clientSock, clientAddr); + bool enable = true; + clientSock.setsockopt(SOL_SOCKET, SO_KEEPALIVE, (const char *)&enable, sizeof(enable)); Chattr::IOCPPASSINDATA* ptr = new Chattr::IOCPPASSINDATA; ZeroMemory(&ptr->overlapped, sizeof(OVERLAPPED)); ptr->socket = std::move(clientSock); @@ -67,13 +71,7 @@ int main() { } } -void _TCPRecvClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDATA* data) { -#ifdef _WIN32 - DWORD tid = GetCurrentThreadId(); -#elif __linux__ - pthread_t tid = pthread_self(); -#endif - spdlog::info("entered recvfunc on TID: {}", tid); +void _IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDATA* data) { Chattr::Packet pack; int packetSize = 1500; int totalRedSize = 0; @@ -113,7 +111,7 @@ void _TCPRecvClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDATA* data) { dataPostPacket.convToH(); dataPostPacket.__data.packetLength = (dataPostPacket.__data.packetLength > 1487) ? 1487 : dataPostPacket.__data.packetLength; recvString = std::string((char *)dataPostPacket.__data.data, dataPostPacket.__data.packetLength - (sizeof(std::uint16_t)*4)); - spdlog::info("Red size : {}, {} from : [{}]", totalRedSize, recvString, (std::string)data->socket.remoteAddr); + spdlog::info("Red size : {}, {} from : [{}]", data->wsabuf.len, recvString, (std::string)data->socket.remoteAddr); break; case Chattr::DataType::BINARY: break; @@ -168,14 +166,9 @@ void _TCPRecvClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDATA* data) { packetError = true; break; } + DWORD recvbytes = 0, flags = 0; - Sleep(10000); - - /*if (packetError) { - thread->enqueueJob(_TCPRecvClient, data);; - } - else - thread->enqueueJob(_TCPRecvClient, data);*/ + int returnData = WSARecv(data->socket.sock, &data->wsabuf, 1, &recvbytes, &flags, &data->overlapped, NULL); } void _TCPSendClient(Chattr::ThreadPool* thread, Chattr::TCPSocket sock, std::queue packets) { diff --git a/impl/Socket/IOCP.cpp b/impl/Socket/IOCP.cpp index 3629591..1ccf258 100644 --- a/impl/Socket/IOCP.cpp +++ b/impl/Socket/IOCP.cpp @@ -15,4 +15,10 @@ void IOCP::registerSocket(SOCKET sock) { #endif } +int IOCP::recv(void* __restrict __buf, size_t __n, int __flags) { +} + +int IOCP::send(const void* __buf, size_t __n, int __flags) { +} + } \ No newline at end of file diff --git a/impl/Socket/Socket.cpp b/impl/Socket/Socket.cpp index 3f65bd9..b4b93f6 100644 --- a/impl/Socket/Socket.cpp +++ b/impl/Socket/Socket.cpp @@ -54,6 +54,10 @@ void Socket::set(const SOCKET __sock, int __domain) { valid_ = true; }; +int Chattr::Socket::setsockopt(int level, int optname, const char FAR* optval, int optlen) { + return ::setsockopt(sock, level, optname, optval, optlen); +} + int Socket::bind(Address __addr) { bindAddr = __addr; int retVal = ::bind(sock, &__addr.addr, __addr.length); diff --git a/include/Socket/IOCP.hpp b/include/Socket/IOCP.hpp index 79a4ccc..3db141e 100644 --- a/include/Socket/IOCP.hpp +++ b/include/Socket/IOCP.hpp @@ -27,6 +27,7 @@ public: int retVal = GetQueuedCompletionStatus(completionPort_, &cbTransfrred, (PULONG_PTR)&sock, (LPOVERLAPPED*)&data, INFINITE); if (retVal == 0 || cbTransfrred == 0) { spdlog::info("Client disconnected. [{}]", (std::string)(data->socket.remoteAddr)); + delete data; threadPool->enqueueJob(iocpWather, completionPort_, callback); return; } diff --git a/include/Socket/Socket.hpp b/include/Socket/Socket.hpp index edf869d..5357541 100644 --- a/include/Socket/Socket.hpp +++ b/include/Socket/Socket.hpp @@ -16,6 +16,7 @@ public: operator SOCKET(); void set(const SOCKET __sock, int __domain); + int setsockopt(int level, int optname, const char FAR* optval, int optlen); int bind(Address __addr);