Skip to content

Commit 15a53ed

Browse files
committed
rework FluxProcessResults: this fix a packets process lag
1 parent 5fb1941 commit 15a53ed

File tree

5 files changed

+59
-49
lines changed

5 files changed

+59
-49
lines changed

examples/clientServerLifeSimulator_004/client/main.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,14 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] char* argv[])
289289

290290
//Handling server packets
291291
fge::net::ReceivedPacketPtr packet;
292-
while (server.process(packet) == fge::net::FluxProcessResults::RETRIEVABLE)
293-
{
292+
fge::net::FluxProcessResults processResult;
293+
do {
294+
processResult = server.process(packet);
295+
if (processResult != fge::net::FluxProcessResults::USER_RETRIEVABLE)
296+
{
297+
continue;
298+
}
299+
294300
//Prepare a sending packet
295301
auto transmissionPacket = fge::net::CreatePacket();
296302

@@ -403,7 +409,7 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] char* argv[])
403409
default:
404410
break;
405411
}
406-
}
412+
} while (processResult != fge::net::FluxProcessResults::NONE_AVAILABLE);
407413

408414
//Update scene
409415
mainScene->update(renderWindow, event,

examples/clientServerLifeSimulator_004/server/main.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,14 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] char* argv[])
210210
//Handling clients packets
211211
fge::net::ClientSharedPtr client;
212212
fge::net::ReceivedPacketPtr packet;
213-
while (serverFlux->process(client, packet, true) == fge::net::FluxProcessResults::RETRIEVABLE)
214-
{
213+
fge::net::FluxProcessResults processResult;
214+
do {
215+
processResult = serverFlux->process(client, packet, true);
216+
if (processResult != fge::net::FluxProcessResults::USER_RETRIEVABLE)
217+
{
218+
continue;
219+
}
220+
215221
//Prepare a sending packet
216222
auto transmissionPacket = fge::net::CreatePacket();
217223

@@ -316,7 +322,7 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] char* argv[])
316322
default:
317323
break;
318324
}
319-
}
325+
} while (processResult != fge::net::FluxProcessResults::NONE_AVAILABLE);
320326

321327
//Scene update
322328
mainScene.update(event, std::chrono::duration_cast<std::chrono::milliseconds>(deltaTime.restart()));

includes/FastEngine/network/C_netCommand.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
#define FGE_NET_MTU_TIMEOUT_MS \
3535
std::chrono::milliseconds \
3636
{ \
37-
500 \
37+
400 \
3838
}
3939
#define FGE_NET_MTU_TRY_COUNT 12
4040
#define FGE_NET_MTU_MIN_INTERVAL 16

includes/FastEngine/network/C_server.hpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,12 @@ class ClientSideNetUdp;
5959

6060
enum class FluxProcessResults
6161
{
62-
RETRIEVABLE,
63-
BAD_REALM,
64-
BAD_REORDER,
65-
NOT_RETRIEVABLE,
66-
INTERNALLY_HANDLED
62+
USER_RETRIEVABLE,
63+
64+
INTERNALLY_HANDLED,
65+
INTERNALLY_DISCARDED,
66+
67+
NONE_AVAILABLE
6768
};
6869

6970
enum class ReturnEvents

sources/network/C_server.cpp

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@ FluxProcessResults NetFluxUdp::processReorder(Client& client,
7373

7474
if (stat == PacketReorderer::Stats::RETRIEVABLE)
7575
{
76-
return FluxProcessResults::RETRIEVABLE;
76+
return FluxProcessResults::USER_RETRIEVABLE;
7777
}
7878

7979
client.getPacketReorderer().push(std::move(packet));
80-
return FluxProcessResults::NOT_RETRIEVABLE;
80+
return FluxProcessResults::INTERNALLY_HANDLED;
8181
}
8282

8383
//We push the packet in the reorderer
@@ -89,7 +89,7 @@ FluxProcessResults NetFluxUdp::processReorder(Client& client,
8989
auto const stat = client.getPacketReorderer().checkStat(currentCounter, currentRealm).value();
9090
if (!forced && stat != PacketReorderer::Stats::RETRIEVABLE)
9191
{
92-
return FluxProcessResults::NOT_RETRIEVABLE;
92+
return FluxProcessResults::INTERNALLY_HANDLED;
9393
}
9494

9595
packet = client.getPacketReorderer().pop();
@@ -129,7 +129,7 @@ FluxProcessResults NetFluxUdp::processReorder(Client& client,
129129

130130
FGE_PLACE_DESTRUCT(ReceivedPacketPtr, FGE_NET_PACKET_REORDERER_CACHE_MAX, containerInversed);
131131

132-
return FluxProcessResults::RETRIEVABLE;
132+
return FluxProcessResults::USER_RETRIEVABLE;
133133
}
134134

135135
ReceivedPacketPtr NetFluxUdp::popNextPacket()
@@ -265,15 +265,15 @@ ServerNetFluxUdp::process(ClientSharedPtr& refClient, ReceivedPacketPtr& packet,
265265
if (this->_g_remainingPackets == 0)
266266
{
267267
this->_g_remainingPackets = this->getPacketsSize();
268-
return FluxProcessResults::NOT_RETRIEVABLE;
268+
return FluxProcessResults::NONE_AVAILABLE;
269269
}
270270

271271
//Popping the next packet
272272
packet = this->popNextPacket();
273273
if (!packet)
274274
{
275275
this->_g_remainingPackets = this->getPacketsSize();
276-
return FluxProcessResults::NOT_RETRIEVABLE;
276+
return FluxProcessResults::NONE_AVAILABLE;
277277
}
278278
--this->_g_remainingPackets;
279279

@@ -288,15 +288,15 @@ ServerNetFluxUdp::process(ClientSharedPtr& refClient, ReceivedPacketPtr& packet,
288288
}
289289

290290
this->g_server->repushPacket(std::move(packet));
291-
return FluxProcessResults::NOT_RETRIEVABLE;
291+
return FluxProcessResults::INTERNALLY_HANDLED;
292292
}
293293
refClient = refClientData->_client;
294294
auto const& status = refClient->getStatus();
295295

296296
//Ignore packets if the client is disconnected
297297
if (status.isDisconnected())
298298
{
299-
return FluxProcessResults::NOT_RETRIEVABLE;
299+
return FluxProcessResults::INTERNALLY_DISCARDED;
300300
}
301301

302302
//Check if the client is in an acknowledged state
@@ -316,12 +316,12 @@ ServerNetFluxUdp::process(ClientSharedPtr& refClient, ReceivedPacketPtr& packet,
316316
}
317317
else
318318
{
319-
return FluxProcessResults::NOT_RETRIEVABLE;
319+
return FluxProcessResults::INTERNALLY_HANDLED;
320320
}
321321

322322
if (!packet->haveCorrectHeader())
323323
{
324-
return FluxProcessResults::NOT_RETRIEVABLE;
324+
return FluxProcessResults::INTERNALLY_DISCARDED;
325325
}
326326
}
327327

@@ -334,7 +334,7 @@ ServerNetFluxUdp::process(ClientSharedPtr& refClient, ReceivedPacketPtr& packet,
334334
if (!packet->checkFlags(FGE_NET_HEADER_DO_NOT_REORDER_FLAG) && !packet->isMarkedAsLocallyReordered())
335335
{
336336
auto reorderResult = this->processReorder(*refClient, packet, refClient->getClientPacketCounter(), true);
337-
if (reorderResult != FluxProcessResults::RETRIEVABLE)
337+
if (reorderResult != FluxProcessResults::USER_RETRIEVABLE)
338338
{
339339
return reorderResult;
340340
}
@@ -343,7 +343,7 @@ ServerNetFluxUdp::process(ClientSharedPtr& refClient, ReceivedPacketPtr& packet,
343343
//Verify the realm
344344
if (!this->verifyRealm(refClient, packet))
345345
{
346-
return FluxProcessResults::BAD_REALM;
346+
return FluxProcessResults::INTERNALLY_DISCARDED;
347347
}
348348

349349
auto const stat =
@@ -354,8 +354,7 @@ ServerNetFluxUdp::process(ClientSharedPtr& refClient, ReceivedPacketPtr& packet,
354354
if (stat == PacketReorderer::Stats::OLD_COUNTER)
355355
{
356356
refClient->advanceLostPacketCount();
357-
--this->_g_remainingPackets;
358-
return FluxProcessResults::NOT_RETRIEVABLE;
357+
return FluxProcessResults::INTERNALLY_DISCARDED;
359358
}
360359
}
361360

@@ -476,7 +475,7 @@ ServerNetFluxUdp::process(ClientSharedPtr& refClient, ReceivedPacketPtr& packet,
476475
return FluxProcessResults::INTERNALLY_HANDLED;
477476
}
478477

479-
return FluxProcessResults::RETRIEVABLE;
478+
return FluxProcessResults::USER_RETRIEVABLE;
480479
}
481480

482481
FluxProcessResults ServerNetFluxUdp::processUnknownClient(ClientSharedPtr& refClient, ReceivedPacketPtr& packet)
@@ -485,7 +484,7 @@ FluxProcessResults ServerNetFluxUdp::processUnknownClient(ClientSharedPtr& refCl
485484
if (packet->isFragmented())
486485
{
487486
//We can't (disallow) process fragmented packets from unknown clients
488-
return FluxProcessResults::NOT_RETRIEVABLE;
487+
return FluxProcessResults::INTERNALLY_DISCARDED;
489488
}
490489

491490
//Check if the packet is a handshake
@@ -506,7 +505,7 @@ FluxProcessResults ServerNetFluxUdp::processUnknownClient(ClientSharedPtr& refCl
506505
versioningString != this->g_server->getVersioningString())
507506
{ //TODO: endReached() check should be done in .end() method
508507
std::cout << "Handshake failed" << std::endl;
509-
return FluxProcessResults::NOT_RETRIEVABLE;
508+
return FluxProcessResults::INTERNALLY_DISCARDED;
510509
}
511510

512511
std::cout << "Handshake accepted" << std::endl;
@@ -537,7 +536,7 @@ FluxProcessResults ServerNetFluxUdp::processUnknownClient(ClientSharedPtr& refCl
537536
}
538537

539538
//We can't process packets further for unknown clients
540-
return FluxProcessResults::NOT_RETRIEVABLE;
539+
return FluxProcessResults::INTERNALLY_DISCARDED;
541540
}
542541
FluxProcessResults ServerNetFluxUdp::processAcknowledgedClient(ClientList::Data& refClientData,
543542
ReceivedPacketPtr& packet)
@@ -577,7 +576,7 @@ FluxProcessResults ServerNetFluxUdp::processAcknowledgedClient(ClientList::Data&
577576
//Discard the packet and the client
578577
this->_clients.remove(packet->getIdentity());
579578
this->_onClientDropped.call(refClientData._client, packet->getIdentity());
580-
return FluxProcessResults::NOT_RETRIEVABLE;
579+
return FluxProcessResults::INTERNALLY_DISCARDED;
581580
}
582581
std::cout << "CryptServerCreate success, starting crypt exchange" << std::endl;
583582
refClientData._client->getStatus().setNetworkStatus(ClientStatus::NetworkStatus::MTU_DISCOVERED);
@@ -594,7 +593,7 @@ FluxProcessResults ServerNetFluxUdp::processAcknowledgedClient(ClientList::Data&
594593
//Discard the packet and the client
595594
this->_clients.remove(packet->getIdentity());
596595
this->_onClientDropped.call(refClientData._client, packet->getIdentity());
597-
return FluxProcessResults::NOT_RETRIEVABLE;
596+
return FluxProcessResults::INTERNALLY_DISCARDED;
598597
}
599598

600599
if (result == NetCommandResults::SUCCESS)
@@ -617,7 +616,7 @@ FluxProcessResults ServerNetFluxUdp::processAcknowledgedClient(ClientList::Data&
617616
//Discard the packet and the client
618617
this->_clients.remove(packet->getIdentity());
619618
this->_onClientDropped.call(refClientData._client, packet->getIdentity());
620-
return FluxProcessResults::NOT_RETRIEVABLE;
619+
return FluxProcessResults::INTERNALLY_DISCARDED;
621620
}
622621

623622
std::cout << "CryptServerCreate success, starting crypt exchange" << std::endl;
@@ -638,7 +637,7 @@ FluxProcessResults ServerNetFluxUdp::processMTUDiscoveredClient(ClientList::Data
638637
//Check if the packet is a crypt handshake
639638
if (packet->retrieveHeaderId().value() != NET_INTERNAL_ID_CRYPT_HANDSHAKE)
640639
{
641-
return FluxProcessResults::NOT_RETRIEVABLE;
640+
return FluxProcessResults::INTERNALLY_DISCARDED;
642641
}
643642

644643
auto& refClient = refClientData._client;
@@ -662,7 +661,7 @@ FluxProcessResults ServerNetFluxUdp::processMTUDiscoveredClient(ClientList::Data
662661
refClient->getStatus().setNetworkStatus(ClientStatus::NetworkStatus::DISCONNECTED);
663662
this->_clients.remove(packet->getIdentity());
664663
this->_onClientDropped.call(refClient, packet->getIdentity());
665-
return FluxProcessResults::NOT_RETRIEVABLE;
664+
return FluxProcessResults::INTERNALLY_DISCARDED;
666665
}
667666
}
668667

@@ -672,7 +671,7 @@ FluxProcessResults ServerNetFluxUdp::processMTUDiscoveredClient(ClientList::Data
672671
if (pendingSize == 0)
673672
{
674673
std::cout << "NONE" << std::endl;
675-
return FluxProcessResults::NOT_RETRIEVABLE;
674+
return FluxProcessResults::INTERNALLY_DISCARDED;
676675
}
677676
std::cout << "transmitting crypt" << std::endl;
678677
auto response = CreatePacket(NET_INTERNAL_ID_CRYPT_HANDSHAKE);
@@ -686,7 +685,7 @@ FluxProcessResults ServerNetFluxUdp::processMTUDiscoveredClient(ClientList::Data
686685
refClient->getStatus().setNetworkStatus(ClientStatus::NetworkStatus::DISCONNECTED);
687686
this->_clients.remove(packet->getIdentity());
688687
this->_onClientDropped.call(refClient, packet->getIdentity());
689-
return FluxProcessResults::NOT_RETRIEVABLE;
688+
return FluxProcessResults::INTERNALLY_DISCARDED;
690689
}
691690
refClient->pushPacket(std::move(response));
692691
this->g_server->notifyTransmission();
@@ -1330,11 +1329,10 @@ FluxProcessResults ClientSideNetUdp::process(ReceivedPacketPtr& packet)
13301329
///TODO: no lock ?
13311330
packet.reset();
13321331

1333-
auto const networkStatus = this->_client.getStatus().getNetworkStatus();
1334-
if (networkStatus == ClientStatus::NetworkStatus::TIMEOUT ||
1335-
networkStatus == ClientStatus::NetworkStatus::DISCONNECTED)
1332+
if (this->_client.getStatus().isDisconnected())
13361333
{
1337-
return FluxProcessResults::NOT_RETRIEVABLE;
1334+
this->_g_remainingPackets = 0;
1335+
return FluxProcessResults::NONE_AVAILABLE;
13381336
}
13391337

13401338
//Checking timeout
@@ -1344,7 +1342,7 @@ FluxProcessResults ClientSideNetUdp::process(ReceivedPacketPtr& packet)
13441342
this->_g_remainingPackets = 0;
13451343
this->clearPackets();
13461344
this->_onClientTimeout.call(*this);
1347-
return FluxProcessResults::NOT_RETRIEVABLE;
1345+
return FluxProcessResults::NONE_AVAILABLE;
13481346
}
13491347

13501348
//Checking return packet
@@ -1363,23 +1361,23 @@ FluxProcessResults ClientSideNetUdp::process(ReceivedPacketPtr& packet)
13631361
if (this->_g_remainingPackets == 0)
13641362
{
13651363
this->_g_remainingPackets = this->getPacketsSize();
1366-
return FluxProcessResults::NOT_RETRIEVABLE;
1364+
return FluxProcessResults::NONE_AVAILABLE;
13671365
}
13681366

13691367
//Popping the next packet
13701368
packet = this->popNextPacket();
13711369
if (!packet)
13721370
{
13731371
this->_g_remainingPackets = this->getPacketsSize();
1374-
return FluxProcessResults::NOT_RETRIEVABLE;
1372+
return FluxProcessResults::NONE_AVAILABLE;
13751373
}
13761374
--this->_g_remainingPackets;
13771375

13781376
if (!packet->checkFlags(FGE_NET_HEADER_DO_NOT_REORDER_FLAG) && !packet->isMarkedAsLocallyReordered())
13791377
{
13801378
auto reorderResult =
13811379
this->processReorder(this->_client, packet, this->_client.getCurrentPacketCounter(), false);
1382-
if (reorderResult != FluxProcessResults::RETRIEVABLE)
1380+
if (reorderResult != FluxProcessResults::USER_RETRIEVABLE)
13831381
{
13841382
return reorderResult;
13851383
}
@@ -1393,8 +1391,7 @@ FluxProcessResults ClientSideNetUdp::process(ReceivedPacketPtr& packet)
13931391
if (stat == PacketReorderer::Stats::OLD_REALM || stat == PacketReorderer::Stats::OLD_COUNTER)
13941392
{
13951393
this->_client.advanceLostPacketCount();
1396-
--this->_g_remainingPackets;
1397-
return FluxProcessResults::NOT_RETRIEVABLE;
1394+
return FluxProcessResults::INTERNALLY_DISCARDED;
13981395
}
13991396
}
14001397

@@ -1404,7 +1401,7 @@ FluxProcessResults ClientSideNetUdp::process(ReceivedPacketPtr& packet)
14041401
this->_g_remainingPackets = 0;
14051402
this->clearPackets();
14061403
this->_onClientDisconnected.call(*this);
1407-
return FluxProcessResults::NOT_RETRIEVABLE;
1404+
return FluxProcessResults::NONE_AVAILABLE;
14081405
}
14091406

14101407
if (stat == PacketReorderer::Stats::WAITING_NEXT_REALM || stat == PacketReorderer::Stats::WAITING_NEXT_COUNTER)
@@ -1418,7 +1415,7 @@ FluxProcessResults ClientSideNetUdp::process(ReceivedPacketPtr& packet)
14181415
this->_client.setCurrentPacketCounter(serverCountId);
14191416
this->_client.setCurrentRealm(serverRealm);
14201417

1421-
return FluxProcessResults::RETRIEVABLE;
1418+
return FluxProcessResults::USER_RETRIEVABLE;
14221419
}
14231420

14241421
void ClientSideNetUdp::resetReturnPacket()

0 commit comments

Comments
 (0)