diff --git a/net/adc_netservice_asio.h b/net/adc_netservice_asio.h index c611b8e..898688f 100644 --- a/net/adc_netservice_asio.h +++ b/net/adc_netservice_asio.h @@ -15,8 +15,10 @@ #include #include #include +#include #include #include +#include > #include #include @@ -37,18 +39,42 @@ public: virtual ~AdcNetServiceASIOStream() = default; - template CompletionTokenT> + template CompletionTokenT> auto asynSend(const NetMessageT& msg, const TimeoutT& timeout, CompletionTokenT&& token) { - using namespace asio::experimental::awaitable_operators; + // using namespace asio::experimental::awaitable_operators; - auto deadline = std::chrono::steady_clock::now() + timeout; + // auto deadline = std::chrono::steady_clock::now() + timeout; - std::error_code ec; + std::unique_ptr timer(_socket.get_executor()); - co_await (asyncSendImpl(msg) && watchdog(deadline, ec)); + timer->expires_after(timeout); + timer->async_wait([this, timer = std::move(timer)](const std::error_code& ec) { + if (!ec) { + _socket.cancel(std::make_error_code(std::errc::timed_out)); + } + }); - std::forward(token)(ec); + + if constexpr (std::derived_from>) { + return asio::async_write(_socket, createConstBufferSequence(msg), std::forward(token)); + } else if constexpr (std::derived_from>) { + return _socket.async_send(createConstBufferSequence(msg), std::forward(token)); + } else if constexpr (std::derived_from>) { + return _socket.async_send(createConstBufferSequence(msg), std::forward(token)); + } else { + static_assert(false, "UNKNOWN ASIO-LIBRARY SOCKET TYPE!!!"); + } + + // std::error_code ec; + + // co_await (asyncSendImpl(msg) && watchdog(deadline, ec)); + + // std::forward(token)(ec); + // co_return asio::async_compose( + // [ec](auto& self, const std::error_code& = {}) { self.complete(ec); }, token, _socket); } @@ -63,6 +89,16 @@ protected: asio::streambuf _streamBuffer; + std::vector createConstBufferSequence(const NetMessageT& msg) + { + std::vector buff; + for (const auto& el : msg.template bytesView>()) { + buff.emplace_back(asio::const_buffer(el)); + } + + return buff; + } + asio::awaitable asyncSendImpl(const NetMessageT& msg) { // for (const auto& buff : msg.bytesView()) {