]> git.deb.at Git - rhonda/impostor.hazel.git/commitdiff
Don't ack unreceived packets
authorOliver Schramm <oliver.schramm97@gmail.com>
Sat, 9 Jan 2021 18:55:14 +0000 (19:55 +0100)
committerOliver Schramm <oliver.schramm97@gmail.com>
Sun, 10 Jan 2021 18:11:40 +0000 (19:11 +0100)
Hazel.UnitTests/UdpReliabilityTests.cs
Hazel/Udp/UdpConnection.Reliable.cs

index d313cdf9e2239829a4d92416845c26ab54f2ead4..ef364851030cb568b703431ea30ce9db6d8ba5b8 100644 (file)
@@ -46,6 +46,36 @@ namespace Hazel.UnitTests
             }
         }
 
+        [TestMethod]
+        public void TestAcksForNotReceivedMessages()
+        {
+            List<MessageReader> messagesReceived = new List<MessageReader>();
+
+            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;
index 8fc3d7edb24fb6a4b0c1aafe1cc50144eb3d4fb9..46ffc49638a0036bbdca2a16f025e91ccb49d43d 100644 (file)
@@ -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;
         }
 
         /// <summary>