From 2ed8103ff1c0fca7372b3c3888f590ba41c525e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Sun, 13 Aug 2023 19:01:48 +0200 Subject: Connection class for network protocol --- src/network/protocol.h | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'src/network/protocol.h') diff --git a/src/network/protocol.h b/src/network/protocol.h index 6a22f3b..a9bbaff 100644 --- a/src/network/protocol.h +++ b/src/network/protocol.h @@ -3,10 +3,16 @@ #include #include +#include +#include +#include #include namespace erebos { +using std::mutex; +using std::unique_ptr; +using std::variant; using std::vector; class NetworkProtocol @@ -20,6 +26,21 @@ public: NetworkProtocol & operator=(NetworkProtocol &&); ~NetworkProtocol(); + class Connection; + + struct NewConnection; + struct ConnectionReadReady; + struct ProtocolClosed {}; + + using PollResult = variant< + NewConnection, + ConnectionReadReady, + ProtocolClosed>; + + PollResult poll(); + + Connection connect(sockaddr_in6 addr); + bool recvfrom(vector & buffer, sockaddr_in6 & addr); void sendto(const vector & buffer, sockaddr_in addr); void sendto(const vector & buffer, sockaddr_in6 addr); @@ -28,6 +49,40 @@ public: private: int sock; + + mutex protocolMutex; + vector buffer; + + struct ConnectionPriv; + vector connections; +}; + +class NetworkProtocol::Connection +{ + friend class NetworkProtocol; + Connection(unique_ptr p); +public: + Connection(const Connection &) = delete; + Connection(Connection &&); + Connection & operator=(const Connection &) = delete; + Connection & operator=(Connection &&); + ~Connection(); + + using Id = uintptr_t; + Id id() const; + + const sockaddr_in6 & peerAddress() const; + + bool receive(vector & buffer); + bool send(const vector & buffer); + + void close(); + +private: + unique_ptr p; }; +struct NetworkProtocol::NewConnection { Connection conn; }; +struct NetworkProtocol::ConnectionReadReady { Connection::Id id; }; + } -- cgit v1.2.3