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; }
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); }