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数据包丢弃,同时存储对象的主要内容,如果未能解决你的问题,请参考以下文章