让 Win10 上网本 Debug 模式 QUDPSocket 信号&槽 收发不丢包的方法总结

前两篇文章里,我们探讨了不少UDP丢包的解决方案。经过几年的摸索测试,其实方法非常简单, 无需修改代码。

1. Windows 下设置UDP缓存

这个方法可以一劳永逸解决UDP的收发丢包问题,只要添加注册表项目并重启即可。即使用Qt的信号与槽,QUdpSocket用信号-槽在Debug模式下也一包不丢。把下文存储为"udp.reg",而后双击,即可修改注册表。

reg 复制代码
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFD\Parameters]
"DefaultReceiveWindow"=dword:00100000
"FastSendDatagramThreshold"=dword:00002800
"DefaultSendWindow"=dword:00100000

设置好后,即使在Debug模式下,也一包不丢:

txt 复制代码
qtcpp_demo/udp_loss_test/build/debug/udp_loss_test.exe
Start...
QUdpSocket LOOP:
        Send 10000, Recv 10000, Lost 0.
Start...
QUdpSocket Signal and Slots:
        Send 10000, Recv 10000, Lost 0.
Start...
Local Socket :
        Send 10000, Recv 10000, Lost 0.
Finished sending. Closing socket.
Exiting.

2. Linux 下设置UDP缓存

Linux 下,默认的缓存已经足够了,Debug版本也不会丢包。如果需要,则设置缓存:

basg 复制代码
sudo sysctl -w net.core.rmem_default=100000
net.core.rmem_default = 100000
sudo sysctl -w net.core.rmem_max=1000000
net.core.rmem_max = 1000000

参考:
https://www.baeldung.com/linux/udp-socket-buffer

3. 代码级别的设置

想要单独用代码设置1个套接字的缓存,则使用:

(参考:https://blog.csdn.net/test1280/article/details/79776938)

c 复制代码
    int  rcvBufSize = 1024*1024*16;
	 int optlen = sizeof(rcvBufSize);
    if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvBufSize, optlen) < 0)
    {
        printf("setsockopt error=%d(%s)!!!\n", errno, strerror(errno));
        goto error;
    }
    printf("set udp socket(%d) recv buff size to %d OK!!!\n", sockfd, rcvBufSize);

4. 测试工程

测试工程参考:

https://gitcode.net/coloreaglestdio/qtcpp_demo/-/tree/master/udp_loss_test

5 效果

在上网本Intel® Celeron® CPU J1800 @ 2.41GHz 2.41 GHz下,Qt 6.8.0 MINGW64 Debug模式,

txt 复制代码
Starting C:\projects\qtcpp_demo\udp_loss_test\build\Desktop_Qt_6_8_0_shared_MinGW_w64_UCRT64_MSYS2-Debug\debug\udp_loss_test.exe...
Start...
QUdpSocket LOOP:
	Send 10000, Recv 10000, Lost 0.
Start...
QUdpSocket Signal and Slots:
	Send 10000, Recv 10000, Lost 0.
Start...
Local Socket :
	Send 10000, Recv 10000, Lost 0.
Finished sending. Closing socket.
Exiting.
相关推荐
骥龙2 分钟前
粤港澳全运会网络安全防御体系深度解析:威胁态势与实战防护
网络·安全·web安全
漫谈网络14 分钟前
InfiniBand 深度解析
网络·rdma·infiniband·roce v2
海域云赵从友26 分钟前
从直播卡顿到流畅带货:SD-WAN网络专线如何优化阿联酋TikTok体验?
网络
Saniffer_SH26 分钟前
【高清视频】CXL 2.0 over Fibre演示和答疑 - 将内存拉到服务器10米之外
运维·服务器·网络·人工智能·驱动开发·计算机外设·硬件工程
jyan_敬言44 分钟前
【Docker】docker网络配置
网络·docker·容器
apple_ttt2 小时前
范式革命:RDMA 如何让网络成为 “分布式内存总线”
网络·计算机网络·数据中心·rdma·数据中心网络
豆沙沙包?2 小时前
http/1.1,http/2和http/3、三次握手和四次挥手
网络·网络协议·http
文火冰糖的硅基工坊2 小时前
[创业之路-640]:通信行业供应链 - 通信网的发展趋势:IP化统一 、云网融合 、算网协同 、FMC(固定移动融合)、空天地一体化
网络·网络协议·tcp/ip·系统架构·通信·产业链
我也要当昏君2 小时前
4.1 网络层的功能 (答案见原书 P134)
网络·智能路由器
努力还债的学术吗喽2 小时前
pycharm找不到Tencent Cloud CodeBuddy如何安装[windows]?pycharm插件市场找不到插件如何安装?
ide·windows·pycharm·插件·plugin·codebuddy