}
}
+ [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;
//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...)
*
*
* So...
*/
+
+ bool result = true;
lock (reliableDataPacketsMissing)
{
//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>