C#多播UDP数据包丢弃,同时存储对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#多播UDP数据包丢弃,同时存储对象相关的知识,希望对你有一定的参考价值。

我目前订阅播UDP。它流多条消息,每次约80字节,在一个单一的最多1000个字节的数据包。由于包进来,我分析他们为对象,然后将它们存储在一本字典。

我收到的每个数据包带有一个序列号,让我知道,如果我丢弃任何数据包。

后收到约10,000包,我开始到处丢弃数据包。

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饲料更快的方法?我试图做一个securityDefinition结构,我试图存储一个数据表中的数据,我曾尝试加入SECDEF到列表和队列。同样的问题与所有。

看来唯一的瓶颈是把对象字典中。创建对象和检查字典,看它是否已经存在,似乎罚款。

编辑:为了澄清一些东西 - 安全定义从一个循环的服务器进来了。大概有百万的定义。一旦他们都被发送,然后再发送一遍又一遍。当我的程序启动时,我需要初始化所有的定义。一旦我得到重演,我知道我做,可以关闭此连接。但是,如果我在序列号1接收数据包,并且下一个数据包的序列号3,我知道我已经丢弃的数据包2,并没有恢复它的方式。

答案
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);

以上是关于C#多播UDP数据包丢弃,同时存储对象的主要内容,如果未能解决你的问题,请参考以下文章

广播与多播

C# UDP 客户端读取多播 IP(本地接口),并将单播 UDP 发送到 ***

udp 隧道中的数据包丢弃和拆分

Erlang Udp 服务器丢弃大量数据包

Windows,UDP数据包静默丢弃

当多个listner实例正在运行时,多播中的数据包丢失