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); /** * 连接到服务端