6 #include <netinet/in.h>
12 class connection_delegate {
14 virtual bool got_pdu(const shared_ptr<connection> & c, const string & b) = 0;
15 virtual ~connection_delegate();
18 using std::chrono::steady_clock;
19 using time_point = std::chrono::time_point<steady_clock>;
21 class connection : private aio_callback, public std::enable_shared_from_this<connection> {
23 connection(connection_delegate * delegate, socket_t && f1, int lossytest=0);
26 bool isdead() { return dead_; }
28 bool send(const string & b);
30 static shared_ptr<connection> to_dst(const sockaddr_in & dst, connection_delegate *mgr, int lossy=0);
32 const time_point create_time = steady_clock::now();
42 connection_delegate * delegate_;
45 enum charbuf_status_t { unused, inflight, error };
48 charbuf_status_t status;
50 size_t cursor; // number of bytes written or read so far
53 charbuf wpdu_ = {unused, "", 0};
54 charbuf rpdu_ = {unused, "", 0};
63 class connection_listener : private aio_callback {
65 connection_listener(connection_delegate * delegate, in_port_t port, int lossytest=0);
66 ~connection_listener();
67 inline in_port_t port() { return port_; }
75 socket_t tcp_; // listens for connections
76 connection_delegate * delegate_;
78 std::map<int, shared_ptr<connection>> conns_;