Exemple #1
0
        /// <summary>
        /// Find the begging of the message payload. Possible header before start delimiter will be removed from the message
        /// </summary>
        /// <param name="readBytes">Number of bytes read from the stream</param>
        /// <param name="context">Read context</param>
        /// <returns>True if start was found, otherwise false</returns>
        private bool FindStart(int readBytes, DelimitedMessageContext context)
        {
            if (StartDelimiter.Length == 0)
            {
                return(true);
            }

            var searchStart = context.CurrentIndex > StartDelimiter.Length ? context.CurrentIndex - StartDelimiter.Length : 0;
            var searchEnd   = (context.CurrentIndex + readBytes) - StartDelimiter.Length;

            // Skip non protocol related boiler plate at message start
            for (var index = searchStart; index <= searchEnd; index++)
            {
                var segment = new ArraySegment <byte>(context.ReadBuffer, index, StartDelimiter.Length);
                if (!StartDelimiter.SequenceEqual(segment))
                {
                    continue;
                }

                context.MessageStart = index;
                return(true);
            }

            return(false);
        }
Exemple #2
0
        /// <summary>
        /// Move message overlap to front of read buffer and reset the context
        /// </summary>
        /// <param name="readBytes">Number of bytes read from the stream. Used to calculate overlap</param>
        /// <param name="context">Message context</param>
        /// <returns>Overlap bytes - used for recursive stream processing</returns>
        private static int ResetContext(int readBytes, DelimitedMessageContext context)
        {
            // Move shit to front of buffer if we have overlap
            //                  Entire read buffer                   Full first message
            var overlap = (readBytes + context.CurrentIndex) - (context.MessageEnd + 1);

            if (overlap > 0)
            {
                Buffer.BlockCopy(context.ReadBuffer, context.MessageEnd + 1, context.ReadBuffer, 0, overlap);
            }

            // Reset message
            context.StartFound   = false;
            context.MessageStart = 0;
            context.CurrentIndex = 0;

            return(overlap);
        }