如何处理快速传入的网络包?

时间:2015-06-18 05:33:45

标签: c#

在我的应用程序上,我收到UDP包,我需要分析它们。 当package1进入我的机器时 - 我必须锁定一些范围并在分析package2之前进行分析。

网络总是得到包,有一种可能的情况我在分析package1 ...网络层得到了package2和package3,他们正在等待分析。

我可以将任何包添加到concurrentQueue - 但我担心添加到此队列是使用锁定,而队列被锁定,并且两个package2和package3被接收并且正在等待...并且锁定是释放..然后有可能的情况是package3将在package2之前添加...然后package3将在package2之前进行分析,这是一个bug。

有人有其他解决方案吗?

1 个答案:

答案 0 :(得分:1)

ConcurrentQueue是标准队列数据结构的无锁线程安全实现。这意味着从队列中添加/删除不会锁定它。

如果您致电Enqueue,它会将项目添加到队列以确保。 (此方法没有返回值,也没有任何抛出异常)。

这意味着ConcurrentQueue项中的项将与调用Enqueue方法的顺序相同。

示例,如何实施Enqueue:

public void Enqueue(T item) {
    int insertIndex = Interlocked.Increment(ref m_high);
    m_array[insertIndex] = item;
}

注意:如果同时使用不同的线程获得package1package2,则意味着在任何情况下程序的体系结构都会被破坏。如果package1package2是逻辑嵌套的,client如何同时发送它们。如果客户端以某种方式同时发送它们,则无法处理它。