C# 如何限制排队的UDP数据包数量
我有一个php脚本,它每秒向我的服务器发送一个UDP数据包 还有一个C#程序,它侦听UDP数据包,然后使用datagridview显示它们。 为了做到这一点,我产生了两个线程,一个一直监听,另一个处理数据。他们使用ConcurrentQueue、listen方法将数据排入队列,处理器方法将其出列并在datagridview上显示解析后的数据C# 如何限制排队的UDP数据包数量,c#,sockets,udp,C#,Sockets,Udp,我有一个php脚本,它每秒向我的服务器发送一个UDP数据包 还有一个C#程序,它侦听UDP数据包,然后使用datagridview显示它们。 为了做到这一点,我产生了两个线程,一个一直监听,另一个处理数据。他们使用ConcurrentQueue、listen方法将数据排入队列,处理器方法将其出列并在datagridview上显示解析后的数据 private void btnStart_Click(object sender, EventArgs e) { thre
private void btnStart_Click(object sender, EventArgs e)
{
threadUdp = new Thread(Listener);
threadUdp.Start();
threadProcessor = new Thread(startPacketProcessor);
threadProcessor.Start();
this.btnStart.Enabled = false;
}
void Listener()
{
while (true)
{
receivedBytes = listener.Receive(ref sender);
Packet packetData = new Packet(sender, receiver, receivedBytes);
_queue.Enqueue(packetData);
}
}
private void startPacketProcessor()
{
int i = 0;
Packet packet;
while (true)
{
var ok = _queue.TryDequeue(out packet);
if (ok)
{
string data = GetHexStringFrom(packet.ReceivedBytes);
string[] row = new string[] { System.DateTime.Now.ToString(), packet.FIP, packet.FPort, packet.TIP, packet.TPort, data, "", i++.ToString() };
this.dataGridViewPackets.Invoke((MethodInvoker)delegate { this.dataGridViewPackets.Rows.Add(row); });
if (this.dataGridViewPackets.RowCount >= 100)
{
this.dataGridViewPackets.Invoke((MethodInvoker)delegate { this.dataGridViewPackets.Rows.RemoveAt(0); });
}
}
}
}
我注意到,在php脚本停止执行很久之后,这个程序一直在向datagridview添加数据包,即使我停止c#调试,然后再次启动程序,新数据也会一直添加到datagridview,而不会再次执行php脚本
我担心这会导致某个地方的内存泄漏,我不知道为什么会发生这种情况。。。
是不是我读取数据的速度比我处理数据的速度快,而且即使在我停止调试器之后,ConcurrentQueue也会存储数据?如果是,在丢失信息之前,我如何限制ConcurrentQueue可以存储的对象数量?如果我不限制它,如果有足够的数据包排队,它会导致内存泄漏吗?
或者可能是操作系统将UDP数据包排队,如果是这样,我如何检查操作系统将多少数据包排队?@itsme86在这种情况下不能使用TCP。我必须使用UDP,因此我需要了解ConcurrentQueue或操作系统在读取或处理UDP数据包速度不够快的情况下是如何存储这些数据包的。“然后再次启动程序,在不再次执行php脚本的情况下,新数据不断添加到datagridview中”--这证明了PHP脚本先前发送的UDP数据报在到达程序之前已被缓冲。这使您的问题从根本上说不是一个编程问题,而是一个网络配置和管理问题。我对这种行为感到有点惊讶,因为通常大量的UDP数据报会导致一堆数据被丢弃,而不是它们被缓冲一段时间。。。。。。(例如,足够长的时间来关闭程序并重新启动)。但是,网络规范中没有禁止此类行为的内容。请注意,如果数据报在到达程序之前被缓冲,那么代码的吞吐量可能没有被测试。这取决于缓冲发生的原因。如果您的代码是瓶颈,那么您接收数据报的速度就不够快。但也可能是配送路线中的其他环节无法跟上。