From 9818b5f2b829575e3cd6d0a1fab7be23111c07c8 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Fri, 13 Sep 2024 22:24:12 +0300 Subject: [PATCH] ... --- net/adc_netservice_asio.h | 40 ++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/net/adc_netservice_asio.h b/net/adc_netservice_asio.h index 1af2480..9afde8c 100644 --- a/net/adc_netservice_asio.h +++ b/net/adc_netservice_asio.h @@ -126,7 +126,7 @@ public: if (ctx.use_future) { return _socket.async_connect( - endpoint, asio::use_future([&ctx, timer = std::move(timer)](std::error_code ec) { timer->cancel(); })); + endpoint, asio::use_future([&ctx, timer = std::move(timer)](std::error_code) { timer->cancel(); })); } else { return _socket.async_connect(endpoint, [&ctx, timer = std::move(timer)](std::error_code ec) { timer->cancel(); @@ -149,6 +149,9 @@ public: try { acceptor = typename TRANSPORT_PROTOT::acceptor(_ioContext, endpoint); } catch (std::system_error err) { + if (ctx.use_future) { // emulation of asio::use_future behaivior?! + throw; + } ctx.accept_comp_token(err.code()); return; } @@ -157,7 +160,7 @@ public: if (ctx.use_future) { return _socket.async_accept( - endpoint, asio::use_future([&ctx, timer = std::move(timer)](std::error_code ec) { timer->cancel(); })); + endpoint, asio::use_future([&ctx, timer = std::move(timer)](std::error_code) { timer->cancel(); })); } else { return _socket.async_accept(endpoint, [&ctx, timer = std::move(timer)](std::error_code ec) { timer->cancel(); @@ -182,15 +185,34 @@ public: }, [&ctx, s_res, timer = std::move(timer), this](std::error_code ec, size_t) { timer->cancel(); - if (ec) { - return; + R msg; + + if (!ec) { + std::string_view net_pack{std::get<0>(*s_res), std::get<1>(*s_res)}; + + std::ranges::copy(this->fromProto(net_pack), std::back_inserter(msg)); + _streamBuffer.consume(net_pack.size()); + + while (_streamBuffer.size()) { // search for possible additional session protocol packets + auto begin_it = (const char*)traits::asio_streambuff_iter_t::begin(_streamBuffer.data()); + auto end_it = (const char*)traits::asio_streambuff_iter_t::end(_streamBuffer.data()); + // static_cast>(_streamBuffer.data().data()); + // auto end_it = begin_it + _streamBuffer.data().size(); + + + *s_res = this->search(std::span(begin_it, end_it)); + if (std::get<2>(*s_res)) { + net_pack = std::string_view{std::get<0>(*s_res), std::get<1>(*s_res)}; + + std::ranges::copy(this->fromProto(net_pack), std::back_inserter(msg)); + _streamBuffer.consume(net_pack.size()); + // TODO: insert to queue + } else { + break; + } + } } - R msg; - std::string_view net_pack{std::get<0>(*s_res), std::get<1>(*s_res)}; - - std::ranges::copy(this->fromProto(net_pack), std::back_inserter(msg)); - _streamBuffer.consume(net_pack.size()); ctx.accept_comp_token(ec, std::move(msg)); });