C# 处理有序网络数据包

C# 处理有序网络数据包,c#,networking,dictionary,buffer,packets,C#,Networking,Dictionary,Buffer,Packets,我有一个应用程序,它将从udp连接读取序列数据包。这些消息需要存储在某种形式的缓冲区中,其序列号用于查找 此“缓冲区”由另一个线程提供服务,该线程删除并处理消息。如果序列号丢失,我将停止服务线程,然后在另一个TCP连接上重新请求消息。一旦它到达,我想把它放回缓冲区,服务线程就可以继续了 所以我需要:按键插入,按最低键删除。密钥将是一个数字递增的数字,如1,2,3,4,这样就更容易跟踪最高的数字,因为密钥可以递增/递减,从而避免了对数据结构排序的需要。 我的一个计划是使用字典作为缓冲区,这是一个简

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

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

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

我的一个计划是使用字典作为缓冲区,这是一个简单的解决方案

我的另一个解决方案使用设置两个队列

zmbg建议使用SortedList-我担心性能,因为散列将提供更快的查找和插入速度?

我的问题是:

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

    • 我认为字典不在这里,不是因为内存问题,而是因为它没有多大意义。我会用一个排序列表,很容易去除第一个元素,而且在中间添加元素也很容易。 字典没有“第一”的概念

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

      您对数据结构的操作是:在缓冲区的末尾添加一个数据包,从缓冲区的开头删除一个缓冲区,如果有丢失的数据包,停止所有操作,请求重新传输,然后将其添加到缓冲区的开头(因为这是您意识到数据包丢失的方式)


      NET列表实际上是通过一个数组实现的,这不是最好的选择,但是你可以使用LinkedList-这非常适合你的需要。

      我认为字典不适合这里,不是因为内存问题,而是因为它没有太多意义。我会用一个排序列表,很容易去除第一个元素,而且在中间添加元素也很容易。 字典没有“第一”的概念

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

      您对数据结构的操作是:在缓冲区的末尾添加一个数据包,从缓冲区的开头删除一个缓冲区,如果有丢失的数据包,停止所有操作,请求重新传输,然后将其添加到缓冲区的开头(因为这是您意识到数据包丢失的方式)


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

      我最终决定使用字典来实现自己的队列

      Dictionary提供了我正在寻找的插入和删除性能,过早地过多地考虑小的性能问题不会让我一事无成


      只跟踪最低的数字是可以的,我将不再深入讨论太多细节。

      我最终决定使用字典来实现自己的队列

      Dictionary提供了我正在寻找的插入和删除性能,过早地过多地考虑小的性能问题不会让我一事无成


      只记录最低的数字是可以的,我将不再详细说明。

      您真的有一个同时使用UDP和TCP的服务吗?听起来很奇怪。如果您需要所有数据包,并且需要它们按顺序排列,那么为什么不首先使用TCP?另外,您使用的是.Net 4.0吗?@svick我使用的是.Net 2.0,但是如果解决方案需要.Net 4.0,我可以考虑将所有代码的一致性升级到.Net 4.0。我不提供UDP/TCP设置,我正在连接到另一个服务。您希望队列中同时有多少数据包?您真的有一个同时使用UDP和TCP的服务吗?听起来很奇怪。如果您需要所有数据包,并且需要它们按顺序排列,那么为什么不首先使用TCP?另外,您使用的是.Net 4.0吗?@svick我使用的是.Net 2.0,但是如果解决方案需要.Net 4.0,我可以考虑将所有代码的一致性升级到.Net 4.0。我不提供UDP/TCP设置,我正在连接到另一个服务。您希望队列中同时有多少数据包?如果数据包大量丢失,为什么列表不够?这取决于您如何使用列表。如果您使用了类似于
      List.RemoveAt(0)
      的东西,那么对于大列表来说,它的性能很差。另一方面,实现循环缓冲区应该非常快。在任何情况下,性能可能都无关紧要,因为列表中不会包含很多项。将内容添加到列表中间可能效率低下,但实际上您不必这样做。我会在SortedLi上编辑post.Performance