public void OnNack(NackPacket nackPacket) { for (int i = 0; i < nackPacket.SequenceIds.Count; i++) { if (ReSendPackets.ContainsKey(nackPacket.SequenceIds[i])) { SendDataPacket(ReSendPackets[nackPacket.SequenceIds[i]].Data); } } }
public void OnReceive(DataPacket dataPacket) { AckPacket packet = new AckPacket(new[] { dataPacket.SequenceId }); _client.Send(EndPoint, packet); if (dataPacket.SequenceId > ReceiveSequenceId) { uint seq = dataPacket.SequenceId - ReceiveSequenceId; for (uint i = 0; i < seq; i++) { NackPacket nackPacket = new NackPacket(new[] { dataPacket.SequenceId - i - 1 }); _client.Send(EndPoint, nackPacket); } } if (dataPacket.SequenceId >= ReceiveSequenceId) { ReceiveSequenceId = dataPacket.SequenceId + 1; } EncapsulatedPacket encapsulatedPacket = new EncapsulatedPacket(); encapsulatedPacket.Decode(dataPacket.Data); if (encapsulatedPacket.IsSplit) { if (!SplitsPackets.ContainsKey(encapsulatedPacket.SplitId)) { SplitsPackets[encapsulatedPacket.SplitId] = new List <EncapsulatedPacket>(); } SplitsPackets[encapsulatedPacket.SplitId].Add(encapsulatedPacket); if (SplitsPackets[encapsulatedPacket.SplitId].Count == encapsulatedPacket.LastSplitIndex + 1) { SplitsPackets[encapsulatedPacket.SplitId].Sort(Comparison); BinaryStream stream = new BinaryStream(); foreach (var splitsPacket in SplitsPackets[encapsulatedPacket.SplitId]) { stream.WriteBytes(splitsPacket.Payload); } SplitsPackets.Remove(encapsulatedPacket.SplitId); encapsulatedPacket = new EncapsulatedPacket(encapsulatedPacket.Reliability, encapsulatedPacket.MessageId, stream.GetBuffer()); } else { return; } } if (!MessageWindow.Contains(encapsulatedPacket.MessageId)) { if (MessageWindow.Count >= 50) { MessageWindow.RemoveAt(0); } MessageWindow.Add(encapsulatedPacket.MessageId); OnEncapsulatedPacket(encapsulatedPacket); } }