summaryrefslogtreecommitdiff
path: root/modules/io/examples/echo_server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/io/examples/echo_server.cpp')
-rw-r--r--modules/io/examples/echo_server.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/modules/io/examples/echo_server.cpp b/modules/io/examples/echo_server.cpp
new file mode 100644
index 0000000..82513ff
--- /dev/null
+++ b/modules/io/examples/echo_server.cpp
@@ -0,0 +1,84 @@
+#include "../c++/io.hpp"
+
+#include <iostream>
+
+#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<<err.get_message()<<std::endl;
+ return err.get_id();
+ }
+ 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& network = aio.io->get_network();
+ saw::own<saw::network_address> addr = nullptr;
+ saw::own<saw::server> srv = nullptr;
+ saw::own<saw::io_stream> 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<void>{
+ 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<saw::err::critical>();
+ }).detach();
+ }else{
+ keep_running = false;
+ }
+ }).detach();
+
+ while(keep_running){
+ wait_scope.wait();
+ }
+
+ return 0;
+}