-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsocket.h
More file actions
88 lines (71 loc) · 2.87 KB
/
socket.h
File metadata and controls
88 lines (71 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#ifndef SOCKET_H
#define SOCKET_H
// STL
#include <unordered_map>
// PUT
#include <put/object.h>
#include <put/cxxutils/socket_helpers.h>
#include <put/cxxutils/vfifo.h>
#include <put/specialized/peercred.h>
#include <put/specialized/pollevent.h>
class GenericSocket : public PollEvent
{
public:
GenericSocket(EDomain domain = EDomain::local,
EType type = EType::stream,
EProtocol protocol = EProtocol::unspec) noexcept;
GenericSocket(posix::fd_t socket) noexcept;
virtual ~GenericSocket(void) noexcept;
signal<posix::fd_t> disconnected; // connection with peer was severed
protected:
virtual bool read(posix::fd_t socket, Flags_t flags) noexcept = 0;
void disconnect(void) noexcept;
bool m_connected;
union
{
posix::sockaddr_t m_sockaddr;
posix::inetaddr_t m_netaddr;
};
posix::fd_t m_socket;
};
class ClientSocket : public GenericSocket
{
public:
using GenericSocket::GenericSocket;
bool isConnected(void) const noexcept { return GenericSocket::m_connected; }
bool connect(const char *socket_path) noexcept;
bool write(const vfifo& buffer, posix::fd_t passfd = posix::invalid_descriptor) const noexcept;
signal<posix::fd_t, posix::sockaddr_t, proccred_t> connected; // peer is connected
signal<posix::fd_t, vfifo, posix::fd_t> newMessage; // message received
private:
bool read(posix::fd_t socket, Flags_t flags) noexcept; // buffers incomming data and then enqueues newMessage
vfifo m_buffer;
};
class ServerSocket : public GenericSocket
{
public:
using GenericSocket::GenericSocket;
bool bind(const char* socket_path, EDomain domain = EDomain::local, int socket_backlog = SOMAXCONN) noexcept;
bool peerData(posix::fd_t socket, posix::sockaddr_t* addr = nullptr, proccred_t* creds = nullptr) const noexcept;
void acceptPeerRequest(posix::fd_t socket) noexcept;
void rejectPeerRequest(posix::fd_t socket) noexcept;
signal<posix::fd_t, posix::sockaddr_t, proccred_t> newPeerRequest; // peer is requesting a connection
signal<posix::fd_t> connectedPeer; // connection with peer was established
signal<posix::fd_t> disconnectedPeer; // connection with peer was severed
signal<posix::fd_t, vfifo, posix::fd_t> newPeerMessage; // message received from peer
bool write(posix::fd_t socket, const vfifo& buffer, posix::fd_t passfd = posix::invalid_descriptor) const noexcept;
private:
struct peer_t
{
posix::fd_t socket;
posix::sockaddr_t addr;
proccred_t creds;
peer_t(posix::fd_t s, const posix::sockaddr_t& a, const proccred_t& c) noexcept
: socket(s), addr(a), creds(c) { }
};
void disconnectPeer(posix::fd_t socket) noexcept;
bool read(posix::fd_t socket, Flags_t flags) noexcept; // accepts socket connections and then enqueues newPeerRequest
std::unordered_map<posix::fd_t, peer_t> m_peers;
std::unordered_map<posix::fd_t, ClientSocket> m_connections;
};
#endif // SOCKET_H