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