From 5201028218eb2ad108f550f06de4e112f021aa37 Mon Sep 17 00:00:00 2001 From: taynpg Date: Tue, 24 Mar 2026 17:20:21 +0800 Subject: [PATCH] =?UTF-8?q?=E9=93=BE=E6=8E=A5=E5=A4=84=E7=90=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ClientCore/ClientCore.cpp | 63 ++++++++++++++++++++++++++++++--------- ClientCore/ClientCore.h | 2 +- 2 files changed, 50 insertions(+), 15 deletions(-) diff --git a/ClientCore/ClientCore.cpp b/ClientCore/ClientCore.cpp index 2342321..193146b 100644 --- a/ClientCore/ClientCore.cpp +++ b/ClientCore/ClientCore.cpp @@ -22,31 +22,66 @@ void ClientCore::DoConnect(const QString& ip, quint16 port) { // qDebug() << "doConnect thread:" << QThread::currentThread(); emit connecting(); - if (!Connect(ip, port)) { - emit conFailed(); - return; - } - emit conSuccess(); + asio::co_spawn( + mSocket_.get_executor(), + [this, ip, port]() -> asio::awaitable { + try { + bool success = co_await Connect(ip, port); + + QMetaObject::invokeMethod(this, [this, success]() { + if (success) { + emit conSuccess(); + } else { + emit conFailed(); + } + }); + } catch (const std::exception& ex) { + QString error = ex.what(); + QMetaObject::invokeMethod(this, [this, error]() { + qCritical() << "连接异常:" << error; + emit conFailed(); + }); + } + }, + asio::detached); } -bool ClientCore::Connect(const QString& ip, quint16 port) +asio::awaitable ClientCore::Connect(const QString& ip, quint16 port) { if (connected_) { qInfo() << QString(tr("已连接。")); - return true; + co_return true; } try { - asio::ip::tcp::resolver resolver(ioContext_); - asio::ip::tcp::resolver::results_type endpoints = resolver.resolve(ip.toStdString(), std::to_string(port)); - asio::connect(mSocket_, endpoints); - return true; + asio::steady_timer timer(co_await asio::this_coro::executor); + timer.expires_after(std::chrono::seconds(5)); + + asio::cancellation_signal cancelSignal; + auto cancelSlot = cancelSignal.slot(); + + asio::co_spawn( + co_await asio::this_coro::executor, + [this, &cancelSignal, &timer]() -> asio::awaitable { + try { + co_await timer.async_wait(asio::use_awaitable); + } catch (...) { + co_return; + } + }, + asio::detached); + + asio::ip::tcp::resolver resolver(co_await asio::this_coro::executor); + auto endpoints = co_await resolver.async_resolve(ip.toStdString(), std::to_string(port), asio::use_awaitable); + auto endpoint = + co_await asio::async_connect(mSocket_, endpoints, asio::bind_cancellation_slot(cancelSlot, asio::use_awaitable)); + co_return true; } catch (const std::exception& ex) { qCritical() << QString(tr("%1:%2 连接失败。%3")).arg(ip).arg(port).arg(ex.what()); - return false; + co_return false; } qInfo() << QString(tr("%1:%2 连接成功。")).arg(ip).arg(port); connected_ = true; - return true; + co_return true; } void ClientCore::Disconnect() @@ -316,7 +351,7 @@ asio::awaitable ClientCore::Send(QSharedPointer frame) asio::awaitable ClientCore::Send(const char* data, size_t size) { try { - //auto c = mSocket_.get_executor(); + // auto c = mSocket_.get_executor(); auto bytes_transferred = co_await asio::async_write(mSocket_, asio::buffer(data, size), asio::use_awaitable); co_return bytes_transferred == size; } catch (std::exception& e) { diff --git a/ClientCore/ClientCore.h b/ClientCore/ClientCore.h index f537306..4dae364 100644 --- a/ClientCore/ClientCore.h +++ b/ClientCore/ClientCore.h @@ -34,7 +34,7 @@ public slots: public: void Instance(); - bool Connect(const QString& ip, quint16 port); + asio::awaitable Connect(const QString& ip, quint16 port); bool IsConnect(); const asio::any_io_executor& get_executor(); template asio::awaitable Send(const T& info, FrameBufferType type, const QString& tid)