15#include <unordered_map>
122 std::unordered_map<std::uint32_t, std::chrono::steady_clock::time_point>
lastPacketTime_;
131 bool isRateLimited(std::uint32_t sessionId,
const std::chrono::steady_clock::time_point ¤tTime)
140 auto timeSinceLastPacket = currentTime - it->second;
146 it->second = currentTime;
181 std::vector<EventRecord> events;
182 std::size_t bytesRead = 0;
184 while (bytesRead < payloadSize)
190 std::uint16_t dataLength = serializer.
readUInt16();
195 event.data.resize(dataLength);
197 bytesRead += dataLength;
200 events.push_back(std::move(event));
353 constexpr std::size_t PACKET_HEADER_SIZE = 7;
354 if (data.size() < PACKET_HEADER_SIZE)
534 catch (
const std::exception &)
This file contains the network protocol.
Network packet serializer for RNP protocol.
Main packet handler class.
std::unordered_map< std::uint32_t, std::chrono::steady_clock::time_point > lastPacketTime_
GameStartHandler gameStartHandler_
void onLobbyListResponse(LobbyListResponseHandler handler)
Register LOBBY_LIST_RESPONSE packet handler.
void onPing(PingHandler handler)
Register PING packet handler.
void onPong(PongHandler handler)
Register PONG packet handler.
void onLobbyJoin(LobbyJoinHandler handler)
Register LOBBY_JOIN packet handler.
void onLobbyLeave(LobbyLeaveHandler handler)
Register LOBBY_LEAVE packet handler.
LobbyListRequestHandler lobbyListRequestHandler_
void resetStats()
Reset statistics.
LobbyLeaveHandler lobbyLeaveHandler_
HandlerResult processPacket(const std::vector< std::uint8_t > &data, const PacketContext &context)
Process a received packet.
void onLobbyListRequest(LobbyListRequestHandler handler)
Register LOBBY_LIST_REQUEST packet handler.
void setRateLimitInterval(std::chrono::milliseconds interval)
Set rate limiting interval.
EntityEventHandler entityEventHandler_
void onConnect(ConnectHandler handler)
Register CONNECT packet handler.
LobbyCreateResponseHandler lobbyCreateResponseHandler_
void clearAllSessions()
Clear all rate limiting data.
LobbyCreateHandler lobbyCreateHandler_
DisconnectHandler disconnectHandler_
ErrorHandler errorHandler_
LobbyJoinResponseHandler lobbyJoinResponseHandler_
void onWorldState(WorldStateHandler handler)
Register WORLD_STATE packet handler.
void onConnectAccept(ConnectAcceptHandler handler)
Register CONNECT_ACCEPT packet handler.
HandlerPacket()=default
Constructor.
LobbyJoinHandler lobbyJoinHandler_
const HandlerStats & getStats() const
Get handler statistics.
LobbyListResponseHandler lobbyListResponseHandler_
void onStartGameRequest(StartGameRequestHandler handler)
Register START_GAME_REQUEST packet handler.
void onError(ErrorHandler handler)
Register ERROR packet handler.
WorldStateHandler worldStateHandler_
HandlerPacket(const HandlerPacket &)=delete
void onLobbyCreate(LobbyCreateHandler handler)
Register LOBBY_CREATE packet handler.
bool isRateLimited(std::uint32_t sessionId, const std::chrono::steady_clock::time_point ¤tTime)
Check rate limiting for a session.
void onLobbyUpdate(LobbyUpdateHandler handler)
Register LOBBY_UPDATE packet handler.
void onEntityEvent(EntityEventHandler handler)
Register ENTITY_EVENT packet handler.
void onLobbyJoinResponse(LobbyJoinResponseHandler handler)
Register LOBBY_JOIN_RESPONSE packet handler.
void updateStats(PacketType packetType, HandlerResult result, std::size_t bytesReceived)
Update statistics.
HandlerPacket & operator=(const HandlerPacket &)=delete
ConnectAcceptHandler connectAcceptHandler_
std::vector< EventRecord > parseEntityEvents(Serializer &serializer, std::size_t payloadSize)
Parse and handle ENTITY_EVENT packet.
void onLobbyCreateResponse(LobbyCreateResponseHandler handler)
Register LOBBY_CREATE_RESPONSE packet handler.
~HandlerPacket()=default
Destructor.
LobbyUpdateHandler lobbyUpdateHandler_
std::chrono::milliseconds rateLimitInterval_
StartGameRequestHandler startGameRequestHandler_
void onGameStart(GameStartHandler handler)
Register GAME_START packet handler.
void onDisconnect(DisconnectHandler handler)
Register DISCONNECT packet handler.
void clearSession(std::uint32_t sessionId)
Clear rate limiting data for a session.
ConnectHandler connectHandler_
Binary serializer for RNP protocol packets.
PacketStartGameRequest deserializeStartGameRequest()
Deserialize START_GAME_REQUEST packet.
PacketLobbyJoinResponse deserializeLobbyJoinResponse()
Deserialize LOBBY_JOIN_RESPONSE packet.
PacketHeader deserializeHeader()
Deserialize packet header.
PacketConnect deserializeConnect()
Deserialize CONNECT packet.
void readBytes(void *data, std::size_t size)
Read raw bytes.
PacketLobbyUpdate deserializeLobbyUpdate()
Deserialize LOBBY_UPDATE packet.
PacketError deserializeError()
Deserialize ERROR packet.
PacketLobbyJoin deserializeLobbyJoin()
Deserialize LOBBY_JOIN packet.
PacketConnectAccept deserializeConnectAccept()
Deserialize CONNECT_ACCEPT packet.
PacketLobbyCreate deserializeLobbyCreate()
Deserialize LOBBY_CREATE packet.
PacketGameStart deserializeGameStart()
Deserialize GAME_START packet.
std::uint8_t readByte()
Read a single byte.
PacketLobbyListResponse deserializeLobbyListResponse()
Deserialize LOBBY_LIST_RESPONSE packet.
PacketPingPong deserializePingPong()
Deserialize PING/PONG packet.
PacketWorldState deserializeWorldState()
Deserialize WORLD_STATE packet.
std::uint16_t readUInt16()
Read a 16-bit integer (network byte order)
std::uint32_t readUInt32()
Read a 32-bit integer (network byte order)
PacketDisconnect deserializeDisconnect()
Deserialize DISCONNECT packet.
PacketLobbyCreateResponse deserializeLobbyCreateResponse()
Deserialize LOBBY_CREATE_RESPONSE packet.
EventType
Event types for ENTITY_EVENT packets.
HandlerResult
Packet processing result.
std::function< HandlerResult(const PacketLobbyCreateResponse &, const PacketContext &)> LobbyCreateResponseHandler
std::function< HandlerResult(const PacketConnect &, const PacketContext &)> ConnectHandler
std::function< HandlerResult(const PacketLobbyCreate &, const PacketContext &)> LobbyCreateHandler
std::function< HandlerResult(const std::vector< EventRecord > &, const PacketContext &)> EntityEventHandler
std::function< HandlerResult(const PacketWorldState &, const PacketContext &)> WorldStateHandler
std::function< HandlerResult(const PacketGameStart &, const PacketContext &)> GameStartHandler
std::function< HandlerResult(const PacketPingPong &, const PacketContext &)> PingHandler
std::function< HandlerResult(const PacketContext &)> LobbyLeaveHandler
PacketType
Packet types according to RNP specification.
std::function< HandlerResult(const PacketConnectAccept &, const PacketContext &)> ConnectAcceptHandler
std::function< HandlerResult(const PacketPingPong &, const PacketContext &)> PongHandler
std::function< HandlerResult(std::uint32_t sequenceId, const PacketContext &)> AckHandler
std::function< HandlerResult(const PacketLobbyJoin &, const PacketContext &)> LobbyJoinHandler
std::function< HandlerResult(const PacketLobbyListResponse &, const PacketContext &)> LobbyListResponseHandler
std::function< HandlerResult(const PacketDisconnect &, const PacketContext &)> DisconnectHandler
std::function< HandlerResult(const PacketLobbyJoinResponse &, const PacketContext &)> LobbyJoinResponseHandler
std::function< HandlerResult(const PacketContext &)> LobbyListRequestHandler
std::function< HandlerResult(const PacketLobbyUpdate &, const PacketContext &)> LobbyUpdateHandler
std::function< HandlerResult(const PacketStartGameRequest &, const PacketContext &)> StartGameRequestHandler
std::function< HandlerResult(const PacketError &, const PacketContext &)> ErrorHandler
constexpr std::size_t MAX_PAYLOAD
Event record for ENTITY_EVENT packets (TLV format)
std::vector< std::uint8_t > data
Statistics for packet handling.
std::unordered_map< PacketType, std::uint64_t > packetTypeCount
std::uint64_t totalPacketsDropped
std::unordered_map< HandlerResult, std::uint64_t > resultCount
std::uint64_t totalPacketsReceived
std::uint64_t totalBytesReceived
std::uint64_t totalPacketsProcessed
CONNECT_ACCEPT packet payload.
Context information for packet processing.
std::chrono::steady_clock::time_point receiveTime
std::string senderAddress
DISCONNECT packet payload.
GAME_START packet payload.
LOBBY_CREATE_RESPONSE packet payload.
LOBBY_CREATE packet payload.
LOBBY_JOIN_RESPONSE packet payload.
LOBBY_JOIN packet payload.
LOBBY_LIST_RESPONSE packet payload.
LOBBY_UPDATE packet payload.
PING/PONG packet payload.
START_GAME_REQUEST packet payload (client requests to start game)
WORLD_STATE packet payload.