C#

时间:2017-09-26 11:27:20

标签: c# sockets network-programming udp

我创建了一个UDP客户端,用于在C#中从主机接收信息。 我在while循环中使用Receive()方法从服务器获取数据。但我的时机存在一些问题。

从服务器发送数据包的速率大约是10ms,每当数据包计数达到32(= 320 ms)时,我就会发生SubFrameReady事件。 问题是这个事件每1毫秒提高!!由于UDP处于while循环中,UDP会一遍又一遍地接收相同的数据包吗? 这是代码:

private void threadFunction()
    {
        byte[] rcvBuff;
        int start = XDef.HEADER_LENGTH;
        int end = _imgWidth * _bytesPerPixel + XDef.HEADER_LENGTH;

        startFrameData();
        while (true)
        {
            rcvBuff = imgListener.Receive(ref localEp);
            for (int i = 0; i < 8; i++)
            {
                imgHeader[i] = rcvBuff[i];
            }
            for (int i = start; i < end; i += 2)
            {
                _rawLineData[byteCounter] = rcvBuff[i] + rcvBuff[i + 1] * 256;
                _lineData[byteCounter] = (byte)(_rawLineData[byteCounter] * 255 / 65535);
                byteCounter++;
            }
            lineCounter++;
            // Thread.Sleep(5);
            if (lineCounter % _subFrameHeight == 0)
            {
                byteCounter = 0;
                if (SubFrameReady != null)
                    SubFrameReady.Invoke(this, null);
                if (lineCounter % _imgHeight == 0)
                {
                    if (FrameReady != null)
                        FrameReady.Invoke(this, null);
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

其实我得到了答案。 时机非常好。问题是我在尝试分析时间时调试应用程序,并设置了断点。 我认为UDP Client类中的缓冲区会在应用程序暂停时保存即将到来的数据,然后尽快加载带有该数据的Receive()方法,这就是我获得1ms时间范围的原因。

非常棘手!