解析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 
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);

你可能感兴趣的:(udp,网络协议,网络)