StevEngine
StevEngine is a customizable C++ game engine.
Loading...
Searching...
No Matches
server.hpp
1#pragma once
2#ifdef StevEngine_NETWORKING
3#include "networking.hpp"
4#include "utilities/ID.hpp"
5
6#include <functional>
7#include <unordered_set>
8
13
14namespace StevEngine::Networking::Server {
21 class Client {
22 friend class Manager;
23 public:
25 const Utilities::ID id;
26
28 const Socket tcp;
29
31 const sockaddr_in address;
32
38 bool operator== (const Client& client) const;
39 private:
46 Client(const Utilities::ID& id, const Socket& tcp, const sockaddr_in& address);
47
49 mutable float sinceLastPing = 0;
50 };
51}
52
56template<> struct std::hash<StevEngine::Networking::Server::Client> {
57 std::size_t operator()(const StevEngine::Networking::Server::Client& k) const {
58 size_t result = 0;
59 return std::hash<StevEngine::Utilities::ID>()(k.id);
60 }
61};
62
63namespace StevEngine::Networking::Server {
64
70 using MessageFunction = std::function<void(const Client& client, MessageData message)>;
71
79 class Manager {
80 private:
87 class MessageHandler {
88 public:
93 MessageHandler(const MessageFunction& function);
94
99 MessageHandler(const MessageHandler& copy);
100
105 void operator= (const MessageHandler& copy);
106
112 void operator() (const Client& client, MessageData message) const;
113
119 bool operator== (const MessageHandler& other) const;
120
125 Utilities::ID getId() const { return id; }
126 private:
127 MessageFunction function;
128 Utilities::ID id;
129 };
130 public:
141 Manager(int port, bool ipv4 = true);
142
146 ~Manager();
147
152 void send(const Message& message, bool reliable = true) const;
153
159 void send(const MessageID& id, MessageData data = MessageData(), bool reliable = true) const;
160
166 void send(const Client& to, const Message& message, bool reliable = true) const;
167
174 void send(const Client& to, const MessageID& id, MessageData data = MessageData(), bool reliable = true) const;
175
182 void send(const Utilities::ID& clientId, const Message& message, bool reliable = true) const;
183
191 void send(const Utilities::ID& clientId, const MessageID& id, MessageData data = MessageData(), bool reliable = true) const;
192
199 Utilities::ID listen(MessageID id, MessageFunction function);
200
206 void unlisten(MessageID id, const Utilities::ID handler);
207
212 const std::unordered_set<Client>& getClients() const { return clients; };
213
214 private:
215 Socket tcp, udp;
216 sockaddr_in serverAddress;
217
219 std::unordered_map<MessageID, std::vector<MessageHandler>> subscribers;
220
222 std::unordered_set<Client> clients;
224 std::unordered_map<Utilities::ID, Socket> TCPConnections;
225
227 std::unordered_set<Client> disconnected;
228
229 fd_set readfds;
230
234 void acceptTCPConnections();
238 void connectConnections();
239
243 void recieveReliableMessages();
247 void recieveUnreliableMessages();
248
254 void recieve(const Client& from, const Message& message);
255 };
256}
257
258#endif