#include "../c++/io.hpp" #include #include "echo.hpp" void handle_echo_message(saw::io_stream& rmt_clt, bool& keep_running, message& state){ rmt_clt.read_ready().then([&](){ for(;;){ uint64_t tbr = state.data.size() < state.already_read ? 0: state.data.size() - state.already_read; if(tbr == 0){ exit(-1); } auto eov = rmt_clt.read(&state.data[0], tbr); if(eov.is_error()){ auto& err = eov.get_error(); if(err.is_critical()){ exit(err.get_id()); } } } }).detach(); rmt_clt.on_read_disconnected().then([&](){ keep_running = false; }).detach(); } int main(){ auto eo_aio = saw::setup_async_io(); if(eo_aio.is_error()){ auto& err = eo_aio.get_error(); std::cerr<get_network(); saw::own addr = nullptr; saw::own srv = nullptr; saw::own remote_client = nullptr; message msg_state; /** * Try to resolve address. If resolved */ network.resolve_address("127.0.0.1", 4321).then([&](auto net_addr){ addr = std::move(net_addr); srv = network.listen(*addr); if(srv){ srv->accept().then([&](auto client) -> saw::error_or{ if(!remote_client){ remote_client = std::move(client); if(remote_client){ handle_echo_message(*remote_client, keep_running, msg_state); }else{ keep_running = false; } } return saw::make_error(); }).detach(); }else{ keep_running = false; } }).detach(); while(keep_running){ wait_scope.wait(); } return 0; }