Beispiel #1
0
        /// <summary>
        /// 多数据段处理
        /// </summary>
        /// <param name="baizeSession">会话</param>
        /// <param name="sequence">数据</param>
        /// <returns></returns>
        private bool MultiSegmentHandler(BaizeSession baizeSession, ReadOnlySequence <byte> sequence)
        {
            bool rtn = false;
            int  size = this._filterInfo.BasePortocalFilterInfo.Size;
            BaizeBufferSegment tmpHead = null, tmpTail = null;
            int tmpHeadIndex = 0;
            int tmpTailIndex = 0;

            if (sequence.First.Length >= size)
            {
                ReadOnlySequence <byte> readOnly = new ReadOnlySequence <byte>(sequence.First.Slice(0, size));
                baizeSession.Data = readOnly;
            }
            else
            {
                int length = 0;
                foreach (var memory in sequence)
                {
                    if (tmpHead == null)
                    {
                        tmpHead = tmpTail = new BaizeBufferSegment();
                        tmpTail.SetUnownedMemory(memory);
                    }
                    else
                    {
                        BaizeBufferSegment next = new BaizeBufferSegment();
                        next.SetUnownedMemory(memory);
                        tmpTail.SetNext(next);
                        tmpTail = next;
                    }
                    if (length + memory.Length >= size)
                    {
                        tmpTailIndex = size - length;
                        rtn          = true;
                        break;
                    }
                    length += memory.Length;
                }
                if (rtn)
                {
                    ReadOnlySequence <byte> readOnly = new ReadOnlySequence <byte>(tmpHead, tmpHeadIndex, tmpTail, tmpTailIndex);
                    baizeSession.Data = readOnly;
                }
                else
                {
                    if (tmpHead != null)
                    {
                        tmpHead.ResetMemory();
                        tmpHead = null;
                    }
                }
            }
            return(rtn);
        }
Beispiel #2
0
        /// <summary>
        /// 获得多段的包的长度
        /// </summary>
        /// <param name="sequence"></param>
        /// <returns></returns>
        private int GetMultiSegmentPacketLength(ReadOnlySequence <byte> sequence)
        {
            int rtn = 0;
            int length = 0;
            BaizeBufferSegment tmpHead = null, tmpTail = null;
            int  tmpHeadIndex = 0;
            int  tmpTailIndex = 0;
            bool complete     = false;

            foreach (var memory in sequence)
            {
                if (tmpHead == null)
                {
                    tmpHead = tmpTail = new BaizeBufferSegment();
                    tmpTail.SetUnownedMemory(memory);
                }
                else
                {
                    BaizeBufferSegment next = new BaizeBufferSegment();
                    next.SetUnownedMemory(memory);
                    tmpTail.SetNext(next);
                    tmpTail = next;
                }
                if (length + memory.Length >= this._filterInfo.BasePortocalFilterInfo.Size)
                {
                    tmpTailIndex = this._filterInfo.BasePortocalFilterInfo.Size - length;
                    complete     = true;
                    break;
                }
                length += memory.Length;
            }
            if (complete)
            {
                ReadOnlySequence <byte> readOnly = new ReadOnlySequence <byte>(tmpHead, tmpHeadIndex, tmpTail, tmpTailIndex);
                if (readOnly.First.Length <= this._filterInfo.BasePortocalFilterInfo.Size)
                {
                    rtn = GetMultSegmentPacketLength(readOnly);
                }
                else
                {
                    rtn = GetPacketLength(readOnly);
                }
            }
            else
            {
                if (tmpHead != null)
                {
                    tmpHead.ResetMemory();
                    tmpHead = null;
                }
            }
            return(rtn);
        }
        /// <summary>
        /// 多数据段处理
        /// </summary>
        /// <param name="baizeSession">会话</param>
        /// <param name="sequence">数据</param>
        /// <returns></returns>
        private bool MultiSegmentHandler(BaizeSession baizeSession, ReadOnlySequence <byte> sequence)
        {
            bool rtn = false;
            BaizeBufferSegment tmpHead = null, tmpTail = null;
            int tmpHeadIndex = 0;
            int tmpTailIndex = 0;

            foreach (var memory in sequence)
            {
                if (tmpHead == null)
                {
                    tmpHead = tmpTail = new BaizeBufferSegment();
                    tmpTail.SetUnownedMemory(memory);
                }
                else
                {
                    BaizeBufferSegment next = new BaizeBufferSegment();
                    next.SetUnownedMemory(memory);
                    tmpTail.SetNext(next);
                    tmpTail = next;
                }
                int terminatorIndex = memory.Span.IndexOf(_terminatorMark.Span);
                if (terminatorIndex != -1)
                {
                    tmpTailIndex = terminatorIndex;
                    rtn          = true;
                    break;
                }
            }
            if (rtn)
            {
                ReadOnlySequence <byte> readOnly = new ReadOnlySequence <byte>(tmpHead, tmpHeadIndex, tmpTail, tmpTailIndex + _terminatorMark.Length);
                baizeSession.Data = readOnly;
            }
            else
            {
                if (tmpHead != null)
                {
                    tmpHead.ResetMemory();
                    tmpHead = null;
                }
            }
            return(rtn);
        }
Beispiel #4
0
 /// <summary>
 /// 填充数据
 /// </summary>
 /// <param name="data">填充数据</param>
 public void FillData(ReadOnlySequence <byte> data)
 {
     _bufferDataCount += data.Length;
     foreach (var memory in data)
     {
         if (_head == null)
         {
             _head = _tail = new BaizeBufferSegment();
             _tail.SetUnownedMemory(memory);
         }
         else
         {
             BaizeBufferSegment next = new BaizeBufferSegment();
             next.SetUnownedMemory(memory);
             _tail.SetNext(next);
             _tail = next;
         }
     }
 }
Beispiel #5
0
        /// <summary>
        /// 多数据段处理
        /// </summary>
        /// <param name="baizeSession">会话</param>
        /// <param name="sequence">数据</param>
        /// <returns></returns>
        private bool MultiSegmentHandler(BaizeSession baizeSession, ReadOnlySequence <byte> sequence)
        {
            bool rtn = false;
            BaizeBufferSegment tmpHead = null, tmpTail = null;
            int  tmpHeadIndex   = 0;
            int  tmpTailIndex   = 0;
            bool foundBeginMark = false;

            foreach (var memory in sequence)
            {
                bool addSegment = false;
                if (!foundBeginMark)
                {
                    int beginIndex = memory.Span.IndexOf(_beginMark.Span);
                    if (beginIndex != -1)
                    {
                        foundBeginMark = true;
                        tmpHeadIndex   = beginIndex;
                        tmpHead        = tmpTail = new BaizeBufferSegment();
                        tmpTail.SetUnownedMemory(memory);
                        addSegment = true;
                    }
                }
                if (foundBeginMark && !addSegment)
                {
                    BaizeBufferSegment next = new BaizeBufferSegment();
                    next.SetUnownedMemory(memory);
                    tmpTail.SetNext(next);
                    tmpTail = next;
                }
                int endIndex = -1;
                if (addSegment)
                {
                    endIndex = memory.Span.Slice(tmpHeadIndex + _beginMark.Length).IndexOf(_endMark.Span);
                    if (endIndex != -1)
                    {
                        endIndex    += _beginMark.Length + tmpHeadIndex;
                        tmpTailIndex = endIndex;
                        rtn          = true;
                        break;
                    }
                }
                else
                {
                    endIndex = memory.Span.IndexOf(_endMark.Span);
                    if (endIndex != -1)
                    {
                        tmpTailIndex = endIndex;
                        rtn          = true;
                        break;
                    }
                }
            }
            if (rtn)
            {
                ReadOnlySequence <byte> readOnly = new ReadOnlySequence <byte>(tmpHead, tmpHeadIndex, tmpTail, tmpTailIndex + _endMark.Length);
                baizeSession.Data = readOnly;
            }
            else
            {
                if (tmpHead != null)
                {
                    tmpHead.ResetMemory();
                    tmpHead = null;
                }
            }
            return(rtn);
        }