113class FGE_API NetFluxUdp
116 NetFluxUdp(
bool defaultFlux);
117 NetFluxUdp(NetFluxUdp
const& r) =
delete;
118 NetFluxUdp(NetFluxUdp&& r)
noexcept =
delete;
119 virtual ~NetFluxUdp();
121 NetFluxUdp& operator=(NetFluxUdp
const& r) =
delete;
122 NetFluxUdp& operator=(NetFluxUdp&& r)
noexcept =
delete;
125 [[nodiscard]] ReceivedPacketPtr popNextPacket();
127 [[nodiscard]] std::size_t getPacketsSize()
const;
128 [[nodiscard]]
bool isEmpty()
const;
130 void setMaxPackets(std::size_t n);
131 [[nodiscard]] std::size_t getMaxPackets()
const;
133 [[nodiscard]]
bool isDefaultFlux()
const;
136 bool pushPacket(ReceivedPacketPtr&& fluxPck);
137 void forcePushPacket(ReceivedPacketPtr fluxPck);
138 void forcePushPacketFront(ReceivedPacketPtr fluxPck);
140 mutable std::mutex _g_mutexFlux;
141 std::deque<ReceivedPacketPtr> _g_packets;
142 std::size_t _g_remainingPackets{0};
145 std::size_t g_maxPackets = FGE_SERVER_DEFAULT_MAXPACKET;
146 bool g_isDefaultFlux{
false};
148 friend class ServerSideNetUdp;
149 friend class PacketReorderer;
152class FGE_API ServerNetFluxUdp :
public NetFluxUdp,
public ReturnPacketHandler
155 ServerNetFluxUdp(ServerSideNetUdp& server,
bool defaultFlux);
156 ~ServerNetFluxUdp()
override =
default;
158 void processClients();
159 [[nodiscard]] FluxProcessResults process(ClientSharedPtr& refClient, ReceivedPacketPtr& packet);
161 void disconnectAllClients(std::chrono::milliseconds delay = std::chrono::milliseconds(0))
const;
174 [[nodiscard]]
bool verifyRealm(ClientSharedPtr
const& refClient, ReceivedPacketPtr
const& packet);
176 [[nodiscard]] FluxProcessResults processUnknownClient(ClientSharedPtr& refClient, ReceivedPacketPtr& packet);
178 ServerSideNetUdp*
const g_server{
nullptr};
179 std::chrono::milliseconds g_commandsUpdateTick{0};
180 std::chrono::steady_clock::time_point g_lastCommandUpdateTimePoint{std::chrono::steady_clock::now()};
196class FGE_API ServerSideNetUdp
199 explicit ServerSideNetUdp(IpAddress::Types addressType = IpAddress::Types::Ipv4);
200 ServerSideNetUdp(ServerSideNetUdp
const& r) =
delete;
201 ServerSideNetUdp(ServerSideNetUdp&& r)
noexcept =
delete;
204 ServerSideNetUdp& operator=(ServerSideNetUdp
const& r) =
delete;
205 ServerSideNetUdp& operator=(ServerSideNetUdp&& r)
noexcept =
delete;
207 void setVersioningString(std::string_view versioningString);
208 [[nodiscard]] std::string
const& getVersioningString()
const;
211 start(Port bindPort,
IpAddress const& bindIp, IpAddress::Types addressType = IpAddress::Types::None);
212 [[nodiscard]]
bool start(IpAddress::Types addressType = IpAddress::Types::None);
235 [[nodiscard]] std::size_t getFluxSize()
const;
237 [[nodiscard]] IpAddress::Types getAddressType()
const;
242 void repushPacket(ReceivedPacketPtr&& packet);
252 [[nodiscard]]
bool isRunning()
const;
254 [[nodiscard]]
bool announceNewClient(
Identity const& identity, ClientSharedPtr
const& client);
256 void sendTo(TransmitPacketPtr& pck,
Client const& client,
Identity const&
id);
257 void sendTo(TransmitPacketPtr& pck,
Identity const&
id);
259 [[nodiscard]]
void* getCryptContext()
const;
262 void threadReception();
263 void threadTransmission();
265 std::unique_ptr<std::thread> g_threadReception;
266 std::unique_ptr<std::thread> g_threadTransmission;
268 std::condition_variable g_transmissionNotifier;
270 mutable std::mutex g_mutexServer;
272 std::vector<std::unique_ptr<ServerNetFluxUdp>> g_fluxes;
274 std::queue<std::pair<TransmitPacketPtr, Identity>> g_transmissionQueue;
276 std::unordered_map<Identity, std::weak_ptr<Client>,
IdentityHash> g_clientsMap;
283 std::string g_versioningString;
293class FGE_API ClientSideNetUdp :
public NetFluxUdp
296 explicit ClientSideNetUdp(IpAddress::Types addressType = IpAddress::Types::Ipv4);
297 ClientSideNetUdp(ClientSideNetUdp
const& r) =
delete;
298 ClientSideNetUdp(ClientSideNetUdp&& r)
noexcept =
delete;
299 ~ClientSideNetUdp()
override;
301 ClientSideNetUdp& operator=(ClientSideNetUdp
const& r) =
delete;
302 ClientSideNetUdp& operator=(ClientSideNetUdp&& r)
noexcept =
delete;
304 [[nodiscard]]
bool start(Port bindPort,
306 Port connectRemotePort,
308 IpAddress::Types addressType = IpAddress::Types::None);
311 void notifyTransmission();
312 [[nodiscard]]
bool isRunning()
const;
314 [[nodiscard]] std::future<uint16_t> retrieveMTU();
315 [[nodiscard]] std::future<bool> connect(std::string_view versioningString = std::string_view{});
316 [[nodiscard]] std::future<void> disconnect();
318 [[nodiscard]] IpAddress::Types getAddressType()
const;
320 [[nodiscard]] std::size_t waitForPackets(std::chrono::milliseconds time_ms);
322 [[nodiscard]]
Identity const& getClientIdentity()
const;
324 template<
class TPacket = Packet>
327 enum ProcessOptions : uint32_t
330 OPTION_NO_TIMEOUT = 1 << 0,
331 OPTION_ONE_SHOT = 1 << 1
333 [[nodiscard]] FluxProcessResults process(ReceivedPacketPtr& packet,
336 void resetReturnPacket();
337 [[nodiscard]] TransmitPacketPtr& startComplexReturnEvent(uint16_t
id);
338 TransmitPacketPtr& startObjectReturnEvent(uint16_t commandIndex, ObjectSid parentSid, ObjectSid targetSid);
339 void endReturnEvent();
341 void simpleReturnEvent(uint16_t
id);
342 bool askFullUpdateReturnEvent();
344 void enableReturnPacket(
bool enable);
345 [[nodiscard]]
bool isReturnPacketEnabled()
const;
347 [[nodiscard]] TransmitPacketPtr prepareAndRetrieveReturnPacket();
348 [[nodiscard]] std::optional<Error> loopbackReturnPacket(
ReturnPacketHandler const& handler);
358 void threadReception();
359 void threadTransmission();
361 TransmitPacketPtr& startReturnEvent(ReturnEvents event);
363 std::unique_ptr<std::thread> g_threadReception;
364 std::unique_ptr<std::thread> g_threadTransmission;
366 std::condition_variable g_transmissionNotifier;
367 std::condition_variable g_receptionNotifier;
370 bool g_running{
false};
374 std::recursive_mutex g_mutexCommands;
376 bool g_returnPacketEnabled{
false};
377 TransmitPacketPtr g_returnPacket;
378 bool g_returnPacketEventStarted{
false};
379 std::size_t g_returnPacketStartPosition{0};
380 bool g_isAskingFullUpdate{
false};
381 uint16_t g_returnPacketEventCount{0};
382 std::chrono::steady_clock::time_point g_returnPacketTimePoint;
384 void* g_crypt_ctx{
nullptr};
Definition C_client.hpp:173