处理有序的网络数据包

时间:2012-02-23 08:29:52

标签: c# networking dictionary buffer packets

我有一个应用程序将从udp连接读取有序数据包。这些消息需要以某种形式的缓冲区存储,其序列号用于查找。

这个'缓冲区'由另一个删除消息并处理它的线程提供服务。如果错过了序列号,我已停止服务线程,然后在另一个TCP连接上重新请求该消息。一旦它到达,我想将它重新放回缓冲区,服务线程可以继续。

所以我需要:按键插入,按最低键删除。密钥将是一个数字递增的数字,例如1,2,3,4,因此它可以更容易跟踪最高数字,因为密钥可以递增/递减,从而无需对数据结构进行排序。

My one plan is to use a Dictionary as the buffer, which makes for a simple solution

My other solution uses a set up two queues

Suggestion by zmbg to use SortedList - I am concerned about performance, as hashing would provide faster lookup and insert not?

我的问题是:

  • 基本上我是在寻找使用此解决方案的字典的内存或性能方面的陷阱。运行它的机器没有太多内存,但吞吐量性能略高一些。
  • 如果此应用程序全天运行,使用字典时是否会出现与内存相关的问题?
  • 是否有人对此过程的此实现或替代实现有任何想法。我必须决定一个设计,但我不能测试不同的性能解决方案,因为我没有足够的时间,所以我想我在开始之前尝试理论上收集想法和实施想法的优点

2 个答案:

答案 0 :(得分:1)

我认为字典不在这里,不是因为内存问题,而是因为它没有多大意义。我会使用一个排序列表,它可以很容易地删除第一个元素,并且在中间添加元素也很容易。

字典没有“第一”的概念。

内存消耗量或多或少相同(数据将占用大部分内存,而不是字典或列表的开销),列表的性能会更好。

您对数据结构的操作是:在缓冲区末尾添加数据包,从缓冲区的开头删除缓冲区,如果丢失数据包,停止所有操作,请求重新传输,然后添加它 - 可能是缓冲区的开头(因为这就是你意识到数据包丢失的原因)。

.NET列表实际上是通过数组实现的,这不是最佳选择,但您可以使用LinkedList - 这非常适合您的需求。

答案 1 :(得分:0)

我最终决定用支持它的词典来实现我自己的队列。

Dictionary提供了我正在寻找的插入和删除性能,过早地考虑过小的性能问题并不会让我无处可去。

只跟踪最低数字是好的,我不会进一步详细说明。