Beispiel #1
0
 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);
         }
     }
 }
Beispiel #2
0
        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);
            }
        }