17

I have the following code to read data from a Stream (in this case, from a named pipe) and into a byte array:

// NPSS is an instance of NamedPipeServerStream

int BytesRead;
byte[] StreamBuffer = new byte[BUFFER_SIZE]; // size defined elsewhere (less than total possible message size, though)
MemoryStream MessageStream = new MemoryStream();

do
{
    BytesRead = NPSS.Read(StreamBuffer, 0, StreamBuffer.Length);
    MessageStream.Write(StreamBuffer, 0, BytesRead);
} while (!NPSS.IsMessageComplete);

byte[] Message = MessageStream.ToArray(); // final data

Could you please take a look and let me know if it can be done more efficiently or neatly? Seems a bit messy as it is, using a MemoryStream. Thanks!

3 Answers 3

23

Shamelessly copied from Jon Skeet's article.

public static byte[] ReadFully (Stream stream)
{
   byte[] buffer = new byte[32768];
   using (MemoryStream ms = new MemoryStream())
   {
       while (true)
       {
           int read = stream.Read (buffer, 0, buffer.Length);
           if (read <= 0)
               return ms.ToArray();
           ms.Write (buffer, 0, read);
       }
   }
}
Sign up to request clarification or add additional context in comments.

2 Comments

This reads to the end of the stream, but the intent is to only read until IsMessageComplete.
Thanks for the link to the article; it looks like I'm doing pretty much the same algorithm but with a different terminating condition on the loop.
3
int read = stream.Read (buffer, 0, buffer.Length);

This line will block forever if there is no data Available. Read is a blocking function and it will block the thread until it reads at least one byte but if there is no data then it will block forever.

3 Comments

@derek-beattie how can I produce this issues?
@IvandroIsmael abhinaw answered this one
Ohw, I'm sorry mate Derek-Beattie. /cc @abhinaw
1

It looks like your current solution is pretty good. You may consider wrapping it up into an extension method if you'd like the code to look cleaner.

1 Comment

Interesting, I'd never heard of extension methods prior to your post. Thanks for the tip and for looking at my code

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.