From 853e01c192888b30d1cdc277b2033e2ba97a5fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 20 Mar 2019 17:12:34 +0100 Subject: [PATCH] Enet fixes (#200) * Network/ENet: Fix UnreliableFragment flag * Network/ENet: Match libenet new behavior on DisconnectLater --- ChangeLog.md | 2 ++ include/Nazara/Network/ENetPeer.inl | 2 +- src/Nazara/Network/ENetPeer.cpp | 15 +++++++++++---- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 945d1f3ab..410312517 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -172,6 +172,8 @@ Nazara Engine: - ⚠ **By default, Nazara computes the mass center of all 2D physics object when calling SetGeom** - ⚠ Added Collider2D::ComputeCenterOfMass - Signal now implement a copy constructor and copy assignation operator for convenience +- Fixed ENet UnreliableFragment packets sent as Unreliable (and such being incomplete upon reception) +- ENet DisconnectLater now reflects libenet behavior (and is waiting for unreliable commands to be sent before disconnecting for good) Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Network/ENetPeer.inl b/include/Nazara/Network/ENetPeer.inl index 04ec4aae2..7820620ca 100644 --- a/include/Nazara/Network/ENetPeer.inl +++ b/include/Nazara/Network/ENetPeer.inl @@ -74,7 +74,7 @@ namespace Nz inline bool ENetPeer::HasPendingCommands() { - return m_outgoingReliableCommands.empty() && m_outgoingUnreliableCommands.empty() && m_sentReliableCommands.empty(); + return m_outgoingReliableCommands.empty() && m_outgoingUnreliableCommands.empty() && m_sentReliableCommands.empty() && m_sentUnreliableCommands.empty(); } inline bool ENetPeer::IsConnected() const diff --git a/src/Nazara/Network/ENetPeer.cpp b/src/Nazara/Network/ENetPeer.cpp index fbae65e14..823eaaf18 100644 --- a/src/Nazara/Network/ENetPeer.cpp +++ b/src/Nazara/Network/ENetPeer.cpp @@ -212,7 +212,7 @@ namespace Nz if ((packetRef->flags & (ENetPacketFlag_Reliable | ENetPacketFlag_UnreliableFragment)) == ENetPacketFlag_UnreliableFragment && channel.outgoingUnreliableSequenceNumber < 0xFFFF) { - commandNumber = ENetProtocolCommand_SendUnreliable; + commandNumber = ENetProtocolCommand_SendUnreliableFragment; startSequenceNumber = HostToNet(channel.outgoingUnreliableSequenceNumber + 1); } else @@ -770,7 +770,7 @@ namespace Nz break; if ((incomingCommand.command.header.command & ENetProtocolCommand_Mask) != ENetProtocolCommand_SendUnreliableFragment || - totalLength != incomingCommand.packet->data.GetDataSize() || fragmentCount != incomingCommand.fragments.GetSize()) + totalLength != incomingCommand.packet->data.GetDataSize() || fragmentCount != incomingCommand.fragments.GetSize()) return false; startCommand = &incomingCommand; @@ -778,9 +778,10 @@ namespace Nz } } - if (startCommand) + if (!startCommand) { - if (!QueueIncomingCommand(*command, nullptr, totalLength, ENetPacketFlag_UnreliableFragment, fragmentCount)) + startCommand = QueueIncomingCommand(*command, nullptr, totalLength, ENetPacketFlag_UnreliableFragment, fragmentCount); + if (!startCommand) return false; } @@ -1040,7 +1041,13 @@ namespace Nz void ENetPeer::RemoveSentUnreliableCommands() { + if (m_sentUnreliableCommands.empty()) + return; + m_sentUnreliableCommands.clear(); + + if (m_state == ENetPeerState::DisconnectLater && !HasPendingCommands()) + Disconnect(m_eventData); } void ENetPeer::ResetQueues()