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