Soquete de bloqueio .NET lido até que X bytes estejam disponívei

Suponha que eu tenha um protocolo simples implementado sobre TCP, onde cada mensagem é composta de:

Aint indicando o comprimento dos dados. Dados binários, com o comprimento especificado em 1.

Lendo essa mensagem, eu gostaria de algo como:

int length = input.ReadInt();
byte[] data = input.ReadBytes(length);

UsingSocket.Receive ouNetworkStream.Read o número disponível de bytes é lido. Quero a ligação paraReadBytes para bloquear atélength bytes estão disponívei

Existe uma maneira simples de fazer isso, sem ter que repetir a leitura, reiniciando em um deslocamento aguardando os dados restante

Em um aplicativo real, a leitura provavelmente deve ser feita de forma assíncrona ou em um encadeamento em segundo plano, mas eu o ignorei por enquanto. O importante é não poder concluir a leitura até que todos os dados estejam disponívei

Edita

Eu sei que posso armazenar em buffer os dados e sei como fazê-lo. É apenas uma volta em torno deReceive que continua no próximo deslocamento. O que estou pedindo é se existe uma implementação reutilizável desse loop, sem a necessidade de um loop próprio de qualquer tipo (ou, alternativamente, de uma implementação assíncrona reutilizável que termina quando todos os dados estão disponíveis

questionAnswers(6)

yourAnswerToTheQuestion