Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何限制排队的UDP数据包数量_C#_Sockets_Udp - Fatal编程技术网

C# 如何限制排队的UDP数据包数量

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

我有一个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数据包排队,如果是这样,我如何检查操作系统将多少数据包排队?

@itsme86在这种情况下不能使用TCP。我必须使用UDP,因此我需要了解ConcurrentQueue或操作系统在读取或处理UDP数据包速度不够快的情况下是如何存储这些数据包的。“然后再次启动程序,在不再次执行php脚本的情况下,新数据不断添加到datagridview中”--这证明了PHP脚本先前发送的UDP数据报在到达程序之前已被缓冲。这使您的问题从根本上说不是一个编程问题,而是一个网络配置和管理问题。我对这种行为感到有点惊讶,因为通常大量的UDP数据报会导致一堆数据被丢弃,而不是它们被缓冲一段时间。。。。。。(例如,足够长的时间来关闭程序并重新启动)。但是,网络规范中没有禁止此类行为的内容。请注意,如果数据报在到达程序之前被缓冲,那么代码的吞吐量可能没有被测试。这取决于缓冲发生的原因。如果您的代码是瓶颈,那么您接收数据报的速度就不够快。但也可能是配送路线中的其他环节无法跟上。