R-Type
Distributed multiplayer game engine in C++
Loading...
Searching...
No Matches
ServerNetworkManager.cpp
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2025
3** Created by mael on 08/12/2025.
4** File description:
5** ServerNetworkManager.cpp
6*/
7
11
12ServerNetworkManager::ServerNetworkManager(uint16_t port, size_t maxClients)
13 : _port(port), _maxClients(maxClients), _packetHandler(nullptr) {}
14
16 stop();
17 // jthread automatically requests stop and joins in its destructor
18}
19
21 if (_networkThread.joinable()) {
22 LOG_ERROR("Server is already running");
23 return false;
24 }
25
26 try {
27 // Create server host
28 std::unique_ptr<IAddress> address = createAddress("0.0.0.0", _port);
29 _host = createServerHost(*address, _maxClients, 2);
30
31 LOG_INFO("Server listening on port ", _port);
32
33 // Start network thread with jthread (automatically passes stop_token)
34 _networkThread = std::jthread([this](std::stop_token stopToken) { networkThreadLoop(stopToken); });
35
36 return true;
37
38 } catch (const std::exception &e) {
39 LOG_ERROR("Failed to start: ", e.what());
40 return false;
41 }
42}
43
45 if (!_networkThread.joinable()) {
46 return;
47 }
48
49 LOG_INFO("Stopping network thread...");
50
51 _networkThread.request_stop();
52
53 // jthread joins automatically, but we can join explicitly for synchronous shutdown
54 if (_networkThread.joinable()) {
55 _networkThread.join();
56 }
57
58 _host.reset();
59
60 LOG_INFO("Stopped.");
61}
62
63void ServerNetworkManager::networkThreadLoop(std::stop_token stopToken) {
64 LOG_INFO("Network thread started");
65
66 while (!stopToken.stop_requested()) {
67 if (!_host) {
69 continue;
70 }
71
72 // Poll for network events (1ms timeout for faster disconnect detection)
73 auto eventOpt = _host->service(1);
74 if (!eventOpt) {
75 continue;
76 }
77
78 // Push event to queue for game thread to process
79 _eventQueue.push(std::move(*eventOpt));
80 }
81
82 LOG_INFO("Network thread stopped");
83}
84
86 // Process all available events from network thread
87 while (auto eventOpt = _eventQueue.tryPop()) {
88 auto &event = *eventOpt;
89
90 switch (event.type) {
92 LOG_INFO("New client connected!");
93 break;
94
96 if (_packetHandler && event.packet) {
97 _packetHandler(event);
98 }
99 break;
100
102 LOG_INFO("Client disconnected");
103 // Forward disconnect event to handler so Server can clean up
104 if (_packetHandler) {
105 _packetHandler(event);
106 }
107 break;
108
109 default:
110 break;
111 }
112 }
113}
@ RECEIVE
A packet was received.
@ CONNECT
A peer has connected.
@ DISCONNECT
A peer has disconnected.
#define LOG_INFO(...)
Definition Logger.hpp:181
#define LOG_ERROR(...)
Definition Logger.hpp:183
std::unique_ptr< IAddress > createAddress(const std::string &host, uint16_t port)
Create a network address.
std::unique_ptr< IHost > createServerHost(const IAddress &address, size_t maxClients, size_t channelLimit, uint32_t incomingBandwidth, uint32_t outgoingBandwidth)
Create a host for server-side networking.
~ServerNetworkManager()
Destructor - stops network thread.
ServerNetworkManager(uint16_t port, size_t maxClients=32)
Constructor.
ThreadSafeQueue< HostNetworkEvent > _eventQueue
void processMessages()
Process incoming network events from the queue.
std::unique_ptr< IHost > _host
void stop()
Stop the server and network thread.
bool start()
Start the server and network thread.
void networkThreadLoop(std::stop_token stopToken)
Network thread main loop.
void push(T item)
Push an item to the queue.
std::optional< T > tryPop()
Try to pop an item without blocking.
static void sleepMilliseconds(int milliseconds)
Sleep for specified milliseconds (centralized time management)