如何克服UDP客户端中的延迟

时间:2019-11-30 22:42:18

标签: c++ winapi udp

我正在尝试编写UDP客户端应用程序,该应用程序从服务器接收一些控制数据包(长度为52-104字节),这些控制数据包碎片化为每个大小为1-4字节的数据报(为什么这不是一个大数据包,而是碎片化的)而是对我来说是个谜...)。

我创建了一个线程,在该线程中,我使用了来自MS的典型recvfrom示例。从小缓冲区接收的数据我附加到字符串以重新创建数据包(如果数据包太大,则将清除字符串)。

我的问题是延迟:
入站数据包已更改,但是在一分钟或更长时间内,缓冲区和字符串中的数据没有更改。我尝试使用循环缓冲区而不是字符串,但这对延迟没有影响。

那么,我在做什么错了,如何以正确的方式接收分段的UDP数据包?

我没有原始的发件人代码,因此我要附加我的发件人仿真器的一部分。如您所见,原始数据字符串(mSendString)被分段为四个字节的数据包并发送到网络。当发送方的数据字符串发生更改时,接收方的数据在可接受的时间内没有发生变化,而是在几分钟后发生了变化。

UdpClient mSendClient = new UdpClient();
string mSendString = "head,data,data,data,data,data,data,data,chksumm\n";//Control string
public static void SendCallback(IAsyncResult ar)
        {
            UdpClient u = (UdpClient)ar.AsyncState;

            mMsgSent = true;
        }

public void Send()
        {
            while (!mThreadStop)
            {
                if (!mSendStop)
                {                    
                    for (int i = 0; i < mSendString.Length; i+=4)
                    {
                        Byte[] sendBytes = new Byte[4];
                        Encoding.ASCII.GetBytes(mSendString,i,4,sendBytes,0);
                        mSendClient.BeginSend(sendBytes, 1, mEndPoint, new AsyncCallback(SendCallback), mSendClient);                        
                    }

                }
                Thread.Sleep(100);
            }
        }

1 个答案:

答案 0 :(得分:0)

当我在某些方面问这个问题时,我错了:

  • 首先,术语错误-字符串被切/切/分成 四个字节的数据包,不分段。
  • 第二,我也被认为 小小的UDP数据包是我的应用程序延迟的原因,但是当我 我的UDP接收代码与其他应用程序代码分开运行,我发现了这个 UDP接收代码工作正常,没有延迟。

似乎存在线程问题,而不是UDP套接字。