From: Oliver Schramm Date: Sat, 9 Jan 2021 18:55:14 +0000 (+0100) Subject: Don't ack unreceived packets X-Git-Tag: 1.0.0~18^2 X-Git-Url: https://git.deb.at/?a=commitdiff_plain;h=08feb25f76d8f1c773e50a4e4ada6fb3ca742fa1;p=rhonda%2Fimpostor.hazel.git Don't ack unreceived packets --- 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; } ///