12#include <unordered_map>
15#define ASIO_STANDALONE
33 const std::vector<uint8_t> &)>;
36 asio::ip::udp::endpoint endpoint;
37 std::string playerName;
38 uint32_t lastSequence;
40 std::uint16_t playerId;
41 std::uint32_t sessionId;
42 std::uint32_t clientCaps;
53 void init(
const std::string &host, uint16_t port)
override;
54 [[nodiscard]]
const std::string
getName()
const override {
return "Network_Asio_Server"; }
57 void start()
override;
60 void sendConnectAccept(
const asio::ip::udp::endpoint &client, std::uint32_t sessionId);
61 void sendWorldState(
const asio::ip::udp::endpoint &client, std::uint32_t serverTick,
62 const std::vector<rnp::EntityState> &entities);
63 void sendWorldState(
const asio::ip::udp::endpoint &client,
const std::vector<uint8_t> &worldData);
64 void sendEntityEvent(
const asio::ip::udp::endpoint &client, std::uint32_t serverTick,
65 const std::vector<rnp::EventRecord> &events);
66 void sendEvents(
const asio::ip::udp::endpoint &client,
const std::vector<rnp::EventRecord> &events);
67 void sendPong(
const asio::ip::udp::endpoint &client, std::uint32_t nonce, std::uint32_t sendTimeMs);
68 void sendPong(
const asio::ip::udp::endpoint &client);
70 const std::string &errorMessage);
71 void sendError(
const asio::ip::udp::endpoint &client,
const std::string &errorMessage);
72 void sendAck(
const asio::ip::udp::endpoint &client, std::uint32_t cumulative, std::uint32_t ackBits);
81 const std::unordered_map<asio::ip::udp::endpoint, ClientInfo> &
getClients()
const {
return m_clients; }
85 void handleReceive(
const asio::error_code &error, std::size_t bytesTransferred);
86 void handleSend(
const asio::error_code &error, std::size_t bytesTransferred);
87 void processPacket(
const asio::ip::udp::endpoint &sender,
const std::vector<uint8_t> &data);
88 void addClient(
const asio::ip::udp::endpoint &endpoint,
const std::string &playerName,
89 std::uint32_t clientCaps, std::uint32_t sessionId);
90 void removeClient(
const asio::ip::udp::endpoint &endpoint);
91 std::uint16_t
getPlayerId(
const asio::ip::udp::endpoint &endpoint)
const;
92 std::uint32_t
getSessionId(
const asio::ip::udp::endpoint &endpoint)
const;
94 void processAck(
const asio::ip::udp::endpoint &sender,
const std::vector<uint8_t> &payload);
102 std::unique_ptr<asio::executor_work_guard<asio::io_context::executor_type>>
m_workGuard;
104 std::unordered_map<asio::ip::udp::endpoint, ClientInfo>
m_clients;
This file contains the server network interface.
This file contains the network protocol.
Network implementation with asio for server.
void sendError(const asio::ip::udp::endpoint &client, rnp::ErrorCode errorCode, const std::string &errorMessage)
const std::unordered_map< asio::ip::udp::endpoint, ClientInfo > & getClients() const
std::unordered_map< std::uint32_t, std::vector< uint8_t > > m_pendingReliable
std::uint16_t m_mtuPayloadBytes
std::unordered_map< asio::ip::udp::endpoint, std::uint32_t > m_clientLastAck
void processAck(const asio::ip::udp::endpoint &sender, const std::vector< uint8_t > &payload)
AsioServer(const AsioServer &)=delete
std::unique_ptr< asio::executor_work_guard< asio::io_context::executor_type > > m_workGuard
void handleReliablePacket(const asio::ip::udp::endpoint &sender, const rnp::PacketHeader &header)
void sendEvents(const asio::ip::udp::endpoint &client, const std::vector< rnp::EventRecord > &events)
std::function< void(const asio::ip::udp::endpoint &, const rnp::PacketHeader &, const std::vector< uint8_t > &)> PacketHandler
AsioServer(AsioServer &&)=delete
asio::ip::udp::socket m_socket
void setPacketHandler(rnp::PacketType type, PacketHandler handler)
void broadcastEntityEvents(std::uint32_t serverTick, const std::vector< rnp::EventRecord > &events)
void handleReceive(const asio::error_code &error, std::size_t bytesTransferred)
void sendPong(const asio::ip::udp::endpoint &client, std::uint32_t nonce, std::uint32_t sendTimeMs)
struct { asio::ip::udp::endpoint endpoint; std::string playerName; uint32_t lastSequence; bool connected; std::uint16_t playerId; std::uint32_t sessionId; std::uint32_t clientCaps; } ClientInfo
void broadcastEvents(const std::vector< rnp::EventRecord > &events)
void sendConnectAccept(const asio::ip::udp::endpoint &client, std::uint32_t sessionId)
std::array< uint8_t, rnp::MAX_PAYLOAD+16 > m_recvBuffer
std::uint32_t m_serverCaps
std::uint32_t m_nextSessionId
void removeClient(const asio::ip::udp::endpoint &endpoint)
void processPacket(const asio::ip::udp::endpoint &sender, const std::vector< uint8_t > &data)
void handleSend(const asio::error_code &error, std::size_t bytesTransferred)
void init(const std::string &host, uint16_t port) override
void setServerCapabilities(std::uint32_t caps)
AsioServer & operator=(const AsioServer &)=delete
std::uint32_t getSessionId(const asio::ip::udp::endpoint &endpoint) const
void broadcastToAll(const std::vector< uint8_t > &data)
std::unordered_map< rnp::PacketType, PacketHandler > m_packetHandlers
std::uint16_t getPlayerId(const asio::ip::udp::endpoint &endpoint) const
std::uint16_t m_tickRateHz
utl::PluginType getType() const override
void setTickRate(std::uint16_t tickRate)
void addClient(const asio::ip::udp::endpoint &endpoint, const std::string &playerName, std::uint32_t clientCaps, std::uint32_t sessionId)
std::uint16_t m_nextPlayerId
uint32_t m_sequenceNumber
asio::io_context m_ioContext
void sendAck(const asio::ip::udp::endpoint &client, std::uint32_t cumulative, std::uint32_t ackBits)
const std::string getName() const override
asio::ip::udp::endpoint m_remoteEndpoint
void sendEntityEvent(const asio::ip::udp::endpoint &client, std::uint32_t serverTick, const std::vector< rnp::EventRecord > &events)
void sendWorldState(const asio::ip::udp::endpoint &client, std::uint32_t serverTick, const std::vector< rnp::EntityState > &entities)
AsioServer & operator=(AsioServer &&)=delete
std::unordered_map< asio::ip::udp::endpoint, ClientInfo > m_clients
void retransmitReliable()
Interface for the server network.
PacketType
Packet types according to RNP specification.