A useful convenience introduced in .NET 4 is Stream.CopyTo(Stream[, Int32]) which reads the content from the current stream and writes it to another stream.
In .NET 4.5.1, it uses a fixed buffer size of 81920 bytes. (Earlier versions of .NET used a fixed buffer size of 4096 bytes, and it will no doubt continue to change over time.) There is also an overload where you can pass your own buffer size.
The implementation is very similar to yours, modulo some shuffling around and some error checking. Reflector renders the heart of it as follows:
private void InternalCopyTo(Stream destination, int bufferSize)
{
int num;
byte[] buffer = new byte[bufferSize];
while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
{
destination.Write(buffer, 0, num);
}
}
(You can now see the actual source at http://referencesource.microsoft.com/#mscorlib/system/io/stream.cs#98ac7cf3acb04bb1.)
The error checking is basically around whether input.CanRead and output.CanWrite are both true, or either is disposed. So in answer to Benny's question this should be perfectly happy copying from a NetworkStream (or to a writable NetworkStream).