From 08feb25f76d8f1c773e50a4e4ada6fb3ca742fa1 Mon Sep 17 00:00:00 2001 From: Oliver Schramm Date: Sat, 9 Jan 2021 19:55:14 +0100 Subject: [PATCH] Don't ack unreceived packets --- Hazel.UnitTests/UdpReliabilityTests.cs | 30 ++++++++++++++++++++++++++ Hazel/Udp/UdpConnection.Reliable.cs | 12 ++++++----- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/Hazel.UnitTests/UdpReliabilityTests.cs b/Hazel.UnitTests/UdpReliabilityTests.cs index d313cdf..ef36485 100644 --- a/Hazel.UnitTests/UdpReliabilityTests.cs +++ b/Hazel.UnitTests/UdpReliabilityTests.cs @@ -46,6 +46,36 @@ namespace Hazel.UnitTests } } + [TestMethod] + public void TestAcksForNotReceivedMessages() + { + List messagesReceived = new List(); + + UdpConnectionTestHarness dut = new UdpConnectionTestHarness(); + dut.DataReceived += evt => + { + messagesReceived.Add(evt.Message); + }; + + MessageWriter data = MessageWriter.Get(SendOption.Reliable); + + SetReliableId(data, 1); + dut.Test_Receive(data); + + SetReliableId(data, 3); + dut.Test_Receive(data); + + MessageReader ackPacket = dut.BytesSent[1]; + // Must be ack + Assert.AreEqual(4, ackPacket.Length); + + byte recentPackets = ackPacket.Buffer[3]; + // Last packet was not received + Assert.AreEqual(0, recentPackets & 1); + // The packet before that was. + Assert.AreEqual(1, (recentPackets >> 1) & 1); + } + private static void SetReliableId(MessageWriter data, int i) { ushort id = (ushort)i; diff --git a/Hazel/Udp/UdpConnection.Reliable.cs b/Hazel/Udp/UdpConnection.Reliable.cs index 8fc3d7e..46ffc49 100644 --- a/Hazel/Udp/UdpConnection.Reliable.cs +++ b/Hazel/Udp/UdpConnection.Reliable.cs @@ -311,9 +311,6 @@ namespace Hazel.Udp //Get the ID form the packet id = (ushort)((b1 << 8) + b2); - //Send an acknowledgement - SendAck(id); - /* * It gets a little complicated here (note the fact I'm actually using a multiline comment for once...) * @@ -338,6 +335,8 @@ namespace Hazel.Udp * * So... */ + + bool result = true; lock (reliableDataPacketsMissing) { @@ -381,12 +380,15 @@ namespace Hazel.Udp //See if we're missing it, else this packet is a duplicate as so we return false if (!reliableDataPacketsMissing.Remove(id)) { - return false; + result = false; } } } - return true; + // Send an acknowledgement + SendAck(id); + + return result; } /// -- 2.39.5