2#ifdef StevEngine_NETWORKING
3#include "networking.hpp"
4#include "utilities/ID.hpp"
7#include <unordered_set>
14namespace StevEngine::Networking::Server {
25 const Utilities::ID id;
31 const sockaddr_in address;
38 bool operator== (
const Client& client)
const;
46 Client(
const Utilities::ID&
id,
const Socket& tcp,
const sockaddr_in& address);
49 mutable float sinceLastPing = 0;
56template<>
struct std::hash<StevEngine::Networking::Server::Client> {
57 std::size_t operator()(
const StevEngine::Networking::Server::Client& k)
const {
59 return std::hash<StevEngine::Utilities::ID>()(k.id);
63namespace StevEngine::Networking::Server {
70 using MessageFunction = std::function<void(
const Client& client, MessageData message)>;
87 class MessageHandler {
93 MessageHandler(
const MessageFunction& function);
99 MessageHandler(
const MessageHandler& copy);
105 void operator= (
const MessageHandler& copy);
112 void operator() (
const Client& client, MessageData message)
const;
119 bool operator== (
const MessageHandler& other)
const;
125 Utilities::ID getId()
const {
return id; }
127 MessageFunction function;
141 Manager(
int port,
bool ipv4 =
true);
152 void send(
const Message& message,
bool reliable =
true)
const;
159 void send(
const MessageID&
id, MessageData data = MessageData(),
bool reliable =
true)
const;
166 void send(
const Client& to,
const Message& message,
bool reliable =
true)
const;
174 void send(
const Client& to,
const MessageID&
id, MessageData data = MessageData(),
bool reliable =
true)
const;
182 void send(
const Utilities::ID& clientId,
const Message& message,
bool reliable =
true)
const;
191 void send(
const Utilities::ID& clientId,
const MessageID&
id, MessageData data = MessageData(),
bool reliable =
true)
const;
199 Utilities::ID listen(MessageID
id, MessageFunction function);
206 void unlisten(MessageID
id,
const Utilities::ID handler);
212 const std::unordered_set<Client>& getClients()
const {
return clients; };
216 sockaddr_in serverAddress;
219 std::unordered_map<MessageID, std::vector<MessageHandler>> subscribers;
222 std::unordered_set<Client> clients;
224 std::unordered_map<Utilities::ID, Socket> TCPConnections;
227 std::unordered_set<Client> disconnected;
234 void acceptTCPConnections();
238 void connectConnections();
243 void recieveReliableMessages();
247 void recieveUnreliableMessages();
254 void recieve(
const Client& from,
const Message& message);