18 : _serverPort(serverPort),
21 _tcpSocket(_ioContext),
22 _udpSocket(_ioContext),
39 auto workGuard = asio::make_work_guard(
_ioContext);
48 log::error(
"Error connecting to server: {}", ec.message());
56 _udpSocket.bind(asio::ip::udp::endpoint(asio::ip::udp::v4(), 0));
62 }
catch (
const std::exception& e) {
63 log::error(
"Client Network Start Error: {}", e.what());
72 if (std::this_thread::get_id() !=
_ioThread.get_id()) {
89 log::error(
"Error sending TCP packet: {}", ec.message());
98 log::error(
"Error sending UDP packet: {}", ec.message());
125 std::vector<net::Packet> packets;
127 packets.push_back(event.packet);
136 throw std::runtime_error(
"No packets available to pop.");
148 [
this](
const asio::error_code& error, std::size_t)
151 log::error(
"TCP Read Header Error: {}", error.message());
162 "Received TCP Header - OpCode: {}, BodySize: {}",
168 log::error(
"Invalid Magic Number from Server");
181 log::error(
"Welcome packet without sessionId body");
197 [
this](
const asio::error_code& error, std::size_t)
200 log::error(
"TCP Read Body Error: {}", error.message());
210 uint32_t sessionId = 0;
227 void ClientNetwork::readUdp(
void)
229 _udpSocket.async_receive_from(
230 asio::buffer(_udpBuffer),
232 [
this](
const asio::error_code& error, std::size_t bytesReceived)
235 if (error != asio::error::operation_aborted)
236 log::error(
"UDP receive error: {}", error.message());
246 std::memcpy(&header, _udpBuffer.data(),
sizeof(header));
259 if (bytesReceived !=
sizeof(header) + header.
bodySize) {
271 _udpBuffer.data() +
sizeof(header),
275 publishEvent({ header.
sessionId, packet });
281 void ClientNetwork::sendUdpHandshake(
void)
283 log::info(
"sendUdpHandshake() called: bound={}, sessionId={}", _udpBound, _sessionId);
285 if (_udpBound || _sessionId == 0)
293 log::info(
"UDP handshake envoyé (session {})", _sessionId);
296 bool ClientNetwork::isUdpReady(
void)
const
Logger declaration with support for multiple log levels.
std::vector< net::Packet > hasPendingPackets(void)
Check if there are pending packets in the event queue.
void readUdp(void)
Read UDP packets asynchronously.
asio::ip::tcp::socket _tcpSocket
TCP socket for communication.
void sendPacket(const net::Packet &packet, net::NetworkMode mode)
Send a packet to the server.
ClientNetwork(const std::string &serverIp, uint16_t serverPort)
Constructor for Client Network.
std::string _serverIp
Server IP address.
void sendUdpHandshake(void)
Send UDP handshake to the server.
~ClientNetwork() override
Destructor for Client Network.
std::mutex _eventQueueMutex
Mutex for event queue synchronization.
net::Packet popPacket(void)
Pop a packet from the event queue.
std::deque< net::NetworkEvent > _eventQueue
Queue of network events.
uint32_t _sessionId
Client session ID.
void stop(void) override
Stop the network client.
net::Header _tcpHeader
TCP packet header.
std::thread _ioThread
Thread for running the I/O context.
uint16_t _serverPort
Server port number.
std::vector< uint8_t > _tcpBody
TCP packet body.
asio::ip::udp::endpoint _serverEndpoint
Server UDP endpoint.
void readTcpBody(void)
Read TCP packet body asynchronously.
void start(void) override
Start the network client.
asio::io_context _ioContext
ASIO I/O context.
asio::ip::udp::socket _udpSocket
UDP socket for communication.
void readTcpHeader(void)
Read TCP packet header asynchronously.
void publishEvent(net::NetworkEvent event)
Publish a network event.
std::optional< net::NetworkEvent > pollEvent(void) override
Poll for a network event.
Network packet with header and serializable body.
BufferSequence getBufferSequence(void) const
Get buffer sequence for network transmission.
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 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.
Represents a network event containing session ID and packet data.