Exemple #1
0
        /// <summary> Handles a stream based on its header/size. Determines if it should be buffered if out-of-order,
        /// acked and released if size is equal to header size (ack only), or delivered immediately. </summary>
        internal void RouteIncomingStream(NetStream strm)
        {
            var header  = NetHeader.FromStream(strm);
            int seqDist = NetMath.SeqDistance(header.ObjSequence, LastAcceptedRemoteSequence);

            // If the stream is only the size of a header, it's likely a forced ack:
            if (strm.Length <= 120)
            {
                AckDelivered(header);
                strm.Release();
            }
            else if (!RemoteSequenceValid(seqDist))
            {
                strm.Release();
            }
            else if (seqDist != 1)
            {
                BufferOutOfOrder(seqDist, strm, header);
            }
            else
            {
                AckReceived(header);
                AckDelivered(header);
                DeliverStream(strm);
            }
        }