From 98a7ef7d41f34340fee5b8a33287cd0b919f8c90 Mon Sep 17 00:00:00 2001 From: Kieran Kihn <114803508+kierankihn@users.noreply.github.com> Date: Tue, 9 Dec 2025 19:42:26 +0800 Subject: [PATCH] feat(network): add async connect with onConnect callback - Replaced synchronous `connect` with asynchronous connection logic. - Introduced `onConnect` callback to handle connection success events. - Ensured proper `io_context` work guard management. --- src/network/NetworkClient.cpp | 30 ++++++++++++++++++++++-------- src/network/NetworkClient.h | 5 ++++- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/network/NetworkClient.cpp b/src/network/NetworkClient.cpp index f3f28f1..6d205fd 100644 --- a/src/network/NetworkClient.cpp +++ b/src/network/NetworkClient.cpp @@ -7,21 +7,34 @@ #include "NetworkClient.h" #include +#include #include #include namespace UNO::NETWORK { - NetworkClient::NetworkClient(std::function callback) : callback_(std::move(callback)) {} + NetworkClient::NetworkClient(std::function onConnect, std::function callback) : + onConnected_(std::move(onConnect)), callback_(std::move(callback)), workGuard_(asio::make_work_guard(io_context_)) + { + } void NetworkClient::connect(const std::string &host, uint16_t port) { - io_context_.restart(); - asio::ip::tcp::socket socket(io_context_); - asio::ip::tcp::resolver resolver(io_context_); - auto endpoints = resolver.resolve(host, std::to_string(port)); - asio::connect(socket, endpoints); - this->session_ = std::make_shared(std::move(socket)); - this->session_->start(callback_); + auto socket = std::make_shared(io_context_); + auto resolver = std::make_shared(io_context_); + resolver->async_resolve(host, + std::to_string(port), + [this, resolver, socket](const asio::error_code &ec, const asio::ip::tcp::resolver::results_type &results) { + if (!ec) { + asio::async_connect( + *socket, results, [this, socket](const asio::error_code &ec, const asio::ip::tcp::endpoint &) { + if (!ec) { + this->session_ = std::make_shared(std::move(*socket)); + this->session_->start(callback_); + this->onConnected_(); + } + }); + } + }); } @@ -37,6 +50,7 @@ namespace UNO::NETWORK { void NetworkClient::stop() { + this->workGuard_.reset(); this->io_context_.stop(); } } // namespace UNO::NETWORK diff --git a/src/network/NetworkClient.h b/src/network/NetworkClient.h index 8dbf4f0..ee2c561 100644 --- a/src/network/NetworkClient.h +++ b/src/network/NetworkClient.h @@ -14,12 +14,15 @@ namespace UNO::NETWORK { class NetworkClient { private: asio::io_context io_context_; + asio::executor_work_guard workGuard_; + + std::function onConnected_; std::function callback_; std::shared_ptr session_; public: - explicit NetworkClient(std::function callback); + NetworkClient(std::function onConnect, std::function callback); /** * 连接到服务端