Esempio n. 1
0
        public static bool TryUnpack(byte[] buf, ref int offset, out ReliableAckData data)
        {
            var channel = BinaryUtil.ReadShort(buf, ref offset);

            if ((byte)Type != buf[offset++])
            {
                data = default;
                return(false);
            }
            var received     = BinaryUtil.ReadShort(buf, ref offset);
            var nextReceived = BinaryUtil.ReadShort(buf, ref offset);
            var last         = BinaryUtil.ReadShort(buf, ref offset);

            data = new ReliableAckData(channel, received, nextReceived, last);
            return(true);
        }
Esempio n. 2
0
        public bool Receive(ReliableFlowControl control, out List <Fragment> output, double loss = 0)
        {
            int sendCount = 0;
            int lossCount = 0;

            output = new List <Fragment>();
            while (SentQueue.Count > 0)
            {
                var receive = SentQueue.Dequeue();
                sendCount++;
                if (m_Random.NextDouble() < loss)
                {
                    lossCount++;
                    if (SentQueue.Count == 0)
                    {
                        control.Update(TimeSpan.FromMilliseconds(100));
                    }
                    continue;
                }
                int offset = 0;
                if (ReliableAckData.TryUnpack(receive, ref offset, out var ack))
                {
                    control.ReceiveAck(ack);
                    if (SentQueue.Count == 0)
                    {
                        control.Update(TimeSpan.FromMilliseconds(100));
                    }
                    continue;
                }
                offset = 0;
                if (!ReliableData.TryUnpack(receive, ref offset, out var data))
                {
                    Assert.Fail();
                }
                if (control.Enqueue(data))
                {
                    control.Update(TimeSpan.FromMilliseconds(100));
                }
                if (control.TryDequeue(output))
                {
                    return(true);
                }
            }
            return(false);
        }