.NET阻塞套接字读取直到X字节可用?

And*_*bel 3 .net c# sockets networkstream

假设我在TCP上实现了简单的协议,其中每条消息由以下内容组成:

  1. 一个int指示数据长度.
  2. 二进制数据,长度为1.

阅读这样的消息,我想要像:

int length = input.ReadInt();
byte[] data = input.ReadBytes(length);
Run Code Online (Sandbox Code Playgroud)

使用Socket.ReceiveNetworkStream.Read读取可用的字节数.我希望调用ReadBytes阻塞,直到length字节可用.

是否有一种简单的方法可以执行此操作,而无需循环读取,在等待剩余数据的偏移处重新启动?

在一个真正的应用程序中,读取应该可以在异步或后台线程上完成,但我暂时忽略了它.重要的是能够在所有数据都可用之前读取不完整.

编辑

我知道我可以自己缓冲数据,我知道如何做到这一点.它只是一个循环Receive,在下一个偏移处继续.我要求的是,如果有一个可重用的实现这样的循环,而不需要任何类型的自有循环(或者可重用的Async实现,当所有数据都可用时完成).

Jon*_*eet 5

某事,某处必须循环.毕竟,可能需要多个套接字读取.

我相信这BinaryReader.Read将继续循环,直到你读取或读到流的末尾,但是如果你到达流的末尾你想要抛出异常,我会写个人写的一个单独的方法.毕竟,在一个地方实施并重复使用很容易.