使用MemoryStream(或其他)作为TCP通信的循环缓冲区

时间:2018-07-27 12:13:39

标签: c# stream circular-buffer

我正在简化/优化我之前编写的一些代码。我创建了一个自定义的循环缓冲区类,以达到其目的,但我希望将其替换为对所有使用代码而言更标准的东西。

要求是(以及我的CircularBuffer领导所做的):

  1. 窥视(读取而无需永久消耗)的能力多于一个字节。这是必需的,因为网络消息的前缀为两个字节,并且我宁愿不缓冲缓冲区。
  2. 一旦达到最大长度(圆形),便从头开始写
  3. 能够在溢出时引发异常(覆盖未使用的数据)

最好同时具有读写功能,这是我从来没有想过要在循环缓冲区中弄清楚的。

我着眼于MemoryStream,但是从文档中我无法确定它是否满足#2和#3。

那么,是否有任何流可以支持/可以(修改后)支持我的需求,还是我坚持创建自己的自定义循环缓冲区?

1 个答案:

答案 0 :(得分:0)

我认为现成的内存缓冲区不支持#2#3。 也许Queue可能是环形缓冲区的基础。

这是一个FIFO结构,总是在处添加新内容,并从头开始读取。要使它成为具有特定大小的环形缓冲区,如果Queue.Count()超出指定值,则可能引发异常。

这可能具有一个优点,那就是您根本不需要最大大小,队列将随着可用数据而增长和收缩。

可以通过LINQ var nThElement = Queue.ElementAt(...);进行随机访问,尽管如果进行大量操作可能会增加性能。

但是对于如此具体的事情,我个人将使用您已经拥有的自定义实现。