У вас есть определенный clientData = new byte[1024 * 5000];
- и вы тогда не используете receivedBytesLen
. Я не могу вспомнить, будет ли эта перегрузка Receive
читать столько, сколько она может до EOF , или просто "некоторые или EOF" (последнее - поведение Stream.Read
), но вы необходимо проверить и использовать receivedBytesLen
.
IMO, подход с фиксированным буфером по своей сути несовершенен, поскольку он также не справляется с слишком большими входами. Лично я бы использовал NetworkStream
здесь; тогда весь ваш код становится:
using(var fz = File.Create(path)) {
networkStream.CopyTo(fz);
}
Другим распространенным подходом здесь является отправка ожидаемого размера в качестве префикса к данным; Таким образом, вы можете проверить, что у вас есть необходимые данные. Лично я не использовал бы эту информацию для создания буфера правильного размера в памяти, хотя это все еще не разрешает файлы эпического размера (однако Stream
делает).