存储对象时C#组播UDP数据包丢弃

时间:2019-02-09 17:22:26

标签: c# udp multicast

我当前正在订阅多播UDP。它在单个最大1000字节的数据包中流式传输多个消息,每个消息约80个字节。当数据包进入时,我将其解析为对象,然后将其存储在字典中。

我收到的每个数据包都有一个序号,这样我就知道是否丢弃了任何数据包。

大约收到1万个数据包后,我开始在各处丢包。

securityDefinition xyz = new securityDefinition(p1,p2,p3,p4,p5...etc);
if (!secDefs.ContainsKey(securityID))
{
    secDefs.Add(securityID, xyz); //THIS WILL CAUSE DROPS EVENTUALLY
    secDefs.Add(securityID, null); //THIS WORKS JUST FINE
}
else
{
    //A repeat definition is received and assuming all 
    //sequence numbers in the packet line up sequentially, I know i am done

    //However if there is a drop somewhere (gap in sequence number),
    //I know I am missing something
}

securityDefinition是一个包含大约15个整数,10个小数和5个字符串(每个<10个字符)的类。

是否有一种更快的实时存储这些对象的方法,可以跟上快速UDP feed的步伐?我尝试将securityDefinition构造为结构,尝试将数据存储在数据表中,尝试将secDef添加到列表和队列中。所有人都遇到同样的问题。

似乎唯一的瓶颈是将对象放入字典中。创建对象并检查字典以查看它是否已经存在。

编辑: 为了澄清一些事情-安全性定义来自服务器的循环。大约有1,000,000个定义。一旦全部发送完毕,便会反复发送它们。当我的程序启动时,我需要初始化所有定义。一旦重复,我就知道我已经完成了,可以关闭此连接。但是,如果我收到序列号为1的数据包,而下一个数据包为序列号3,则我知道我丢弃了数据包2,无法恢复它。

1 个答案:

答案 0 :(得分:0)

ConcurrentQueue<byte[]> pkts = new ConcurrentQueue<byte[]>();


//IN THE RECEIVER THREAD...
void ProductDefinitionReceiver()
{
    while (!secDefsComplete)
    {
        byte[] data = new byte[1000];
        s.Receive(data);
        pkts.Enqueue(data);
    }
}

//IN A SEPARATE THREAD:
public void processPacketQueue()
{
    int dumped = 0;
    byte[] pkt;
    while (!secDefsComplete)
    {
        while (pkts.TryDequeue(out pkt))
        {
            if (!secDefsComplete)
            {
                //processPkt includes the parsing and inserting the secDef object into the dictionary.
                processPkt(pkt);
            }
            else
            {
                dumped++;
            }
        }
    }

    Console.WriteLine("Dumped: " + dumped);
}