r-type  0.0.0
R-Type main
Loading...
Searching...
No Matches
srv::AsioServer Class Referencefinal

Network implementation with asio for server. More...

#include <AsioServer.hpp>

+ Inheritance diagram for srv::AsioServer:
+ Collaboration diagram for srv::AsioServer:

Public Types

using PacketHandler
 
using ClientInfo
 

Public Member Functions

 AsioServer ()
 
 ~AsioServer () override
 
 AsioServer (const AsioServer &)=delete
 
 AsioServer (AsioServer &&)=delete
 
AsioServeroperator= (const AsioServer &)=delete
 
AsioServeroperator= (AsioServer &&)=delete
 
void init (const std::string &host, uint16_t port) override
 
const std::string getName () const override
 
utl::PluginType getType () const override
 
void start () override
 
void stop () override
 
void sendConnectAccept (const asio::ip::udp::endpoint &client, std::uint32_t sessionId)
 
void sendWorldState (const asio::ip::udp::endpoint &client, std::uint32_t serverTick, const std::vector< rnp::EntityState > &entities)
 
void sendWorldState (const asio::ip::udp::endpoint &client, const std::vector< uint8_t > &worldData)
 
void sendEntityEvent (const asio::ip::udp::endpoint &client, std::uint32_t serverTick, const std::vector< rnp::EventRecord > &events)
 
void sendEvents (const asio::ip::udp::endpoint &client, const std::vector< rnp::EventRecord > &events)
 
void sendPong (const asio::ip::udp::endpoint &client, std::uint32_t nonce, std::uint32_t sendTimeMs)
 
void sendPong (const asio::ip::udp::endpoint &client)
 
void sendError (const asio::ip::udp::endpoint &client, rnp::ErrorCode errorCode, const std::string &errorMessage)
 
void sendError (const asio::ip::udp::endpoint &client, const std::string &errorMessage)
 
void sendAck (const asio::ip::udp::endpoint &client, std::uint32_t cumulative, std::uint32_t ackBits)
 
void broadcastToAll (const std::vector< uint8_t > &data)
 
void broadcastEntityEvents (std::uint32_t serverTick, const std::vector< rnp::EventRecord > &events)
 
void broadcastEvents (const std::vector< rnp::EventRecord > &events)
 
void setPacketHandler (rnp::PacketType type, PacketHandler handler)
 
void setTickRate (std::uint16_t tickRate)
 
void setServerCapabilities (std::uint32_t caps)
 
const std::unordered_map< asio::ip::udp::endpoint, ClientInfo > & getClients () const
 
- Public Member Functions inherited from srv::INetworkServer
virtual ~INetworkServer ()=default
 
- Public Member Functions inherited from utl::IPlugin
virtual ~IPlugin ()=default
 

Private Member Functions

void startReceive ()
 
void handleReceive (const asio::error_code &error, std::size_t bytesTransferred)
 
void handleSend (const asio::error_code &error, std::size_t bytesTransferred)
 
void processPacket (const asio::ip::udp::endpoint &sender, const std::vector< uint8_t > &data)
 
void addClient (const asio::ip::udp::endpoint &endpoint, const std::string &playerName, std::uint32_t clientCaps, std::uint32_t sessionId)
 
void removeClient (const asio::ip::udp::endpoint &endpoint)
 
std::uint16_t getPlayerId (const asio::ip::udp::endpoint &endpoint) const
 
std::uint32_t getSessionId (const asio::ip::udp::endpoint &endpoint) const
 
void handleReliablePacket (const asio::ip::udp::endpoint &sender, const rnp::PacketHeader &header)
 
void processAck (const asio::ip::udp::endpoint &sender, const std::vector< uint8_t > &payload)
 
void retransmitReliable ()
 

Private Attributes

asio::io_context m_ioContext
 
asio::ip::udp::socket m_socket
 
asio::ip::udp::endpoint m_remoteEndpoint
 
std::array< uint8_t, rnp::MAX_PAYLOAD+16 > m_recvBuffer
 
std::unique_ptr< asio::executor_work_guard< asio::io_context::executor_type > > m_workGuard
 
std::thread m_ioThread
 
std::unordered_map< asio::ip::udp::endpoint, ClientInfom_clients
 
std::unordered_map< rnp::PacketType, PacketHandlerm_packetHandlers
 
uint32_t m_sequenceNumber = 0
 
std::uint16_t m_nextPlayerId = 1
 
std::uint32_t m_nextSessionId = 1
 
std::uint16_t m_tickRateHz = 60
 
std::uint16_t m_mtuPayloadBytes = 508
 
std::uint32_t m_serverCaps = 0
 
std::unordered_map< std::uint32_t, std::vector< uint8_t > > m_pendingReliable
 
std::unordered_map< asio::ip::udp::endpoint, std::uint32_t > m_clientLastAck
 

Detailed Description

Network implementation with asio for server.

Definition at line 29 of file AsioServer.hpp.

Member Typedef Documentation

◆ ClientInfo

Initial value:
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;
}

Definition at line 34 of file AsioServer.hpp.

◆ PacketHandler

Initial value:
std::function<void(const asio::ip::udp::endpoint &, const rnp::PacketHeader &,
const std::vector<uint8_t> &)>
Packet header according to RNP specification (Big Endian) Total size: 16 bytes.
Definition Protocol.hpp:115

Definition at line 32 of file AsioServer.hpp.

Constructor & Destructor Documentation

◆ AsioServer() [1/3]

srv::AsioServer::AsioServer ( )

Definition at line 8 of file asioServer.cpp.

◆ ~AsioServer()

srv::AsioServer::~AsioServer ( )
override

Definition at line 63 of file asioServer.cpp.

◆ AsioServer() [2/3]

srv::AsioServer::AsioServer ( const AsioServer & )
delete

◆ AsioServer() [3/3]

srv::AsioServer::AsioServer ( AsioServer && )
delete

Member Function Documentation

◆ addClient()

void srv::AsioServer::addClient ( const asio::ip::udp::endpoint & endpoint,
const std::string & playerName,
std::uint32_t clientCaps,
std::uint32_t sessionId )
private

Definition at line 256 of file asioServer.cpp.

◆ broadcastEntityEvents()

void srv::AsioServer::broadcastEntityEvents ( std::uint32_t serverTick,
const std::vector< rnp::EventRecord > & events )

◆ broadcastEvents()

void srv::AsioServer::broadcastEvents ( const std::vector< rnp::EventRecord > & events)

◆ broadcastToAll()

void srv::AsioServer::broadcastToAll ( const std::vector< uint8_t > & data)

Definition at line 592 of file asioServer.cpp.

◆ getClients()

const std::unordered_map< asio::ip::udp::endpoint, ClientInfo > & srv::AsioServer::getClients ( ) const
inline

Definition at line 81 of file AsioServer.hpp.

References m_clients.

◆ getName()

const std::string srv::AsioServer::getName ( ) const
inlinenodiscardoverridevirtual

Implements utl::IPlugin.

Definition at line 54 of file AsioServer.hpp.

◆ getPlayerId()

std::uint16_t srv::AsioServer::getPlayerId ( const asio::ip::udp::endpoint & endpoint) const
private

Definition at line 272 of file asioServer.cpp.

◆ getSessionId()

std::uint32_t srv::AsioServer::getSessionId ( const asio::ip::udp::endpoint & endpoint) const
private

Definition at line 282 of file asioServer.cpp.

◆ getType()

utl::PluginType srv::AsioServer::getType ( ) const
inlinenodiscardoverridevirtual

Implements utl::IPlugin.

Definition at line 55 of file AsioServer.hpp.

References utl::NETWORK_SERVER.

◆ handleReceive()

void srv::AsioServer::handleReceive ( const asio::error_code & error,
std::size_t bytesTransferred )
private

Definition at line 71 of file asioServer.cpp.

◆ handleReliablePacket()

void srv::AsioServer::handleReliablePacket ( const asio::ip::udp::endpoint & sender,
const rnp::PacketHeader & header )
private

Definition at line 677 of file asioServer.cpp.

References rnp::PacketHeader::sequence.

◆ handleSend()

void srv::AsioServer::handleSend ( const asio::error_code & error,
std::size_t bytesTransferred )
private

Definition at line 90 of file asioServer.cpp.

◆ init()

void srv::AsioServer::init ( const std::string & host,
uint16_t port )
overridevirtual

Implements srv::INetworkServer.

Definition at line 10 of file asioServer.cpp.

◆ operator=() [1/2]

AsioServer & srv::AsioServer::operator= ( AsioServer && )
delete

◆ operator=() [2/2]

AsioServer & srv::AsioServer::operator= ( const AsioServer & )
delete

◆ processAck()

void srv::AsioServer::processAck ( const asio::ip::udp::endpoint & sender,
const std::vector< uint8_t > & payload )
private

Definition at line 688 of file asioServer.cpp.

◆ processPacket()

◆ removeClient()

void srv::AsioServer::removeClient ( const asio::ip::udp::endpoint & endpoint)
private

Definition at line 270 of file asioServer.cpp.

◆ retransmitReliable()

void srv::AsioServer::retransmitReliable ( )
private

Definition at line 720 of file asioServer.cpp.

◆ sendAck()

void srv::AsioServer::sendAck ( const asio::ip::udp::endpoint & client,
std::uint32_t cumulative,
std::uint32_t ackBits )

◆ sendConnectAccept()

void srv::AsioServer::sendConnectAccept ( const asio::ip::udp::endpoint & client,
std::uint32_t sessionId )

◆ sendEntityEvent()

void srv::AsioServer::sendEntityEvent ( const asio::ip::udp::endpoint & client,
std::uint32_t serverTick,
const std::vector< rnp::EventRecord > & events )

◆ sendError() [1/2]

void srv::AsioServer::sendError ( const asio::ip::udp::endpoint & client,
const std::string & errorMessage )

Definition at line 556 of file asioServer.cpp.

References rnp::INTERNAL_ERROR.

◆ sendError() [2/2]

void srv::AsioServer::sendError ( const asio::ip::udp::endpoint & client,
rnp::ErrorCode errorCode,
const std::string & errorMessage )

◆ sendEvents()

void srv::AsioServer::sendEvents ( const asio::ip::udp::endpoint & client,
const std::vector< rnp::EventRecord > & events )

◆ sendPong() [1/2]

void srv::AsioServer::sendPong ( const asio::ip::udp::endpoint & client)

◆ sendPong() [2/2]

void srv::AsioServer::sendPong ( const asio::ip::udp::endpoint & client,
std::uint32_t nonce,
std::uint32_t sendTimeMs )

◆ sendWorldState() [1/2]

void srv::AsioServer::sendWorldState ( const asio::ip::udp::endpoint & client,
const std::vector< uint8_t > & worldData )

◆ sendWorldState() [2/2]

void srv::AsioServer::sendWorldState ( const asio::ip::udp::endpoint & client,
std::uint32_t serverTick,
const std::vector< rnp::EntityState > & entities )

◆ setPacketHandler()

void srv::AsioServer::setPacketHandler ( rnp::PacketType type,
PacketHandler handler )

Definition at line 672 of file asioServer.cpp.

◆ setServerCapabilities()

void srv::AsioServer::setServerCapabilities ( std::uint32_t caps)
inlinevirtual

Implements srv::INetworkServer.

Definition at line 79 of file AsioServer.hpp.

References m_serverCaps.

◆ setTickRate()

void srv::AsioServer::setTickRate ( std::uint16_t tickRate)
inlinevirtual

Implements srv::INetworkServer.

Definition at line 78 of file AsioServer.hpp.

References m_tickRateHz.

◆ start()

void srv::AsioServer::start ( )
overridevirtual

Implements srv::INetworkServer.

Definition at line 20 of file asioServer.cpp.

◆ startReceive()

void srv::AsioServer::startReceive ( )
private

Definition at line 65 of file asioServer.cpp.

◆ stop()

void srv::AsioServer::stop ( )
overridevirtual

Implements srv::INetworkServer.

Definition at line 41 of file asioServer.cpp.

Member Data Documentation

◆ m_clientLastAck

std::unordered_map<asio::ip::udp::endpoint, std::uint32_t> srv::AsioServer::m_clientLastAck
private

Definition at line 113 of file AsioServer.hpp.

◆ m_clients

std::unordered_map<asio::ip::udp::endpoint, ClientInfo> srv::AsioServer::m_clients
private

Definition at line 104 of file AsioServer.hpp.

Referenced by getClients().

◆ m_ioContext

asio::io_context srv::AsioServer::m_ioContext
private

Definition at line 97 of file AsioServer.hpp.

◆ m_ioThread

std::thread srv::AsioServer::m_ioThread
private

Definition at line 103 of file AsioServer.hpp.

◆ m_mtuPayloadBytes

std::uint16_t srv::AsioServer::m_mtuPayloadBytes = 508
private

Definition at line 110 of file AsioServer.hpp.

◆ m_nextPlayerId

std::uint16_t srv::AsioServer::m_nextPlayerId = 1
private

Definition at line 107 of file AsioServer.hpp.

◆ m_nextSessionId

std::uint32_t srv::AsioServer::m_nextSessionId = 1
private

Definition at line 108 of file AsioServer.hpp.

◆ m_packetHandlers

std::unordered_map<rnp::PacketType, PacketHandler> srv::AsioServer::m_packetHandlers
private

Definition at line 105 of file AsioServer.hpp.

◆ m_pendingReliable

std::unordered_map<std::uint32_t, std::vector<uint8_t> > srv::AsioServer::m_pendingReliable
private

Definition at line 112 of file AsioServer.hpp.

◆ m_recvBuffer

std::array<uint8_t, rnp::MAX_PAYLOAD + 16> srv::AsioServer::m_recvBuffer
private

Definition at line 100 of file AsioServer.hpp.

◆ m_remoteEndpoint

asio::ip::udp::endpoint srv::AsioServer::m_remoteEndpoint
private

Definition at line 99 of file AsioServer.hpp.

◆ m_sequenceNumber

uint32_t srv::AsioServer::m_sequenceNumber = 0
private

Definition at line 106 of file AsioServer.hpp.

◆ m_serverCaps

std::uint32_t srv::AsioServer::m_serverCaps = 0
private

Definition at line 111 of file AsioServer.hpp.

Referenced by setServerCapabilities().

◆ m_socket

asio::ip::udp::socket srv::AsioServer::m_socket
private

Definition at line 98 of file AsioServer.hpp.

◆ m_tickRateHz

std::uint16_t srv::AsioServer::m_tickRateHz = 60
private

Definition at line 109 of file AsioServer.hpp.

Referenced by setTickRate().

◆ m_workGuard

std::unique_ptr<asio::executor_work_guard<asio::io_context::executor_type> > srv::AsioServer::m_workGuard
private

Definition at line 102 of file AsioServer.hpp.


The documentation for this class was generated from the following files: