拿去不谢!!!!!!!!!!!!
在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 <>
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 <>
SetThreadAffinityMask(GetCurrentThread(), 0x80);