如何限制正在排队的UDP数据包的数量

时间:2017-06-20 22:15:03

标签: c# sockets udp

我有一个php脚本,每秒都会向我的服务器发送一个UDP数据包。

一个C#程序,它监听UDP数据包,然后使用datagridview显示它们。 为此,我生成了两个线程,一个是一直监听,另一个是处理数据。他们使用ConcurrentQueue,listen方法将数据排入队列,处理器方法将其出列,并在datagridview上显示它。

    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数据包进行排队,如果是,我该如何检查操作系统排队的数据包数量?

0 个答案:

没有答案