Пример #1
0
 internal ReliablePacket(ushort sequence, byte[] payload, int offset, int length)
 {
     this.ExplicitResponse = ExplicitResponseState.None;
     this.Sequence         = sequence;
     this.payload          = payload;
     this.offset           = offset;
     this.length           = length;
 }
Пример #2
0
        public override ChanneledPacket HandleIncomingMessagePoll(byte[] buffer, int length, out bool hasMore)
        {
            hasMore = false;

            UnreliableSequencedPacket packet = new UnreliableSequencedPacket();

            packet.Read(buffer, length);

            long distance = SequencingUtils.Distance(packet.Sequence, _lastReceivedSequenceNumber, sizeof(ushort));

            if (distance > 0)
            {
                // This packet is a future packet
                _lastReceivedSequenceNumber = packet.Sequence;
                _receiveSequencer.Push(packet);
            }

            // Set the ack
            if (_sendSequencer.HasMessage(packet.AckSequence) && _sendSequencer.Peek(packet.AckSequence).ExplicitResponse != ExplicitResponseState.Ack)
            {
                packet.ExplicitResponse = ExplicitResponseState.Ack;
                OnMessageAck(packet.AckSequence);
            }

            // Resolve their acks & nacks from mask
            for (int i = 0; i < Constants.ACK_MASK_BITS; i++)
            {
                if (_sendSequencer.HasMessage(packet.AckSequence - i))
                {
                    ExplicitResponseState newState     = (packet.AckMask & (1UL << i)) != 0 ? ExplicitResponseState.Ack : ExplicitResponseState.Nack;
                    ExplicitResponseState currentState = _sendSequencer.Peek(packet.AckSequence - i).ExplicitResponse;

                    if (currentState != newState && currentState != ExplicitResponseState.Ack)
                    {
                        if (newState == ExplicitResponseState.Ack)
                        {
                            OnMessageAck(packet.AckSequence - i);
                        }
                        if (newState == ExplicitResponseState.Nack)
                        {
                            OnMessageNack(packet.AckSequence - i);
                        }
                    }

                    _sendSequencer.Peek(packet.AckSequence - i).ExplicitResponse = newState;
                }
            }


            return(distance > 0 ? packet : null);
        }