Трудно ответить, не видя обоих концов канала (но, в частности, отправляющий конец). DataAvailable
действительно только указывает состояние локального буфера (но не самого потока); с точки зрения определения конца потока он в значительной степени бесполезен (т сообщает о чем-то не связанном).
I ожидаю это ошибка в передающем коде. Классическая ошибка здесь следующая:
var buffer = memoryStream.GetBuffer();
networkStream.Write(buffer, 0, buffer.Length);
Когда это должно быть:
var buffer = memoryStream.GetBuffer();
networkStream.Write(buffer, 0,
(int)memoryStream.Length);
Первая (и неверная) версия отправляет мусорную часть резервного буфера потока памяти.