From abc077be9bd5d1c37e29438b39798a60d5939855 Mon Sep 17 00:00:00 2001 From: wyc <1104749580@qq.com> Date: Tue, 23 Jun 2026 09:23:02 +0800 Subject: [PATCH] =?UTF-8?q?tcp=20udp=20=E6=94=B9=E5=8D=8F=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/socket/TCP_Client.cpp | 20 ++++++++++++++++++++ Core/socket/TCP_Client.h | 6 ++++++ Core/socket/TCP_Server.cpp | 32 ++++++++++++++++++++++++++++++++ Core/socket/TCP_Server.h | 8 ++++++++ Core/socket/UDP_Client.cpp | 18 ++++++++++++++++++ Core/socket/UDP_Client.h | 5 +++++ Core/socket/UDP_Server.cpp | 24 ++++++++++++++++++++++++ Core/socket/UDP_Server.h | 6 ++++++ main.cmake | 1 + 9 files changed, 120 insertions(+) diff --git a/Core/socket/TCP_Client.cpp b/Core/socket/TCP_Client.cpp index 3e370ce..62a48ab 100644 --- a/Core/socket/TCP_Client.cpp +++ b/Core/socket/TCP_Client.cpp @@ -115,6 +115,17 @@ void TCP_Client::tick() { } } +ucoro::awaitable TCP_Client::connect_coro() { + auto started = start_connect(); + tick(); + co_return started; +} + +ucoro::awaitable TCP_Client::tick_coro() { + tick(); + co_return; +} + void TCP_Client::start_read() { if (read_pending || state != Connected || !socket || !socket->is_open()) return; @@ -169,12 +180,21 @@ std::string TCP_Client::read() { return ret; } +ucoro::awaitable TCP_Client::read_coro() { + co_return read(); +} + void TCP_Client::send(const std::string& data) { if (data.empty()) return; send_buffer.write_best_effort(data.data(), data.size()); if (state == Connected) start_write(); } +ucoro::awaitable TCP_Client::send_coro(std::string data) { + send(data); + co_return; +} + std::string TCP_Client::to_string() { return "TCP_Client:[" + dest_address.to_string() + "]"; } diff --git a/Core/socket/TCP_Client.h b/Core/socket/TCP_Client.h index b6ce995..49bdc24 100644 --- a/Core/socket/TCP_Client.h +++ b/Core/socket/TCP_Client.h @@ -1,6 +1,8 @@ #pragma once #include "ASIO_Utils.h" +#include + #include #include #include @@ -20,6 +22,10 @@ public: void tick(); std::string read(); void send(const std::string& data); + [[nodiscard]] ucoro::awaitable connect_coro(); + [[nodiscard]] ucoro::awaitable tick_coro(); + [[nodiscard]] ucoro::awaitable read_coro(); + [[nodiscard]] ucoro::awaitable send_coro(std::string data); std::string to_string() override; enum State { diff --git a/Core/socket/TCP_Server.cpp b/Core/socket/TCP_Server.cpp index 558d0d3..48d4df1 100644 --- a/Core/socket/TCP_Server.cpp +++ b/Core/socket/TCP_Server.cpp @@ -1,6 +1,7 @@ #include "TCP_Server.h" #include +#include namespace Psc::asio_socket { @@ -23,6 +24,11 @@ void TCP_Server::tick() { } } +ucoro::awaitable TCP_Server::tick_coro() { + tick(); + co_return; +} + TCP_Server & TCP_Server::set_tcp_no_delay(bool value) { no_delay = value; return *this; @@ -54,6 +60,14 @@ bool TCP_Server::listen(const std::string& ip, std::uint32_t port) { return listen(Sockaddr_In(ip, port)); } +ucoro::awaitable TCP_Server::listen_coro(std::string ip, std::uint32_t port) { + co_return listen(std::move(ip), port); +} + +ucoro::awaitable TCP_Server::listen_coro(Sockaddr_In addr) { + co_return listen(addr); +} + bool TCP_Server::listen(const Sockaddr_In& addr) { if (!acceptor) create(); if (addr.ip.empty() || addr.port == 0) { @@ -121,6 +135,10 @@ std::shared_ptr TCP_Server::accept() const { return nullptr; } +ucoro::awaitable> TCP_Server::accept_coro() const { + co_return accept(); +} + void TCP_Server::start_accept() { if (accept_pending || !acceptor || state != Working || !acceptor->is_open()) return; @@ -240,6 +258,11 @@ void TCP_Server::flush_clients() { } } +ucoro::awaitable TCP_Server::flush_clients_coro() { + flush_clients(); + co_return; +} + void TCP_Server::write_to_all_clients(const std::string& data) { if (data.empty()) return; for (auto& [_, conn] : tcp_clients) { @@ -250,6 +273,11 @@ void TCP_Server::write_to_all_clients(const std::string& data) { } } +ucoro::awaitable TCP_Server::write_to_all_clients_coro(std::string data) { + write_to_all_clients(data); + co_return; +} + std::vector TCP_Server::read_from_all_clients() { std::vector ret; std::array buffer{}; @@ -270,6 +298,10 @@ std::vector TCP_Server::read_from_all_clients() { return ret; } +ucoro::awaitable> TCP_Server::read_from_all_clients_coro() { + co_return read_from_all_clients(); +} + std::vector TCP_Server::client_fds() { std::vector ret; for (const auto& [fd, conn] : tcp_clients) { diff --git a/Core/socket/TCP_Server.h b/Core/socket/TCP_Server.h index 319460e..d8464be 100644 --- a/Core/socket/TCP_Server.h +++ b/Core/socket/TCP_Server.h @@ -2,6 +2,7 @@ #include "ASIO_Utils.h" #include "Core/Statistics/Statistics.h" +#include #include #include @@ -42,8 +43,13 @@ public: TCP_Server& set_recv_system_buffer_size(size_t size); bool listen(const std::string& ip, std::uint32_t port); bool listen(const Sockaddr_In& address); + [[nodiscard]] ucoro::awaitable listen_coro(std::string ip, std::uint32_t port); + [[nodiscard]] ucoro::awaitable listen_coro(Sockaddr_In address); std::string to_string() override; void write_to_all_clients(const std::string& data); + [[nodiscard]] ucoro::awaitable tick_coro(); + [[nodiscard]] ucoro::awaitable flush_clients_coro(); + [[nodiscard]] ucoro::awaitable write_to_all_clients_coro(std::string data); struct Read_Info { Accept_Info info; @@ -61,10 +67,12 @@ public: State state = Not_Created; std::vector read_from_all_clients(); + [[nodiscard]] ucoro::awaitable> read_from_all_clients_coro(); std::vector client_fds(); std::vector> get_all_clients(); void flush_clients(); [[nodiscard]] std::shared_ptr accept() const; + [[nodiscard]] ucoro::awaitable> accept_coro() const; protected: mutable asio::io_context io_context; diff --git a/Core/socket/UDP_Client.cpp b/Core/socket/UDP_Client.cpp index da5211e..cbcb7cd 100644 --- a/Core/socket/UDP_Client.cpp +++ b/Core/socket/UDP_Client.cpp @@ -53,6 +53,10 @@ bool UDP_Client::connect() { return true; } +ucoro::awaitable UDP_Client::connect_coro() { + co_return connect(); +} + std::string UDP_Client::read() { std::string ret(static_cast(read_chunk_size), '\0'); std::size_t out_len = ret.size(); @@ -61,6 +65,10 @@ std::string UDP_Client::read() { return ret; } +ucoro::awaitable UDP_Client::read_coro() { + co_return read(); +} + void UDP_Client::tick() { if (!connected && !connect_pending && !dest_address.ip.empty() && dest_address.port != 0) { connect(); @@ -79,6 +87,11 @@ void UDP_Client::tick() { } } +ucoro::awaitable UDP_Client::tick_coro() { + tick(); + co_return; +} + void UDP_Client::send(const std::string& data) { if (data.empty()) return; send_buffer.write(data.data(), data.size()); @@ -86,6 +99,11 @@ void UDP_Client::send(const std::string& data) { if (connected) start_write(); } +ucoro::awaitable UDP_Client::send_coro(std::string data) { + send(data); + co_return; +} + void UDP_Client::start_read() { if (read_pending || !connected || !socket || !socket->is_open()) return; if (recv_storage.empty()) recv_storage.assign(static_cast(read_chunk_size), 0); diff --git a/Core/socket/UDP_Client.h b/Core/socket/UDP_Client.h index 089afb7..2e50c6c 100644 --- a/Core/socket/UDP_Client.h +++ b/Core/socket/UDP_Client.h @@ -1,6 +1,7 @@ #pragma once #include "ASIO_Utils.h" +#include #include #include @@ -17,6 +18,10 @@ public: std::string read(); void tick(); void send(const std::string& data); + [[nodiscard]] ucoro::awaitable connect_coro(); + [[nodiscard]] ucoro::awaitable read_coro(); + [[nodiscard]] ucoro::awaitable tick_coro(); + [[nodiscard]] ucoro::awaitable send_coro(std::string data); void close(); std::string to_string(); diff --git a/Core/socket/UDP_Server.cpp b/Core/socket/UDP_Server.cpp index 13906cd..1aabe5b 100644 --- a/Core/socket/UDP_Server.cpp +++ b/Core/socket/UDP_Server.cpp @@ -58,6 +58,11 @@ void UDP_Server::tick() { start_write(); } +ucoro::awaitable UDP_Server::tick_coro() { + tick(); + co_return; +} + void UDP_Server::start_read() { if (read_pending || !bound || !socket || !socket->is_open()) return; if (recv_storage.empty()) recv_storage.assign(static_cast(read_chunk_size), 0); @@ -138,11 +143,20 @@ std::vector UDP_Server::read() { return ret; } +ucoro::awaitable> UDP_Server::read_coro() { + co_return read(); +} + void UDP_Server::reply_last_peer(const std::string& data) { if (!has_last_peer) return; send_to(last_peer.ip, static_cast(last_peer.port), data); } +ucoro::awaitable UDP_Server::reply_last_peer_coro(std::string data) { + reply_last_peer(data); + co_return; +} + void UDP_Server::send_to(const std::string& ip, uint16_t port, const std::string& data) { if (data.empty()) return; if (!bound && !bind()) return; @@ -156,10 +170,20 @@ void UDP_Server::send_to(const std::string& ip, uint16_t port, const std::string start_write(); } +ucoro::awaitable UDP_Server::send_to_coro(std::string ip, uint16_t port, std::string data) { + send_to(ip, port, data); + co_return; +} + void UDP_Server::write_to_all_clients(const std::string& msg) { for (const auto& client : clients) { send_to(client.ip, static_cast(client.port), msg); } } +ucoro::awaitable UDP_Server::write_to_all_clients_coro(std::string msg) { + write_to_all_clients(msg); + co_return; +} + } // namespace Psc::asio_socket diff --git a/Core/socket/UDP_Server.h b/Core/socket/UDP_Server.h index 4a66c9d..d9e523b 100644 --- a/Core/socket/UDP_Server.h +++ b/Core/socket/UDP_Server.h @@ -1,6 +1,7 @@ #pragma once #include "ASIO_Utils.h" +#include #include #include @@ -21,6 +22,10 @@ public: void reply_last_peer(const std::string& data); void send_to(const std::string& ip, uint16_t port, const std::string& data); void write_to_all_clients(const std::string& msg); + [[nodiscard]] ucoro::awaitable tick_coro(); + [[nodiscard]] ucoro::awaitable reply_last_peer_coro(std::string data); + [[nodiscard]] ucoro::awaitable send_to_coro(std::string ip, uint16_t port, std::string data); + [[nodiscard]] ucoro::awaitable write_to_all_clients_coro(std::string msg); struct Read_Info { Sockaddr_In peer; @@ -28,6 +33,7 @@ public: }; std::vector read(); + [[nodiscard]] ucoro::awaitable> read_coro(); enum State { Not_Created, diff --git a/main.cmake b/main.cmake index 585b4ce..244ca91 100644 --- a/main.cmake +++ b/main.cmake @@ -107,6 +107,7 @@ else() message(STATUS "Found spdlog: ${spdlog_VERSION}") endif() target_include_directories(Core_Interface INTERFACE "${CMAKE_CURRENT_LIST_DIR}") +target_include_directories(Core_Interface INTERFACE "${CMAKE_CURRENT_LIST_DIR}/3rd/ucoro/include") target_include_directories(Core_Interface INTERFACE ${3rd_dir}/magic_enum/magic_enum/include) target_compile_definitions(Core_Interface INTERFACE SPDLOG_COMPILED_LIB) target_compile_definitions(Core_Interface INTERFACE INCL_EXTRA_HTON_FUNCTIONS)