Предположим, у меня есть простой протокол, реализованный через TCP, где каждое сообщение состоит из:
int
указывает длину данных.- Двоичные данные, длина которых указана в 1.
Читая такое сообщение, я хотел бы что-то вроде:
int length = input.ReadInt();
byte[] data = input.ReadBytes(length);
С помощью Socket.Receive
или NetworkStream.Read
считывается доступное количество байтов. Я хочу, чтобы вызов ReadBytes
блокировался до тех пор, пока не будет доступно length
байт.
Есть ли простой способ сделать это без необходимости зацикливания чтения, перезапуска со смещением в ожидании оставшихся данных?
В реальном приложении чтение, вероятно, должно выполняться асинхронно или в фоновом потоке, но я пока проигнорировал это. Важно иметь возможность не завершать чтение до тех пор, пока не будут доступны все данные.
Редактировать
Я знаю, что могу сам буферизовать данные, и знаю, как это сделать. Это просто цикл вокруг Receive
, который продолжается на следующем смещении. Я спрашиваю, есть ли повторно используемая реализация такого цикла без необходимости в собственном цикле любого типа (или, альтернативно, повторно используемая реализация Async, которая завершается, когда все данные доступны).