private async Task ProcessHeader(NetworkStream stream) { byte[] buffer = new byte[MessageHeader.HeaderSize]; await stream.ReadAsync(buffer, 0, buffer.Length); using (var memoryStream = new MemoryStream(buffer)) { this.Header = MessageUtils.DeserializeMessageHeader(memoryStream); } this.payloadData = new byte[this.Header.Value.Size]; // We're either done or processing the message depending on if the message has this.State = this.Header.Value.Size > 0 ? MessageReaderState.ProcessingMessage : MessageReaderState.MessageReady; }
private async Task ProcessPayload(NetworkStream stream) { do { int bytesRemaining = this.Header.Value.Size - this.bytesRead; int bytesReceived = await stream.ReadAsync(this.payloadData, this.bytesRead, bytesRemaining); if (bytesReceived == bytesRemaining) { // We've read the entire message, we're done! Move on to the next message. this.State = MessageReaderState.MessageReady; return; } bytesRead += bytesReceived; }while (stream.DataAvailable); }
/// <summary> /// Tell the <see cref="MessageReader" /> that it can process the next message. /// </summary> public void ProcessNextMessage() { this.State = MessageReaderState.ProcessingHeader; }