Beispiel #1
0
        private void OnRcvPipelineRead()
        {
            ReadDgramResult readDgramResult = RcvPipeReader.Read();

            if (readDgramResult.IsEmpty)
            {
                return;
            }

            int      count          = 0;
            bool     isReadComplete = false;
            ASegment head           = readDgramResult.Head;
            ASegment tail           = readDgramResult.Tail;
            ASegment segment        = head;

            try
            {
                while (!isReadComplete)
                {
                    this.RcvAddress = (EndPoint)segment.Token;
                    var memory = segment.GetReadableMemory();

                    var reader = new WrappedReader(new ReadOnlySequence <byte>(memory), this.Order, this.readerFlushCallback);
                    this.filterPipeline.OnTransportRead(this, ref reader);
                    reader.Flush();

                    count++;
                    if (segment == tail)
                    {
                        isReadComplete = true;
                    }
                    else
                    {
                        segment = segment.ChildSegment;
                    }
                }

                this.RcvPipeReader.ReaderAdvance(count);
                this.RcvPipeReader.ReceiveAsync();
            }
            catch (Exception e)
            {
                this.DeliverException(e);

                this.RcvPipeReader.Complete();
            }
        }