存储对象时 C# 多播 UDP 数据包丢失
C# Multicast UDP Packet Drops while storing objects
我目前正在订阅多播 UDP。它在一个最大 1000 字节的数据包中流式传输多条消息,每条消息大约 80 字节。当数据包进来时,我将它们解析为对象,然后将它们存储在字典中。
我收到的每个数据包都带有一个序列号,这样我就知道我是否丢失了任何数据包。
收到大约 10k 个数据包后,我开始到处丢弃数据包。
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 是一个 class,包含大约 15 个整数、10 个小数和 5 个字符串(每个 <10 个字符)。
是否有更快的方式来实时存储这些对象,以跟上快速的 UDP 提要?我试过使 securityDefinition 成为一个结构,我试过将数据存储在数据表中,我试过将 secDef 添加到列表和队列中。所有人都遇到同样的问题。
似乎唯一的瓶颈是将对象放入字典中。创建对象并检查字典以查看它是否已经存在似乎没问题。
编辑:
澄清一些事情 - 安全定义来自循环中的服务器。大约有 1,000,000 个定义。一旦它们全部被发送,它们就会被再次发送,一遍又一遍。当我的程序启动时,我需要初始化所有的定义。一旦我得到重复,我就知道我完成了并且可以关闭这个连接。但是,如果我收到一个序列号为 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);
}
我目前正在订阅多播 UDP。它在一个最大 1000 字节的数据包中流式传输多条消息,每条消息大约 80 字节。当数据包进来时,我将它们解析为对象,然后将它们存储在字典中。
我收到的每个数据包都带有一个序列号,这样我就知道我是否丢失了任何数据包。
收到大约 10k 个数据包后,我开始到处丢弃数据包。
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 是一个 class,包含大约 15 个整数、10 个小数和 5 个字符串(每个 <10 个字符)。
是否有更快的方式来实时存储这些对象,以跟上快速的 UDP 提要?我试过使 securityDefinition 成为一个结构,我试过将数据存储在数据表中,我试过将 secDef 添加到列表和队列中。所有人都遇到同样的问题。
似乎唯一的瓶颈是将对象放入字典中。创建对象并检查字典以查看它是否已经存在似乎没问题。
编辑: 澄清一些事情 - 安全定义来自循环中的服务器。大约有 1,000,000 个定义。一旦它们全部被发送,它们就会被再次发送,一遍又一遍。当我的程序启动时,我需要初始化所有的定义。一旦我得到重复,我就知道我完成了并且可以关闭这个连接。但是,如果我收到一个序列号为 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);
}