#include #include "../c++/tls.hpp" #include #include "tls_echo.hpp" saw::error_or real_main(); int main(){ auto eov = real_main(); if(eov.is_error()){ auto& err = eov.get_error(); std::cerr<<"[Error]: "< handle_echo_write(saw::io_stream>& rmt_clt, saw::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, saw::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[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<<"After triggered write: "< real_main(){ using namespace saw; auto eo_aio = saw::setup_async_io(); if(eo_aio.is_error()){ auto& err = eo_aio.get_error(); return std::move(err); } auto& aio = eo_aio.get_value(); /** * Make the event loop the current event loop on this thread */ saw::wait_scope wait_scope{aio.event_loop}; bool keep_running = true; aio.event_port.on_signal(saw::Signal::Terminate).then([&keep_running](){ keep_running = false; }).detach(); auto& int_network = aio.io->get_network(); auto eo_tls_net = saw::setup_tls_network(int_network); if(eo_tls_net.is_error()){ return std::move(eo_tls_net.get_error()); } auto& tls_net = eo_tls_net.get_value(); auto& network = *tls_net; saw::own>> addr = nullptr; saw::own>> srv = nullptr; saw::own>> remote_client = nullptr; saw::message msg_state; std::cout<<"Starting to resolve address"< error_or { std::cout<<"Resolved address"<accept().then([&](auto client) -> saw::error_or{ if(!remote_client){ std::cout<<"Accepted client"<(); }).detach(); }else{ keep_running = false; } }).detach([&](auto err) { std::cout<<"Failed to resolve address: "<