This question is very simple. Read the documentation about NetworkStream Read and I quote:
Returns Int32 The number of bytes read from the NetworkStream, or 0 if the socket is closed.
And later
IOException The underlying Socket is closed.
Which is true? Clearly both can not be true at the same time, there must be a difference. (It seems that the former is true)