假设我通过 TCP 实现了简单的协议,其中每条消息由以下部分组成:
int
指示数据长度。- 二进制数据,长度在 1 中指定。
阅读这样的消息,我想要类似的内容:
int length = input.ReadInt();
byte[] data = input.ReadBytes(length);
使用Socket.Receive
或NetworkStream.Read
读取可用的字节数。我希望ReadBytes
阻止调用,直到length
字节可用。
有没有一种简单的方法可以做到这一点,而不必循环读取,在等待剩余数据的偏移处重新开始?
在实际应用程序中,读取可能应该在异步或后台线程上完成,但我暂时忽略了这一点。重要的是能够在所有数据可用之前不完成读取。
编辑
我知道我可以自己缓冲数据,而且我知道该怎么做。这只是一个循环Receive
,在下一个偏移处继续。我要问的是是否有这样的循环的可重用实现,而不需要任何类型的自己的循环(或者当所有数据可用时完成的可重用异步实现)。