我正在尝试编写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);
}
}
答案 0 :(得分:0)
当我在某些方面问这个问题时,我错了:
似乎存在线程问题,而不是UDP套接字。