Когда возвращаемая длина чтения меньше, чем запрашиваемая длина чтения, вы в конце. Вы также должны следить за длиной чтения в случае, если размер вашего потока не идеально соответствует размеру буфера, поэтому вам необходимо учитывать более короткую длину данных в вашем буфере.
do{
len = stream.ReadBlock(buffer, 0, buffer.Length);
/* ... */
}while(len == buffer.Length);
Вы также можете проверить флаг EndOfStream
потока в состоянии цикла. Я предпочитаю этот метод, так как вы не будете выполнять чтение длины '0' (редкое условие, но это может произойти).
do{
len = stream.ReadBlock(buffer, 0, buffer.Length);
/* ... */
}while(!stream.EndOfStream);