sync_echo_server.cpp source

This is an echo server, implemented using sync apis. Unable to handle multiple connections at once.

#include <array>
#include <iostream>
#include <memory>
#include <string>
#include <utility>

#include <ark.hpp>

#define PRINT_ACCESS_LOG

namespace program {

using namespace ark;
namespace tcp = net::tcp;

result<void> run() {
  net::inet_address ep;
  TryX(ep.host("127.0.0.1"));
  ep.port(8080);

  auto ac = TryX(tcp::acceptor::create());
  TryX(tcp::bind(ac, ep));
  TryX(tcp::listen(ac));

  for (;;) {
#ifdef PRINT_ACCESS_LOG
    net::address addr;
    tcp::socket s = TryX(tcp::sync::accept(ac, addr));
    auto in_addr = TryX(net::inet_address::from_address(addr));
    std::string in_addr_s = TryX(to_string(in_addr));
    std::cout << "accepted connection from " << in_addr_s << std::endl;
#else
    tcp::socket s = TryX(tcp::sync::accept(ac).value());
#endif
    for (;;) {
      std::array<char, 1024> buf;
      size_t sz = TryX(sync::read(s, buffer(buf), transfer_at_least(1)));
      if (sz == 0)
        break;
      TryX(sync::write(s, buffer(buf, sz)));
    }
#ifdef PRINT_ACCESS_LOG
    std::cout << "connection ended" << std::endl;
#endif
  }

  return success();
}

} // namespace program

int main(void) {
  auto ret = program::run();
  if (ret.has_error()) {
    std::cerr << "error : " << ret.error().message() << std::endl;
    std::abort();
  }
  return 0;
}