使用C#提供的UDPClient.Recive异步接收UDP数据报,快速接收两帧数据时,出现后一帧数据把前一帧数据覆盖掉的情况,也就是触发两次接收,实际两次接收到的都是后一帧数据,但是通过wireshark抓取数据可以看到,网络是上两帧内容不同的数据报。
这是什么情况,有什么解决办法?
代码如下:
public static void RecvTask()
{
Task.Run(async()=>
{
if(ProgramControl.recvCancellationTokenSource != null)
{
while (!ProgramControl.recvCancellationTokenSource.IsCancellationRequested)
{
var ret = await Udp.RecvAsyncTask();
byte bytes[] = ret;
UserData.TraceQueue.Enqueue(bytes);
}
}
});
}
主要是循环异步接收UDP报文,接收到就存入一个队列里
Udp.RecvAsyncTask()方法如下:
public static async Task<byte[]> RecvAsyncTask()
{
var result = await udpReceiver.ReceiveAsync();
byte bytes[] = result.Buffer;
return bytes;
}
帮顶。。。。。。。。
看一下缓冲区? 是不是每次覆盖
缓冲区设置默认的字节数,接收到的单帧数据就不到100字节,应该不会超。
但是两帧报文之间的间隔比较小,就几百微秒,不知道C#处理这种微秒级的数据会不会有影响?
你把代码贴出来看看,C#有问题的可能性不大,大概率还是你的代码有问题
public static async Task<byte[]> RecvAsyncTask() 这个方法改成非静态的, 静态的方法只占用一块内存,你的数据前面的一定会被后面的覆盖掉
把静态方法都改一下, 接收数据 public static void RecvTask() 全都改成非静态的写法
改了,还是有这问题,我怀疑可能是连续的两个数据报发送太快,等到调度触发接收第一帧数据的时候,第二帧数据已经把前一帧UDP数据覆盖掉了,导致两次接收的实际是同一帧数据。这问题不是百分百出现的,在大数据量的情况下偶尔出现一次
@从入门到精通的小林: 不行就升级下硬件 ,换更好的交换机, 或者电脑网卡试试
建议提供能重现这个问题的示例代码
– dudu 1周前