首页 新闻 会员 周边 捐助

C# udp接收问题

0
[待解决问题]

使用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;
}

从入门到精通的小林的主页 从入门到精通的小林 | 菜鸟二级 | 园豆:202
提问于:2024-12-26 11:07

建议提供能重现这个问题的示例代码

dudu 1周前
< >
分享
所有回答(4)
0

帮顶。。。。。。。。

tea2007 | 园豆:2 (初学一级) | 2024-12-26 11:45
0

看一下缓冲区? 是不是每次覆盖

猝不及防 | 园豆:2882 (老鸟四级) | 2024-12-26 15:09

缓冲区设置默认的字节数,接收到的单帧数据就不到100字节,应该不会超。
但是两帧报文之间的间隔比较小,就几百微秒,不知道C#处理这种微秒级的数据会不会有影响?

0

你把代码贴出来看看,C#有问题的可能性不大,大概率还是你的代码有问题

www378660084 | 园豆:1302 (小虾三级) | 2024-12-27 10:29
0

public static async Task<byte[]> RecvAsyncTask() 这个方法改成非静态的, 静态的方法只占用一块内存,你的数据前面的一定会被后面的覆盖掉

百鸟朝凤 | 园豆:262 (菜鸟二级) | 2024-12-27 16:46

把静态方法都改一下, 接收数据 public static void RecvTask() 全都改成非静态的写法

支持(0) 反对(0) 百鸟朝凤 | 园豆:262 (菜鸟二级) | 2024-12-27 16:48

改了,还是有这问题,我怀疑可能是连续的两个数据报发送太快,等到调度触发接收第一帧数据的时候,第二帧数据已经把前一帧UDP数据覆盖掉了,导致两次接收的实际是同一帧数据。这问题不是百分百出现的,在大数据量的情况下偶尔出现一次

@从入门到精通的小林: 不行就升级下硬件 ,换更好的交换机, 或者电脑网卡试试

支持(0) 反对(0) 百鸟朝凤 | 园豆:262 (菜鸟二级) | 2024-12-27 17:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册