public Packet[] ReceivePackets(Stream stream)
        {
            //Read the most recent packet received in the current batch.
            var newLastReceivedFromOther = ReadLong(stream);

            //Get the number of new packets received in this call, this number may be negative, which is fine as the packets will be read and discarded.
            var numPackets2 = newLastReceivedFromOther - lastReceivedFromOther;

            //Read the most recent packet received from the other client.
            var newLastReceivedFromMe = ReadLong(stream);

            var amount = newLastReceivedFromMe - lastReceivedFromMe;

            if (amount > 0)
            {
                lock (lockobj)
                    _queue.RemoveRange(0, (int)amount);
                lastReceivedFromMe = newLastReceivedFromMe;
            }

            //The number of packets received in this batch
            var numPackets = ReadLong(stream);

            //Only return new packets
            Packet[] packets = new Packet[numPackets2 < 0 ? 0 : numPackets2];
            for (var i = 0; i < numPackets; i++)
            {
                //If the packet is new, store it
                if (newLastReceivedFromOther - numPackets + i >= lastReceivedFromOther)
                {
                    packets[newLastReceivedFromOther - numPackets + i - lastReceivedFromOther] = Packet.ReadPacket(stream);
                }
                else
                {
                    //We still have to read it if it's old, but we just don't use it.
                    Packet.ReadPacket(stream);
                }
            }

            lastReceivedFromOther = Math.Max(newLastReceivedFromOther, newLastReceivedFromOther);

            return(packets);
        }
 public void AddPacket(Packet packet)
 {
     lock (lockobj)
         _queue.Add(packet);
     ++id;
 }