19 _acceptor(_ioContext, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port)),
20 _udpSocket(_ioContext, asio::ip::udp::endpoint(asio::ip::udp::v4(), port)),
23 log::info(
"ServerNetwork initialized on port {}", port);
41 auto workGuard = asio::make_work_guard(
_ioContext);
43 }
catch (
const std::exception& e) {
44 log::error(
"ServerNetwork context error: {}", e.what());
67 it->second->send(packet, mode);
75 session->send(packet, mode);
102 auto newSocket = std::make_shared<asio::ip::tcp::socket>(
_ioContext);
104 _acceptor.async_accept(*newSocket, [
this, newSocket](
const asio::error_code& error) {
107 log::info(
"New connection accepted from {}. Session ID: {}",
108 newSocket->remote_endpoint().address().to_string(),
id);
110 auto session = std::make_shared<net::Session>(
112 std::move(*newSocket),
129 log::error(
"Accept error: {}", error.message());
141 [
this](
const asio::error_code& error, std::size_t bytesTransferred)
144 if (error != asio::error::operation_aborted)
145 log::error(
"UDP receive error: {}", error.message());
156 std::memcpy(&header,
_udpBuffer.data(),
sizeof(header));
170 log::error(
"Malformed UDP packet (size mismatch) bytes={} expected={}",
177 uint32_t claimedSessionId = header.
sessionId;
181 auto it =
_sessions.find(claimedSessionId);
190 log::info(
"UDP bound: session {} -> {}:{}",
201 uint32_t realSessionId = 0;
209 realSessionId = it->second;
218 std::memcpy(packet.
body.data(),
Logger declaration with support for multiple log levels.
Network packet with header and serializable body.
std::vector< uint8_t > body
Packet body/payload.
Header header
Packet header.
static T from_network(T value)
Converts a primitive type (integer, float) from Big-Endian (network) to machine endianness.
void start(void) override
Start the network server.
void sendPacket(uint32_t sessionId, const net::Packet &packet, net::NetworkMode mode)
Send a packet to a specific session.
std::optional< net::NetworkEvent > pollEvent(void) override
Poll for a network event.
std::mutex _sessionsMutex
Mutex for protecting access to the sessions map.
uint32_t _nextSessionId
Next session ID to assign to a new connection.
std::unordered_map< asio::ip::udp::endpoint, uint32_t > _udpEndpointToSessionId
Map of UDP endpoints to session IDs.
std::mutex _udpMapMutex
Mutex for protecting access to the UDP endpoint map.
void broadcastPacket(const net::Packet &packet, net::NetworkMode mode)
Broadcast a packet to all connected sessions.
asio::ip::tcp::acceptor _acceptor
TCP acceptor for incoming connections.
std::queue< net::NetworkEvent > _eventQueue
Queue of network events to be processed.
std::unordered_map< uint32_t, std::shared_ptr< net::Session > > _sessions
Map of active sessions indexed by session ID.
ServerNetwork(uint16_t port)
Constructor for ServerNetwork.
void publishEvent(net::NetworkEvent event) override
Publish a network event to be processed.
std::array< char, 4096 > _udpBuffer
Buffer for receiving UDP packets.
std::mutex _eventQueueMutex
Mutex for protecting access to the event queue.
asio::ip::udp::endpoint _udpRemoteEndpoint
Remote endpoint for the last received UDP packet.
~ServerNetwork() override
Destructor for ServerNetwork.
asio::ip::udp::socket _udpSocket
UDP socket for receiving and sending datagrams.
void acceptConnection()
Accept incoming TCP connections.
std::thread _ioThread
Thread running the ASIO I/O context.
void receiveUdpPacket()
Receive incoming UDP packets.
asio::io_context _ioContext
ASIO I/O context for managing asynchronous operations.
void stop(void) override
Stop the network server.
void error(LogFmt< std::type_identity_t< Args >... > fmt, Args &&...args) noexcept
Log an error message.
void info(LogFmt< std::type_identity_t< Args >... > fmt, Args &&...args) noexcept
Log an informational message.
constexpr uint16_t MAGIC_NUMBER
Magic number for packet validation.
@ Welcome
Server welcome response.
@ Hello
Client hello packet.
NetworkMode
Enum representing network transmission modes.
File : GameManager.hpp License: MIT Author : Elias Josué HAJJAR LLAUQUEN elias-josue....
Represents a network event containing session ID and packet data.