87class FGE_API NetFluxUdp
90 NetFluxUdp() =
default;
91 NetFluxUdp(NetFluxUdp
const& r) =
delete;
92 NetFluxUdp(NetFluxUdp&& r)
noexcept =
delete;
93 virtual ~NetFluxUdp();
95 NetFluxUdp& operator=(NetFluxUdp
const& r) =
delete;
96 NetFluxUdp& operator=(NetFluxUdp&& r)
noexcept =
delete;
99 [[nodiscard]] ReceivedPacketPtr popNextPacket();
101 [[nodiscard]] std::size_t getPacketsSize()
const;
102 [[nodiscard]]
bool isEmpty()
const;
104 void setMaxPackets(std::size_t n);
105 [[nodiscard]] std::size_t getMaxPackets()
const;
108 bool pushPacket(ReceivedPacketPtr&& fluxPck);
109 void forcePushPacket(ReceivedPacketPtr fluxPck);
110 void forcePushPacketFront(ReceivedPacketPtr fluxPck);
111 [[nodiscard]] FluxProcessResults processReorder(
Client& client,
112 ReceivedPacketPtr& packet,
113 ProtocolPacket::CounterType currentCounter,
116 mutable std::mutex _g_mutexFlux;
117 std::deque<ReceivedPacketPtr> _g_packets;
118 std::size_t _g_remainingPackets{0};
121 std::size_t g_maxPackets = FGE_SERVER_DEFAULT_MAXPACKET;
123 friend class ServerSideNetUdp;
126class FGE_API ServerNetFluxUdp :
public NetFluxUdp
129 explicit ServerNetFluxUdp(ServerSideNetUdp& server) :
133 ~ServerNetFluxUdp()
override =
default;
135 void processClients();
136 [[nodiscard]] FluxProcessResults
137 process(ClientSharedPtr& refClient, ReceivedPacketPtr& packet,
bool allowUnknownClient);
139 void disconnectAllClients(std::chrono::milliseconds delay = std::chrono::milliseconds(0))
const;
156 _onClientObjectReturnEvent;
160 [[nodiscard]]
bool verifyRealm(ClientSharedPtr
const& refClient, ReceivedPacketPtr
const& packet);
161 [[nodiscard]] NetCommandResults
162 checkCommands(ClientSharedPtr
const& refClient, CommandQueue& commands, ReceivedPacketPtr& packet);
164 [[nodiscard]] FluxProcessResults processUnknownClient(ClientSharedPtr& refClient, ReceivedPacketPtr& packet);
165 [[nodiscard]] FluxProcessResults processAcknowledgedClient(
ClientList::Data& refClientData,
166 ReceivedPacketPtr& packet);
167 [[nodiscard]] FluxProcessResults processMTUDiscoveredClient(
ClientList::Data& refClientData,
168 ReceivedPacketPtr& packet);
170 ServerSideNetUdp* g_server{
nullptr};
171 std::chrono::milliseconds g_commandsUpdateTick{0};
172 std::chrono::steady_clock::time_point g_lastCommandUpdateTimePoint{std::chrono::steady_clock::now()};
188class FGE_API ServerSideNetUdp
191 explicit ServerSideNetUdp(IpAddress::Types addressType = IpAddress::Types::Ipv4);
192 ServerSideNetUdp(ServerSideNetUdp
const& r) =
delete;
193 ServerSideNetUdp(ServerSideNetUdp&& r)
noexcept =
delete;
196 ServerSideNetUdp& operator=(ServerSideNetUdp
const& r) =
delete;
197 ServerSideNetUdp& operator=(ServerSideNetUdp&& r)
noexcept =
delete;
199 void setVersioningString(std::string_view versioningString);
200 [[nodiscard]] std::string
const& getVersioningString()
const;
203 start(Port bindPort,
IpAddress const& bindIp, IpAddress::Types addressType = IpAddress::Types::None);
204 [[nodiscard]]
bool start(IpAddress::Types addressType = IpAddress::Types::None);
227 [[nodiscard]] std::size_t getFluxSize()
const;
229 [[nodiscard]] IpAddress::Types getAddressType()
const;
234 void repushPacket(ReceivedPacketPtr&& packet);
244 [[nodiscard]]
bool isRunning()
const;
246 void notifyNewClient(
Identity const& identity, ClientSharedPtr
const& client);
248 void sendTo(TransmitPacketPtr& pck,
Client const& client,
Identity const&
id);
249 void sendTo(TransmitPacketPtr& pck,
Identity const&
id);
251 [[nodiscard]]
void* getCryptContext()
const;
254 void threadReception();
255 void threadTransmission();
257 std::unique_ptr<std::thread> g_threadReception;
258 std::unique_ptr<std::thread> g_threadTransmission;
260 std::condition_variable g_transmissionNotifier;
262 mutable std::mutex g_mutexServer;
264 std::vector<std::unique_ptr<ServerNetFluxUdp>> g_fluxes;
266 std::queue<std::pair<TransmitPacketPtr, Identity>> g_transmissionQueue;
268 std::unordered_map<Identity, std::weak_ptr<Client>,
IdentityHash> g_clientsMap;
275 std::string g_versioningString;
285class FGE_API ClientSideNetUdp :
public NetFluxUdp
288 explicit ClientSideNetUdp(IpAddress::Types addressType = IpAddress::Types::Ipv4);
289 ClientSideNetUdp(ClientSideNetUdp
const& r) =
delete;
290 ClientSideNetUdp(ClientSideNetUdp&& r)
noexcept =
delete;
291 ~ClientSideNetUdp()
override;
293 ClientSideNetUdp& operator=(ClientSideNetUdp
const& r) =
delete;
294 ClientSideNetUdp& operator=(ClientSideNetUdp&& r)
noexcept =
delete;
296 [[nodiscard]]
bool start(Port bindPort,
298 Port connectRemotePort,
300 IpAddress::Types addressType = IpAddress::Types::None);
303 void notifyTransmission();
304 [[nodiscard]]
bool isRunning()
const;
306 [[nodiscard]] std::future<uint16_t> retrieveMTU();
307 [[nodiscard]] std::future<bool> connect(std::string_view versioningString = std::string_view{});
308 [[nodiscard]] std::future<void> disconnect();
310 [[nodiscard]] IpAddress::Types getAddressType()
const;
312 [[nodiscard]] std::size_t waitForPackets(std::chrono::milliseconds time_ms);
314 [[nodiscard]]
Identity const& getClientIdentity()
const;
316 template<
class TPacket = Packet>
319 [[nodiscard]] FluxProcessResults process(ReceivedPacketPtr& packet);
321 void resetReturnPacket();
322 TransmitPacketPtr& startReturnEvent(ReturnEvents event);
323 TransmitPacketPtr& startObjectReturnEvent(uint16_t commandIndex, ObjectSid parentSid, ObjectSid targetSid);
324 void endReturnEvent();
326 void simpleReturnEvent(uint16_t
id);
327 void askFullUpdateReturnEvent();
329 void enableReturnPacket(
bool enable);
330 [[nodiscard]]
bool isReturnPacketEnabled()
const;
332 [[nodiscard]] TransmitPacketPtr prepareAndRetrieveReturnPacket();
342 void threadReception();
343 void threadTransmission();
345 std::recursive_mutex g_mutexCommands;
346 CommandQueue g_commands;
348 std::unique_ptr<std::thread> g_threadReception;
349 std::unique_ptr<std::thread> g_threadTransmission;
351 std::condition_variable g_transmissionNotifier;
352 std::condition_variable g_receptionNotifier;
355 bool g_running{
false};
361 bool g_returnPacketEnabled{
false};
362 TransmitPacketPtr g_returnPacket;
363 bool g_returnPacketEventStarted{
false};
364 std::size_t g_returnPacketStartPosition{0};
365 bool g_isAskingFullUpdate{
false};
366 uint16_t g_returnPacketEventCount{0};
367 std::chrono::steady_clock::time_point g_returnPacketTimePoint;
369 void* g_crypt_ctx{
nullptr};