From 2b94ff35ded749abc4a673757d5d778784a9d9f1 Mon Sep 17 00:00:00 2001 From: Yangosoft Date: Fri, 27 Dec 2024 19:48:01 +0100 Subject: [PATCH 1/3] WIP Win sockets --- examples/CMakeLists.txt | 2 + examples/shared_memory/CMakeLists.txt | 15 ++ examples/shared_memory/src/main.cpp | 96 +++++----- src/CMakeLists.txt | 12 +- .../cpputils2/linux/net/socket/socket.hpp | 2 +- .../{linux => }/net/socket/isocket.hpp | 15 +- .../cpputils2/win/net/socket/socket.hpp | 106 +++++++++++ .../win/net/socket/tcpsocketclient.hpp | 106 +++++++++++ .../win/net/socket/tcpsocketserver.hpp | 170 ++++++++++++++++++ src/include/cpputils2/win/shm/shm.hpp | 83 +++++---- src/test/cpputils2_tests.cpp | 115 +++++++----- 11 files changed, 583 insertions(+), 139 deletions(-) rename src/include/cpputils2/{linux => }/net/socket/isocket.hpp (77%) create mode 100644 src/include/cpputils2/win/net/socket/socket.hpp create mode 100644 src/include/cpputils2/win/net/socket/tcpsocketclient.hpp create mode 100644 src/include/cpputils2/win/net/socket/tcpsocketserver.hpp diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 5a4dff5..cb3c7f7 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,3 +1,5 @@ +cmake_minimum_required(VERSION 3.14) + Include(FetchContent) FetchContent_Declare( spdlog diff --git a/examples/shared_memory/CMakeLists.txt b/examples/shared_memory/CMakeLists.txt index 7dee61c..14181ee 100644 --- a/examples/shared_memory/CMakeLists.txt +++ b/examples/shared_memory/CMakeLists.txt @@ -1,6 +1,21 @@ +cmake_minimum_required(VERSION 3.14) project(example_shared_memory VERSION 1.0.0 LANGUAGES CXX) +if(NOT TARGET CPPUTILS2::cpputils2) + find_package(cpputils2 REQUIRED) + + Include(FetchContent) +FetchContent_Declare( + spdlog + GIT_REPOSITORY https://github.com/gabime/spdlog.git + GIT_TAG v1.x +) + +FetchContent_MakeAvailable(spdlog) +endif() + + add_executable(shared_memory src/main.cpp) target_link_libraries(shared_memory PRIVATE CPPUTILS2::cpputils2 spdlog::spdlog) \ No newline at end of file diff --git a/examples/shared_memory/src/main.cpp b/examples/shared_memory/src/main.cpp index 67ce186..9b68a9c 100644 --- a/examples/shared_memory/src/main.cpp +++ b/examples/shared_memory/src/main.cpp @@ -11,51 +11,53 @@ const int32_t expected = 42; const std::string file_name("test_shm"); -int main(int argc, char** argv) { - SPDLOG_INFO("Test shared memory"); - - CppUtils2::Shm shm(file_name); - auto ret = shm.allocate(sizeof(int32_t)); - if (ret == CppUtils2::Result::RET_ERROR) { - SPDLOG_ERROR("Error"); - return 1; - } - - void* ptr = shm.get_raw_ptr(); - if (ptr == nullptr) { - SPDLOG_ERROR("Error"); - return 1; - } - int32_t* ptr_int = reinterpret_cast(ptr); - SPDLOG_INFO("ptr_int: {}", *ptr_int); - *ptr_int = expected; - - int32_t val = *ptr_int; - - - - CppUtils2::Shm shm2("test_shm"); - ret = shm2.open_existing(sizeof(int32_t)); - if (ret == CppUtils2::Result::RET_ERROR) - { - SPDLOG_ERROR("Error"); - return 1; - } - ptr = shm2.get_raw_ptr(); - ptr_int = reinterpret_cast(ptr); - - SPDLOG_INFO("ptr_int: {}", *ptr_int); - - val = *ptr_int; - - SPDLOG_INFO("val: {} expected: {}", val, expected); - if (val != expected) { - SPDLOG_ERROR("Error"); - return 1; - } - shm2.close(); - shm.close(); - shm.unlink(); - - return 0; +int main(int argc, char **argv) +{ + SPDLOG_INFO("Test shared memory"); + + CppUtils2::Shm shm(file_name); + auto ret = shm.allocate(sizeof(int32_t)); + if (ret == CppUtils2::Result::RET_ERROR) + { + SPDLOG_ERROR("Error"); + return 1; + } + + void *ptr = shm.get_raw_ptr(); + if (ptr == nullptr) + { + SPDLOG_ERROR("Error"); + return 1; + } + int32_t *ptr_int = reinterpret_cast(ptr); + SPDLOG_INFO("ptr_int: {}", *ptr_int); + *ptr_int = expected; + + int32_t val = *ptr_int; + + CppUtils2::Shm shm2("test_shm"); + ret = shm2.open_existing(sizeof(int32_t)); + if (ret == CppUtils2::Result::RET_ERROR) + { + SPDLOG_ERROR("Error"); + return 1; + } + ptr = shm2.get_raw_ptr(); + ptr_int = reinterpret_cast(ptr); + + SPDLOG_INFO("ptr_int: {}", *ptr_int); + + val = *ptr_int; + + SPDLOG_INFO("val: {} expected: {}", val, expected); + if (val != expected) + { + SPDLOG_ERROR("Error"); + return 1; + } + shm2.close(); + shm.close(); + shm.unlink(); + + return 0; } \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9a7e9a3..c9403a0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -20,12 +20,19 @@ set(SOURCES_AND_HEADERS include/cpputils2/common/types.hpp include/cpputils2/trigger/trigger.hpp include/cpputils2/file/file.hpp - + include/cpputils2/net/socket/isocket.hpp ) if (WIN32) -list(APPEND SOURCES_AND_HEADERS include/cpputils2/win/shm/shm.hpp) + +list(APPEND SOURCES_AND_HEADERS + include/cpputils2/win/shm/shm.hpp + include/cpputils2/win/net/socket/socket.hpp + include/cpputils2/win/net/socket/tcpsocketclient.hpp + include/cpputils2/win/net/socket/tcpsocketserver.hpp) + else() + list(APPEND SOURCES_AND_HEADERS include/cpputils2/linux/net/socket/tcpsocketclient.hpp include/cpputils2/linux/net/socket/tcpsocketserver.hpp @@ -39,6 +46,7 @@ else() include/cpputils2/linux/futex/futex.hpp include/cpputils2/linux/futex/shared_futex.hpp ) + endif() add_library(cpputils2 INTERFACE diff --git a/src/include/cpputils2/linux/net/socket/socket.hpp b/src/include/cpputils2/linux/net/socket/socket.hpp index 49fca63..4fedaf7 100644 --- a/src/include/cpputils2/linux/net/socket/socket.hpp +++ b/src/include/cpputils2/linux/net/socket/socket.hpp @@ -1,6 +1,6 @@ #pragma once -#include "cpputils2/linux/net/socket/isocket.hpp" +#include "cpputils2/net/socket/isocket.hpp" #include "spdlog/sinks/stdout_color_sinks.h" #include "spdlog/spdlog.h" diff --git a/src/include/cpputils2/linux/net/socket/isocket.hpp b/src/include/cpputils2/net/socket/isocket.hpp similarity index 77% rename from src/include/cpputils2/linux/net/socket/isocket.hpp rename to src/include/cpputils2/net/socket/isocket.hpp index b4c3c34..4ccafe9 100644 --- a/src/include/cpputils2/linux/net/socket/isocket.hpp +++ b/src/include/cpputils2/net/socket/isocket.hpp @@ -1,13 +1,18 @@ #pragma once #include +#include #include -#include "spdlog/sinks/stdout_color_sinks.h" -#include "spdlog/spdlog.h" - -#include -#include +#ifdef _WIN32 +using ssize_t = std::int32_t; +#else +#include +#include +#include +#include +#include +#endif namespace CppUtils2 { diff --git a/src/include/cpputils2/win/net/socket/socket.hpp b/src/include/cpputils2/win/net/socket/socket.hpp new file mode 100644 index 0000000..8ff5f68 --- /dev/null +++ b/src/include/cpputils2/win/net/socket/socket.hpp @@ -0,0 +1,106 @@ +#pragma once + +#include "cpputils2/net/socket/isocket.hpp" + +#include + +#include +#include +#include +#include + +namespace CppUtils2 +{ + namespace net + { + + class Socket : public ISocket + { + public: + Socket() : sock(INVALID_SOCKET) {}; + + Socket(SOCKET s) : sock(s) {}; + + void disconnect() override + { + if (sock != INVALID_SOCKET) + { + auto iResult = shutdown(sock, SD_SEND); + + // printf("shutdown failed with error: %d\n", WSAGetLastError()); + closesocket(sock); + WSACleanup(); + sock = INVALID_SOCKET; + } + } + + ssize_t write_data(const void *data, ssize_t size) override + { + auto iResult = send(sock, reinterpret_cast(data), size, 0); + if (iResult == SOCKET_ERROR) + { + return -1; + } + return iResult; + } + + bool write_string(const std::string &data) override + { + return write_data(data.c_str(), data.size()) != -1; + } + + ssize_t read_data(void *buffer, ssize_t size) const override + { + auto iResult = recv(sock, reinterpret_cast(buffer), size, 0); + if (iResult == SOCKET_ERROR) + { + return -1; + } + + return iResult; + } + + bool read_string(std::string &data) const override + { + char buffer[1024]; + int iResult; + do + { + iResult = recv(sock, buffer, 1024, 0); + if (iResult > 0) + { + data.append(buffer, iResult); + } + else if (iResult == 0) + { + return false; + } + else + { + return false; + } + } while (iResult != 0); + + return true; + } + + std::int32_t get_socket_fd() const override + { + return 0; + } + + SOCKET get_socket_handle() const + { + return sock; + } + + virtual ~Socket() + { + disconnect(); + }; + + protected: + SOCKET sock; + }; + } // namespace net +} // namespace CppUtils2 diff --git a/src/include/cpputils2/win/net/socket/tcpsocketclient.hpp b/src/include/cpputils2/win/net/socket/tcpsocketclient.hpp new file mode 100644 index 0000000..72da246 --- /dev/null +++ b/src/include/cpputils2/win/net/socket/tcpsocketclient.hpp @@ -0,0 +1,106 @@ +#pragma once +#pragma comment(lib, "Ws2_32.lib") +#pragma comment(lib, "Mswsock.lib") +#pragma comment(lib, "AdvApi32.lib") + +#include "cpputils2/common/types.hpp" +#include "cpputils2/win/net/socket/socket.hpp" + +#include +#include + +#include +#include +#include +#include + +namespace CppUtils2 +{ + namespace net + { + + class TCPSocketClient : public Socket + { + public: + TCPSocketClient() : Socket() {}; + + TCPSocketClient(std::string hostname, std::uint16_t port) : Socket(), host(std::move(hostname)), port(port) {}; + + virtual Result connect(const std::string &hostname, std::uint16_t port) + { + host = hostname; + this->port = port; + return connect(); + } + + virtual Result connect() + { + addrinfo *result = nullptr, + *ptr = nullptr, + hints; + + // Initialize Winsock + auto iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (iResult != 0) + { + // printf("WSAStartup failed with error: %d\n", iResult); + return Result::RET_ERROR; + } + ZeroMemory(&hints, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + // Resolve the server address and port + iResult = getaddrinfo(host.c_str(), std::to_string(port).c_str(), &hints, &result); + if (iResult != 0) + { + // printf("getaddrinfo failed with error: %d\n", iResult); + WSACleanup(); + return Result::RET_ERROR; + } + // Attempt to connect to an address until one succeeds + for (ptr = result; ptr != nullptr; ptr = ptr->ai_next) + { + + // Create a SOCKET for connecting to server + sock = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); + if (sock == INVALID_SOCKET) + { + // printf("socket failed with error: %ld\n", WSAGetLastError()); + WSACleanup(); + return Result::RET_ERROR; + } + + // Connect to server. + iResult = ::connect(sock, ptr->ai_addr, (int)ptr->ai_addrlen); + if (iResult == SOCKET_ERROR) + { + closesocket(sock); + sock = INVALID_SOCKET; + continue; + } + break; + } + + freeaddrinfo(result); + + if (sock == INVALID_SOCKET) + { + return Result::RET_ERROR; + } + return Result::RET_OK; + } + + virtual ~TCPSocketClient() + { + disconnect(); + }; + + private: + std::string host; + std::uint16_t port; + WSADATA wsaData; + }; + } // namespace net +} // namespace CppUtils2 diff --git a/src/include/cpputils2/win/net/socket/tcpsocketserver.hpp b/src/include/cpputils2/win/net/socket/tcpsocketserver.hpp new file mode 100644 index 0000000..b428c25 --- /dev/null +++ b/src/include/cpputils2/win/net/socket/tcpsocketserver.hpp @@ -0,0 +1,170 @@ +#pragma once +#pragma comment(lib, "Ws2_32.lib") + +#include "cpputils2/common/types.hpp" +#include "cpputils2/win/net/socket/socket.hpp" + +#include +#include +#include + +#include +#include +#include +#include + +namespace CppUtils2 +{ + namespace net + { + + class TCPSocketServer + { + public: + using OnNewClientCallback = std::function fdClient)>; + TCPSocketServer(std::uint16_t port, OnNewClientCallback onNewClientCallback) + : sock(INVALID_SOCKET), port(port), fn_callback(std::move(onNewClientCallback)) + { + addrinfo *result; + addrinfo hints; + + // Initialize Winsock + auto iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (iResult != 0) + { + // printf("WSAStartup failed with error: %d\n", iResult); + return; + } + + ZeroMemory(&hints, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + hints.ai_flags = AI_PASSIVE; + + // Resolve the server address and port + iResult = getaddrinfo(nullptr, std::to_string(port).c_str(), &hints, &result); + if (iResult != 0) + { + // printf("getaddrinfo failed with error: %d\n", iResult); + WSACleanup(); + return; + } + + // Create a SOCKET for the server to listen for client connections. + sock = socket(result->ai_family, result->ai_socktype, result->ai_protocol); + if (sock == INVALID_SOCKET) + { + // printf("socket failed with error: %ld\n", WSAGetLastError()); + freeaddrinfo(result); + WSACleanup(); + return; + } + // Setup the TCP listening socket + iResult = bind(sock, result->ai_addr, (int)result->ai_addrlen); + if (iResult == SOCKET_ERROR) + { + // printf("bind failed with error: %d\n", WSAGetLastError()); + freeaddrinfo(result); + closesocket(sock); + WSACleanup(); + sock = INVALID_SOCKET; + return; + } + + freeaddrinfo(result); + } + + TCPSocketServer(const TCPSocketServer &other) + { + sock = other.sock; + port = other.port; + fn_callback = other.fn_callback; + } + + TCPSocketServer &operator=(const TCPSocketServer &other) + { + sock = other.sock; + port = other.port; + fn_callback = other.fn_callback; + + return *this; + } + + virtual std::int32_t listen() + { + + auto iResult = ::listen(sock, SOMAXCONN); + if (iResult == SOCKET_ERROR) + { + // printf("listen failed with error: %d\n", WSAGetLastError()); + closesocket(sock); + WSACleanup(); + sock = INVALID_SOCKET; + return -1; + } + return 0; + } + + virtual void do_accept() + { + // std::int32_t fdClient = accept(fd_socket, nullptr, nullptr); + // if (fdClient > 0) + //{ + // auto s = std::make_unique(fdClient); + // fn_callback(std::move(s)); + //} + + // Accept a client socket + SOCKET ClientSocket = accept(sock, nullptr, nullptr); + if (ClientSocket == INVALID_SOCKET) + { + // printf("accept failed with error: %d\n", WSAGetLastError()); + closesocket(sock); + WSACleanup(); + sock = INVALID_SOCKET; + return; + } + auto s = std::make_unique(ClientSocket); + fn_callback(std::move(s)); + } + + virtual std::int32_t get_socket_fd() const + { + return -1; + } + + Socket get_socket_handle() const + { + return sock; + } + + virtual void disconnect() + { + if (sock != INVALID_SOCKET) + { + shutdown(sock, SD_SEND); + closesocket(sock); + WSACleanup(); + sock = INVALID_SOCKET; + } + } + + virtual bool is_listening() const + { + return sock != INVALID_SOCKET; + } + + virtual ~TCPSocketServer() + { + disconnect(); + } + + protected: + SOCKET sock; + std::uint16_t port; + OnNewClientCallback fn_callback; + WSADATA wsaData; + }; + } // namespace net +} // namespace CppUtils2 diff --git a/src/include/cpputils2/win/shm/shm.hpp b/src/include/cpputils2/win/shm/shm.hpp index a135f8f..34e670d 100644 --- a/src/include/cpputils2/win/shm/shm.hpp +++ b/src/include/cpputils2/win/shm/shm.hpp @@ -1,8 +1,6 @@ /** * @file shm.hpp * @brief Shared memory abstraction for POSIX systems. - * - * */ #pragma once @@ -11,15 +9,14 @@ #include -#include -#include #include +#include #include +#include namespace CppUtils2 { - class Shm { public: @@ -28,23 +25,21 @@ namespace CppUtils2 { } - Shm(const std::string& file_mem_path) - : mem_path(file_mem_path.begin(), file_mem_path.end()), hMapFile(nullptr), pBuf{ nullptr } + Shm(const std::string &file_mem_path) + : mem_path(file_mem_path.begin(), file_mem_path.end()), hMapFile(nullptr), pBuf{nullptr} { } - Shm(const std::wstring& file_mem_path) - : mem_path(file_mem_path), hMapFile(nullptr), pBuf{ nullptr } + Shm(const std::wstring &file_mem_path) + : mem_path(file_mem_path), hMapFile(nullptr), pBuf{nullptr} { } - - /// @brief Open an existing shared memory - /// @param file_mem_path Path to the shared memory - /// @param mem_size Size of the shared memory - /// @return 0 on success, -1 on error - Result open_existing(const std::wstring& file_mem_path, std::size_t mem_size) + /// @param file_mem_path Path to the shared memory + /// @param mem_size Size of the shared memory + /// @return 0 on success, -1 on error + Result open_existing(const std::wstring &file_mem_path, std::size_t mem_size) { mem_path = file_mem_path; return open_existing(mem_size); @@ -103,7 +98,7 @@ namespace CppUtils2 /// @brief Get the pointer to the shared memory /// @return Pointer to the shared memory - void* get_raw_ptr() + void *get_raw_ptr() { return pBuf; } @@ -117,7 +112,7 @@ namespace CppUtils2 std::wstring mem_path; HANDLE hMapFile; LPVOID pBuf; - enum class Operation: int + enum class Operation : int { OPEN, CREATE @@ -125,25 +120,30 @@ namespace CppUtils2 Result shared_open(Operation flags, std::size_t mem_size) { - if (flags == Operation::CREATE) { + if (flags == Operation::CREATE) + { + //(yangosoft) Fix the mem_size split into 2 words + DWORD high = (mem_size >> 32) & 0xFFFFFFFF; + DWORD low = mem_size & 0xFFFFFFFF; + hMapFile = CreateFileMapping( - INVALID_HANDLE_VALUE, // use paging file - nullptr, // default security - PAGE_READWRITE, // read/write access - 0, // maximum object size (high-order DWORD) - mem_size, // maximum object size (low-order DWORD) - (LPCTSTR)mem_path.c_str()); // name of mapping object - + INVALID_HANDLE_VALUE, // use paging file + nullptr, // default security + PAGE_READWRITE, // read/write access + high, // maximum object size (high-order DWORD) + low, // maximum object size (low-order DWORD) + (LPCTSTR)mem_path.c_str()); // name of mapping object + if (hMapFile == NULL) { return Result::RET_ERROR; } - pBuf = MapViewOfFile(hMapFile, // handle to map object - FILE_MAP_ALL_ACCESS, // read/write permission - 0, - 0, - mem_size); + pBuf = MapViewOfFile(hMapFile, // handle to map object + FILE_MAP_ALL_ACCESS, // read/write permission + 0, + 0, + mem_size); if (pBuf == nullptr) { @@ -151,14 +151,14 @@ namespace CppUtils2 CloseHandle(hMapFile); return Result::RET_ERROR; } - } - else { + else + { hMapFile = OpenFileMapping( - FILE_MAP_ALL_ACCESS, // read/write access - FALSE, // do not inherit the name - (LPCTSTR)mem_path.c_str()); // name of mapping object + FILE_MAP_ALL_ACCESS, // read/write access + FALSE, // do not inherit the name + (LPCTSTR)mem_path.c_str()); // name of mapping object if (hMapFile == NULL) { @@ -167,22 +167,19 @@ namespace CppUtils2 return Result::RET_ERROR; } - pBuf = MapViewOfFile(hMapFile, // handle to map object - FILE_MAP_ALL_ACCESS, // read/write permission - 0, - 0, - mem_size); + pBuf = MapViewOfFile(hMapFile, // handle to map object + FILE_MAP_ALL_ACCESS, // read/write permission + 0, + 0, + mem_size); if (pBuf == nullptr) { //_tprintf(TEXT("Could not map view of file (%d).\n"), // GetLastError()); - CloseHandle(hMapFile); - return Result::RET_ERROR; } - } return Result::RET_OK; } diff --git a/src/test/cpputils2_tests.cpp b/src/test/cpputils2_tests.cpp index 6044e72..d20903a 100644 --- a/src/test/cpputils2_tests.cpp +++ b/src/test/cpputils2_tests.cpp @@ -18,6 +18,8 @@ #endif #ifdef _WIN32 +#include "cpputils2/win/net/socket/tcpsocketclient.hpp" +#include "cpputils2/win/net/socket/tcpsocketserver.hpp" #include "cpputils2/win/shm/shm.hpp" #endif @@ -144,52 +146,83 @@ namespace #endif #ifdef _WIN32 - TEST(ExampleSHM, TestSHM) { - CppUtils2::Shm shm(L"test_shm"); - auto ret = shm.allocate(sizeof(int32_t)); - EXPECT_NE(ret, CppUtils2::Result::RET_ERROR); - void* ptr = shm.get_raw_ptr(); - EXPECT_NE(ptr, nullptr); - int32_t* ptr_int = reinterpret_cast(ptr); - std::cout << "ptr_int: " << *ptr_int << std::endl; - *ptr_int = 42; - int32_t val = *ptr_int; - EXPECT_EQ(val, 42); - shm.close(); - shm.unlink(); - EXPECT_TRUE(true); + TEST(ExampleSHM, TestSHM) + { + CppUtils2::Shm shm(L"test_shm"); + auto ret = shm.allocate(sizeof(int32_t)); + EXPECT_NE(ret, CppUtils2::Result::RET_ERROR); + void *ptr = shm.get_raw_ptr(); + EXPECT_NE(ptr, nullptr); + int32_t *ptr_int = reinterpret_cast(ptr); + std::cout << "ptr_int: " << *ptr_int << std::endl; + *ptr_int = 42; + int32_t val = *ptr_int; + EXPECT_EQ(val, 42); + shm.close(); + shm.unlink(); + EXPECT_TRUE(true); } TEST(ExampleShm, TestExisting) { - CppUtils2::Shm shm(L"test_shm"); - auto ret = shm.allocate(sizeof(int32_t)); - EXPECT_NE(ret, CppUtils2::Result::RET_ERROR); - - void* ptr = shm.get_raw_ptr(); - EXPECT_NE(ptr, nullptr); - int32_t* ptr_int = reinterpret_cast(ptr); - std::cout << "ptr_int: " << *ptr_int << std::endl; - *ptr_int = 42; - - int32_t val = *ptr_int; - EXPECT_EQ(val, 42); - - - - CppUtils2::Shm shm2("test_shm"); - ret = shm2.open_existing(sizeof(int32_t)); - EXPECT_NE(ret, CppUtils2::Result::RET_ERROR); - ptr = shm2.get_raw_ptr(); - ptr_int = reinterpret_cast(ptr); - std::cout << "ptr_int: " << *ptr_int << std::endl; - - val = *ptr_int; - EXPECT_EQ(val, 42); - shm2.close(); - shm.close(); - shm.unlink(); + CppUtils2::Shm shm(L"test_shm"); + auto ret = shm.allocate(sizeof(int32_t)); + EXPECT_NE(ret, CppUtils2::Result::RET_ERROR); + + void *ptr = shm.get_raw_ptr(); + EXPECT_NE(ptr, nullptr); + int32_t *ptr_int = reinterpret_cast(ptr); + std::cout << "ptr_int: " << *ptr_int << std::endl; + *ptr_int = 42; + + int32_t val = *ptr_int; + EXPECT_EQ(val, 42); + + CppUtils2::Shm shm2("test_shm"); + ret = shm2.open_existing(sizeof(int32_t)); + EXPECT_NE(ret, CppUtils2::Result::RET_ERROR); + ptr = shm2.get_raw_ptr(); + ptr_int = reinterpret_cast(ptr); + std::cout << "ptr_int: " << *ptr_int << std::endl; + + val = *ptr_int; + EXPECT_EQ(val, 42); + shm2.close(); + shm.close(); + shm.unlink(); } + + TEST(ExampleTCPClient, TestTCPClient) + { + CppUtils2::net::TCPSocketServer server(9999, [](std::unique_ptr fdClient) + { + std::string data; + fdClient->read_string(data); + std::cout << "Received: " << data << std::endl; + fdClient->write_string("World"); + fdClient->disconnect(); }); + + std::thread t([&server]() + { + auto ret = server.listen(); + EXPECT_EQ(ret, 0); + server.do_accept(); }); + + CppUtils2::net::TCPSocketClient client; + auto ret = client.connect("localhost", 9999); + EXPECT_NE(ret, CppUtils2::Result::RET_ERROR); + client.write_string("Hello"); + + /*char buffer[1024]; + auto ret2 = client.read_data(buffer, 1024); + EXPECT_NE(ret2, -1); + std::string data(buffer); + std::cout << "Received: " << data << std::endl; +*/ + client.disconnect(); + t.join(); + } + #endif TEST(ExampleTrigger, TestTrigger) From eea1ec4397e3d4644d238f8e82c300880f9f882b Mon Sep 17 00:00:00 2001 From: Yangosoft Date: Fri, 27 Dec 2024 19:50:55 +0100 Subject: [PATCH 2/3] Fixed wrong path --- src/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c9403a0..8c6556e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -39,7 +39,6 @@ else() include/cpputils2/linux/net/socket/udpsocketserver.hpp include/cpputils2/linux/net/socket/udpsocketclient.hpp include/cpputils2/linux/net/socket/socket.hpp - include/cpputils2/linux/net/socket/isocket.hpp include/cpputils2/linux/net/socket/udsclient.hpp include/cpputils2/linux/net/socket/udsserver.hpp include/cpputils2/linux/shm/shm.hpp From 55ef1639a6e891bdcaf5de89eb92dba2a78f0b76 Mon Sep 17 00:00:00 2001 From: Yangosoft Date: Fri, 27 Dec 2024 19:52:55 +0100 Subject: [PATCH 3/3] Fixed wrong path --- src/include/cpputils2/linux/net/socket/dgramsocket.hpp | 2 +- src/include/cpputils2/linux/net/socket/udpsocketserver.hpp | 2 +- src/include/cpputils2/linux/net/socket/udsclient.hpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/include/cpputils2/linux/net/socket/dgramsocket.hpp b/src/include/cpputils2/linux/net/socket/dgramsocket.hpp index cd55307..20966ba 100644 --- a/src/include/cpputils2/linux/net/socket/dgramsocket.hpp +++ b/src/include/cpputils2/linux/net/socket/dgramsocket.hpp @@ -1,6 +1,6 @@ #pragma once -#include "cpputils2/linux/net/socket/isocket.hpp" +#include "cpputils2/net/socket/isocket.hpp" #include "spdlog/sinks/stdout_color_sinks.h" #include "spdlog/spdlog.h" diff --git a/src/include/cpputils2/linux/net/socket/udpsocketserver.hpp b/src/include/cpputils2/linux/net/socket/udpsocketserver.hpp index f9ec9fb..041871b 100644 --- a/src/include/cpputils2/linux/net/socket/udpsocketserver.hpp +++ b/src/include/cpputils2/linux/net/socket/udpsocketserver.hpp @@ -1,7 +1,7 @@ #pragma once #include "cpputils2/common/types.hpp" -#include "cpputils2/linux/net/socket/isocket.hpp" +#include "cpputils2/net/socket/isocket.hpp" #include "spdlog/sinks/stdout_color_sinks.h" #include "spdlog/spdlog.h" diff --git a/src/include/cpputils2/linux/net/socket/udsclient.hpp b/src/include/cpputils2/linux/net/socket/udsclient.hpp index 78ccd11..8e4abad 100644 --- a/src/include/cpputils2/linux/net/socket/udsclient.hpp +++ b/src/include/cpputils2/linux/net/socket/udsclient.hpp @@ -1,6 +1,6 @@ #pragma once -#include "cpputils2/linux/net/socket/isocket.hpp" +#include "cpputils2/net/socket/isocket.hpp" #include "spdlog/sinks/stdout_color_sinks.h" #include "spdlog/spdlog.h"