From c0424e7a55250705579ee64c269892677fa86adf Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Fri, 15 Mar 2024 14:41:47 +0100 Subject: async,io: Fixed immediate issues in async and built a basic io echo_server --- modules/io/examples/echo.hpp | 1 + modules/io/examples/echo_client.cpp | 2 ++ modules/io/examples/echo_server.cpp | 71 +++++++++++++++++++++++++++++++++++-- 3 files changed, 72 insertions(+), 2 deletions(-) (limited to 'modules/io/examples') diff --git a/modules/io/examples/echo.hpp b/modules/io/examples/echo.hpp index 2201457..4eb8084 100644 --- a/modules/io/examples/echo.hpp +++ b/modules/io/examples/echo.hpp @@ -3,6 +3,7 @@ struct message { std::array data; uint64_t already_read = 0; + uint64_t already_written = 0; }; constexpr std::string_view message_content = "Hello! This is an echo msg."; diff --git a/modules/io/examples/echo_client.cpp b/modules/io/examples/echo_client.cpp index 9e56f6b..ad03779 100644 --- a/modules/io/examples/echo_client.cpp +++ b/modules/io/examples/echo_client.cpp @@ -31,5 +31,7 @@ int main(){ wait_scope.wait(); } + std::cout<<"Shutting down echo client"< handle_echo_write(saw::io_stream& rmt_clt, message& state, uint64_t tbw){ + auto eov = rmt_clt.write(&state.data[state.already_written], tbw); + if(eov.is_error()){ + return std::move(eov.get_error()); + } + + auto val = eov.get_value(); + state.already_written += val; + if(state.already_written > state.already_read){ + exit(-1); + } + + return saw::void_t{}; +} + void handle_echo_message(saw::io_stream& rmt_clt, bool& keep_running, message& state){ rmt_clt.read_ready().then([&](){ for(;;){ @@ -11,12 +26,61 @@ void handle_echo_message(saw::io_stream& rmt_clt, bool& keep_running, message& s if(tbr == 0){ exit(-1); } - auto eov = rmt_clt.read(&state.data[0], tbr); + auto eov = rmt_clt.read(&state.data[state.already_read], tbr); if(eov.is_error()){ auto& err = eov.get_error(); if(err.is_critical()){ + std::cerr< state.data.size()){ + state.already_read = state.data.size(); + } + if(trigger_write){ + auto eov = handle_echo_write(rmt_clt, state, state.already_read - state.already_written); + if(eov.is_error()){ + auto& err = eov.get_error(); + if(err.is_critical()){ + std::cerr<accept().then([&](auto client) -> saw::error_or{ + if(!remote_client){ + std::cout<<"Accepted client"<