#pragma once #include #include #include #include #include namespace mst { template using Result = std::expected; class TcpListener; class TcpConnection { public: auto write(uint8_t* buffer, size_t len) -> Result; auto read(uint8_t* buffer, size_t len) -> Result; TcpConnection(TcpListener&, int fd) : fd(fd) { }; private: int fd; }; class TcpListener { public: static auto bind(const std::string& host, uint16_t port) -> Result; auto accept() -> Result; private: TcpListener(int listener_fd, int epoll_fd, sockaddr_in address) : listener_fd(listener_fd) , epoll_fd(epoll_fd) , address(address) { }; int listener_fd; int epoll_fd; sockaddr_in address; std::vector epoll_fds; }; }