解析UDP传输过程中数据包丢失问题(大全)

拿去不谢!!!!!!!!!!!!

在QT进行UDP编程时,如果发送方发送数据过快,QT无法保证正确的接收。这就导致QTUDP产生丢包现象。

发送方是us级别发送  接收是ms接收 导致数据丢包严重,加上QT的UDP是封装好的,导致数据不可用。

解决方案:

1. 进行windows下UDP编程,替换原来的QT编程。

2.增加window下缓存区 setsocketopt()函数    设置flage属性为重复利用。

3.开启多线程处理,采用Qthread run 函数进行接收操作,减少IO压力。

4.必要情况采用安全接收 recv  函数 放弃 recvfrom函数。

**************************************************************************************************************也可以看一下方案:

1. 从发送端解决(推荐)

适用条件: ①发送端是可以控制的.②微秒数量级的延迟可以接受.

解决方法:发送时使用usleep(1)延迟1微秒发送,即发送频率不要过快,延迟1微妙发送,可以很好的解决这个问题.

2.从接收端解决方法一

适用条件:①无法控制发送端发送数据的频率

解决方法: 用recvfrom函数收到数据之后尽快返回,进行下一次recvfrom,可以通过多线程+队列来解决.收到数据之后将数据放入队列中,另起一个线程去处理收到的数据.

3.从接收端解决方法二

适用条件:①使用方法2依然出现大规模丢包的情况,需要进一步优化

解决方法:使用setsockopt修改接收端的缓冲区大小

最后一个内核方案:

指定到单独一个CPU上运行会比不指定CPU运行时快

将线程(进程)绑定到指定CPU核心,从而不让windows自作主张帮我们分散任务,从而提高单线程效率是很有必要的。

#include <window.h>
DWORD_PTR SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask);

参数:
第一个参数hThread:当前进程的句柄,可以通过函数GetCurrentThread()配套使用得到;
第二个参数mask:指定的CPU核心
以我8核电脑为例:
第0个cpu核:mask=0x00
第1个cpu核:mask=0x01
第2个cpu核:mask=0x04

第7个cpu核:mask=0x80

示例:将我的udp读取数据线程放在最后一个核中运行

#include <window.h>
SetThreadAffinityMask(GetCurrentThread(), 0x80);

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值