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