From c5e4d5a3a5c78e6cd95a276f6f568fb26090a5a9 Mon Sep 17 00:00:00 2001 From: 12hydrogen Date: Wed, 22 Jul 2026 22:02:06 +0800 Subject: [PATCH] Rebuild directory structure --- CMakeLists.txt | 33 +++------ main.cpp | 18 ++--- pool.cpp | 7 -- pool.hpp => pool/pool.hpp | 0 socket.cpp | 130 --------------------------------- socket.hpp | 83 --------------------- socket/CMakeLists.txt | 10 +++ socket/address.cpp | 1 + socket/address.hpp | 71 ++++++++++++++++++ socket/socket.cpp | 21 ++++++ socket/socket.hpp | 83 +++++++++++++++++++++ test/CMakeLists.txt | 5 ++ test_pool.cpp => test/pool.cpp | 0 13 files changed, 209 insertions(+), 253 deletions(-) delete mode 100644 pool.cpp rename pool.hpp => pool/pool.hpp (100%) delete mode 100644 socket.cpp delete mode 100644 socket.hpp create mode 100644 socket/CMakeLists.txt create mode 100644 socket/address.cpp create mode 100644 socket/address.hpp create mode 100644 socket/socket.cpp create mode 100644 socket/socket.hpp create mode 100644 test/CMakeLists.txt rename test_pool.cpp => test/pool.cpp (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index f4c0a61..04182b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,39 +7,26 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_STANDARD_REQUIRED True) set(CMAKE_CXX_STANDARD_REQUIRED True) -add_library( - wrapper - ./socket.cpp -) - -target_include_directories( - wrapper - PUBLIC . -) - add_executable( test_server ./main.cpp ) +add_subdirectory(./socket) +add_subdirectory(./test) + target_include_directories( test_server - PUBLIC . + PUBLIC ./pool + PUBLIC ./socket +) + +target_include_directories( + test_pool + PUBLIC ./pool ) target_link_libraries( test_server PUBLIC wrapper ) - -# ThreadPool + LockFreeQueue test (header-only, no link deps) -add_executable( - test_pool - ./test_pool.cpp - ./pool.cpp -) - -target_include_directories( - test_pool - PUBLIC . -) diff --git a/main.cpp b/main.cpp index 1023f26..79e89db 100644 --- a/main.cpp +++ b/main.cpp @@ -1,22 +1,20 @@ +#include "pool.hpp" #include "socket.hpp" +#include "address.hpp" int main(int argc, char **argv) try { - int iResult = 0; + ThreadPool pool; WSA wsa; + auto server = pool.submit([]() -> int { + return 0; + }); + AddrInfoPtr ptr; - AddrInfo hints; - - hints->ai_family = AF_INET; - hints->ai_socktype = SOCK_STREAM; - hints->ai_protocol = IPPROTO_TCP; - hints->ai_flags = AI_PASSIVE; - - AddrInfoPtr result = hints.get_addrinfo(NULL, "8088"); + AddrInfoPtr result = AddrInfo::get_local_addrinfo("17900"); Socket listen_socket; - listen_socket.from_addrinfo(*ptr, Socket::BIND); Socket client_socket = listen_socket.accept_client(); diff --git a/pool.cpp b/pool.cpp deleted file mode 100644 index b14d807..0000000 --- a/pool.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// pool.cpp — ThreadPool & LockFreeQueue implementation file -// -// Note: All template implementations are in pool.hpp (header-only). -// This file exists for future non-template extensions or -// explicit template instantiations if needed. - -#include "pool.hpp" diff --git a/pool.hpp b/pool/pool.hpp similarity index 100% rename from pool.hpp rename to pool/pool.hpp diff --git a/socket.cpp b/socket.cpp deleted file mode 100644 index 826b5a7..0000000 --- a/socket.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include "socket.hpp" - -#pragma comment(lib, "ws2_32.lib") - -WSA::WSA(WORD version) { - int result = WSAStartup(version, &wsa); - if (result) throw result; -} -WSA::~WSA() noexcept { - WSACleanup(); -} - -AddrInfoPtr::AddrInfoPtr() noexcept: -info(nullptr) {} -AddrInfoPtr::~AddrInfoPtr() noexcept { - freeaddrinfo(info); -} - - -addrinfo** AddrInfoPtr::operator&() noexcept { - return &info; -} -addrinfo& AddrInfoPtr::operator*() noexcept { - return *info; -} -addrinfo* AddrInfoPtr::operator->() noexcept { - return info; -} - -const addrinfo& AddrInfoPtr::operator*() const noexcept { - return *info; -} - -AddrInfoPtr::operator addrinfo *() noexcept { - return info; -} - -AddrInfo::AddrInfo() noexcept { - ZeroMemory(&info, sizeof(info)); -} - -addrinfo* AddrInfo::operator->() noexcept { - return &info; -} -addrinfo* AddrInfo::operator&() noexcept { - return &info; -} - -AddrInfo::operator const addrinfo&() const noexcept { - return info; -} -AddrInfo::operator addrinfo&() noexcept { - return info; -} - -AddrInfoPtr AddrInfo::get_addrinfo(PCSTR node, PCSTR service) { - AddrInfoPtr ptr; - int result = getaddrinfo(node, service, &info, &ptr); - if (result == SOCKET_ERROR) throw result; - return ptr; -} - -Socket::Socket(SOCKET init) noexcept: -s(init) {} -Socket::~Socket() noexcept { - closesocket(s); -} - -Socket::operator SOCKET() const noexcept { - return s; -} - -Socket::operator bool() const noexcept { - return is_valid(); -} - -bool Socket::is_valid() const noexcept { - return s != INVALID_SOCKET; -} - -void Socket::from_addrinfo(const addrinfo &info, AddrAction action) { - s = socket(info.ai_family, info.ai_socktype, info.ai_protocol); - if (s == INVALID_SOCKET) throw -1; - int result = SOCKET_ERROR; - switch (action) { - case NO_ACTION: - break; - case CONNECT: - result = connect(s, info.ai_addr, (int)info.ai_addrlen); - if (result == SOCKET_ERROR) throw result; - break; - case BIND: - result = bind(s, info.ai_addr, (int)info.ai_addrlen); - if (result == SOCKET_ERROR) throw result; - result = listen(s, SOMAXCONN); - if (result == SOCKET_ERROR) throw result; - break; - } -} - -Socket Socket::accept_client() const noexcept { - return Socket(accept(s, NULL, NULL)); -} - -void Socket::stop_send() const { - int result = shutdown(s, SD_SEND); - if (result == SOCKET_ERROR) throw result; -} - -int Socket::send_data(const Buffer &data) const { - return send(s, data.get(), data.len(), 0); -} - -int Socket::recv_data(Buffer &data) const { - return recv(s, data.get(), data.len(), 0); -} - -Buffer::Buffer(int len): -size(len), data(new char[len]) {} - -char *Buffer::get() { - return data.get(); -} -const char *Buffer::get() const { - return data.get(); -} - -int Buffer::len() const { - return size; -} diff --git a/socket.hpp b/socket.hpp deleted file mode 100644 index 1104cac..0000000 --- a/socket.hpp +++ /dev/null @@ -1,83 +0,0 @@ -#include - -#include -#include -#include - -#include - -struct WSA { - WSADATA wsa; - - explicit WSA(WORD version = MAKEWORD(2, 2)); - ~WSA() noexcept; -}; - -struct AddrInfoPtr { - struct addrinfo *info; - - AddrInfoPtr() noexcept; - ~AddrInfoPtr() noexcept; - - addrinfo** operator&() noexcept; - addrinfo& operator*() noexcept; - addrinfo* operator->() noexcept; - const addrinfo& operator*() const noexcept; - - operator addrinfo*() noexcept; -}; - -struct AddrInfo { - struct addrinfo info; - - AddrInfo() noexcept; - ~AddrInfo() noexcept = default; - - addrinfo* operator->() noexcept; - addrinfo* operator&() noexcept; - - operator const addrinfo&() const noexcept; - operator addrinfo&() noexcept; - - AddrInfoPtr get_addrinfo(PCSTR node, PCSTR service); -}; - -struct Socket { - enum AddrAction { - NO_ACTION, - CONNECT, - BIND, - }; - - SOCKET s; - struct sockaddr addr; - - explicit Socket(SOCKET init = INVALID_SOCKET) noexcept; - ~Socket() noexcept; - - operator SOCKET() const noexcept; - - explicit operator bool() const noexcept; - bool is_valid() const noexcept; - - void from_addrinfo(const struct addrinfo &info, AddrAction action = NO_ACTION); - - Socket accept_client() const noexcept; - - void stop_send() const; - - int send_data(const Buffer &data) const; - int recv_data(Buffer &data) const; -}; - -struct Buffer { - std::unique_ptr data; - int size; - - Buffer(int len); - - char* get(); - const char* get() const; - - int len() const; -}; diff --git a/socket/CMakeLists.txt b/socket/CMakeLists.txt new file mode 100644 index 0000000..9d0c496 --- /dev/null +++ b/socket/CMakeLists.txt @@ -0,0 +1,10 @@ +add_library( + wrapper + ./socket.cpp + ./address.cpp +) + +target_link_libraries( + wrapper + PUBLIC ws2_32 +) diff --git a/socket/address.cpp b/socket/address.cpp new file mode 100644 index 0000000..b5be0d8 --- /dev/null +++ b/socket/address.cpp @@ -0,0 +1 @@ +#include "address.hpp" diff --git a/socket/address.hpp b/socket/address.hpp new file mode 100644 index 0000000..73937a1 --- /dev/null +++ b/socket/address.hpp @@ -0,0 +1,71 @@ +#include +#include +#include + +struct AddrInfoPtr { + struct addrinfo *info; + + AddrInfoPtr() noexcept: + info(nullptr) {} + ~AddrInfoPtr() noexcept { + freeaddrinfo(info); + } + + addrinfo** operator&() noexcept { + return &info; + } + addrinfo& operator*() noexcept { + return *info; + } + addrinfo* operator->() noexcept { + return info; + } + const addrinfo& operator*() const noexcept { + return *info; + } + + operator addrinfo*() noexcept { + return info; + } +}; + +struct AddrInfo { + struct addrinfo info; + + static AddrInfoPtr get_local_addrinfo(PCSTR port) { + AddrInfo hints; + + hints->ai_family = AF_INET; + hints->ai_socktype = SOCK_STREAM; + hints->ai_protocol = IPPROTO_TCP; + hints->ai_flags = AI_PASSIVE; + + return hints.get_addrinfo(NULL, port); + } + + AddrInfo() noexcept { + ZeroMemory(&info, sizeof(info)); + } + ~AddrInfo() noexcept = default; + + addrinfo* operator->() noexcept { + return &info; + } + addrinfo* operator&() noexcept { + return &info; + } + + operator const addrinfo&() const noexcept { + return info; + } + operator addrinfo&() noexcept { + return info; + } + + AddrInfoPtr get_addrinfo(PCSTR node, PCSTR service) { + AddrInfoPtr ptr; + int result = getaddrinfo(node, service, &info, &ptr); + if (result == SOCKET_ERROR) throw result; + return ptr; + } +}; diff --git a/socket/socket.cpp b/socket/socket.cpp new file mode 100644 index 0000000..3888cf2 --- /dev/null +++ b/socket/socket.cpp @@ -0,0 +1,21 @@ +#include "socket.hpp" + +void Socket::from_addrinfo(const addrinfo &info, AddrAction action) { + s = socket(info.ai_family, info.ai_socktype, info.ai_protocol); + if (s == INVALID_SOCKET) throw -1; + int result = SOCKET_ERROR; + switch (action) { + case NO_ACTION: + break; + case CONNECT: + result = connect(s, info.ai_addr, (int)info.ai_addrlen); + if (result == SOCKET_ERROR) throw result; + break; + case BIND: + result = bind(s, info.ai_addr, (int)info.ai_addrlen); + if (result == SOCKET_ERROR) throw result; + result = listen(s, SOMAXCONN); + if (result == SOCKET_ERROR) throw result; + break; + } +} diff --git a/socket/socket.hpp b/socket/socket.hpp new file mode 100644 index 0000000..edb8429 --- /dev/null +++ b/socket/socket.hpp @@ -0,0 +1,83 @@ +#include + +#include +#include +#include + +#include + +struct WSA { + WSADATA wsa; + + explicit WSA(WORD version = MAKEWORD(2, 2)) { + int result = WSAStartup(version, &wsa); + if (result) throw result; + } + ~WSA() noexcept { + WSACleanup(); + } +}; + +struct Buffer { + std::vector data; + + explicit Buffer(int len): + data(len, 0) {} + + char* get() noexcept { + return data.data(); + } + const char* get() const noexcept { + return data.data(); + } + + int len() const noexcept { + return data.size(); + } +}; + +struct Socket { + enum AddrAction { + NO_ACTION, + CONNECT, + BIND, + }; + + SOCKET s; + struct sockaddr addr; + + explicit Socket(SOCKET init = INVALID_SOCKET) noexcept: + s(init) {} + ~Socket() noexcept { + closesocket(s); + } + + operator SOCKET() const noexcept { + return s; + } + + explicit operator bool() const noexcept { + return is_valid(); + } + bool is_valid() const noexcept { + return s != INVALID_SOCKET; + } + + void from_addrinfo(const struct addrinfo &info, AddrAction action = NO_ACTION); + + Socket accept_client() const noexcept { + return Socket(accept(s, NULL, NULL)); + } + + void stop_send() const { + int result = shutdown(s, SD_SEND); + if (result == SOCKET_ERROR) throw result; + } + + int send_data(const Buffer &data) const noexcept { + return send(s, data.get(), data.len(), 0); + } + int recv_data(Buffer &data) const noexcept { + return recv(s, data.get(), data.len(), 0); + } +}; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..8b05db9 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,5 @@ +# ThreadPool + LockFreeQueue test (header-only, no link deps) +add_executable( + test_pool + ./pool.cpp +) diff --git a/test_pool.cpp b/test/pool.cpp similarity index 100% rename from test_pool.cpp rename to test/pool.cpp