Qt UDP Socket丢包问题(实现百兆级速率无丢包)

如何将线程/进程在一个/多个CPU核上运行 设置线程/进程和CPU亲缘性 阅读详情
AI摘要

本文探讨了在高速数据传输中,如何通过将QT UDP通信线程绑定到特定CPU核心,解决因Windows机制与Intel自动降频技术冲突导致的卡顿和数据丢失问题。通过实践和优化,作者实现了90M无丢包传输,并分享了解决方案和提升性能的方法。

项目场景:

使用QT下的UDPsocket与FPGA进行通信,通过udp每62.5us发送512字节(66M的速度)的数据到PC端中。bind绑定后,connect关联槽函数,在槽函数中死循环接收读取发送过来的数据,为了使用户界面不卡死,开启一条单独的线程运行接收的槽函数。

问题描述:

每62.5us发送512字节大概是66M的速度,PC端使用的是百兆网卡,要求在这个速度下持续运行8小时以上。demo运行时卡顿,数据传输过程中数据时不时出现丢失的情况。查阅资料后发现window提供了接口可以将指定的线程绑定到特定的cpu核心中,可以减少卡顿,加快读取速度减少丢包。


原因分析:

一个程序指定到单独一个CPU上运行会比不指定CPU运行时快。这中间主要有两个原因:

  1. CPU切换时损耗的性能。
  2. Intel的自动降频技术和windows的机制冲突:windows有一个功能是平衡负载,可以将一个线程在不同时间分配到不同CPU,从而使得每一个CPU不“过累”。然而,Inter又有一个技术叫做SpeedStep,当一个CPU没有满负荷运行时自动降频从而达到节能减排的目的。这两个功能实际是冲突的:一个程序被分配到多个CPU协同工作->每个CPU都不是满载->每个CPU都会降频->windows发现每个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);

结论:

在这里插入图片描述
可以看到最后一个cpu已经100%使用率了,已经成功将指定线程移动到该核心上运行。
丢包情况已经改善一些,可是还是有万分之一多的丢包率,如何解决?

更新

丢包就是server端发的太快,客户端cpu处理不过来就丢了,解决思路主要有:
1、udp每个数据包数据长度不要超过mtu限制,杜绝分片,一般为1500Byte以下;
2、增大以太网接口(NIC)传输队列和套接字接收缓冲区,这个方法最直接有效;
3、cpu核心锁定。

优先第二种方法,一般就能解决丢包问题,不行再配合其它办法使用。我用这些办法已经实现90M的速度,长时间运行无丢包了,亲测可行。

Qt 使用UDPSocket遇到的丢包问题 最近烦人的事情很多,所以博客一直被落下了。这样ba 阅读详情

相关推荐

Qt网络编程中UDP套接字丢包问题

然而,有时候会遇到UDP套接字丢包的问题,即发送的数据在传输过程中丢失了一部分或全部。然而,需要注意的是,以上方法仅仅是一些简单的示例,实际应用中可能需要更复杂的处理逻辑来应对不同的网络环境和数据传输需求。此外,对于高可靠性和性能要求较高的应用,可能需要使用更强大的协议或库来处理数据传输。根据具体应用场景和需求,可以选择合适的方法来提高数据传输的可靠性和稳定性。在上述示例代码中,发送方和接收方都进行了一些简单的处理,以保证数据的可靠传输。发送方使用定时器进行重传,接收方发送确认消息,并验证数据包的校验和。

2301_79366106的博客 996

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

QT下UDP丢包问题解决方案。

用于记录学习的过程,不做商业用途。 3559

基于Qt与TCP/UDP的毫米波雷达远程数据采集系统设计与实现

在嵌入式系统与物联网应用中,数据采集是连接物理世界与数字世界的核心环节。其基本原理是通过传感器或专用硬件(如数据采集卡)获取模拟或数字信号,再经由通信接口传输至上位机进行处理。这项技术的核心价值在于实现数据的实时、可靠获取,为后续的信号处理、算法验证和系统控制提供基础。在工业自动化、设备监测和雷达系统测试等场景中,稳定高效的数据采集链路至关重要。本文聚焦于毫米波雷达研发中的远程数据采集需求,针对传统手动操作效率低、测试场景受限的痛点,详细介绍了一套基于Qt框架的软件解决方案。该系统深度整合了TI毫米波雷达S

weixin_33768481的博客 424

QUdpSocket 丢包测试与解决

Qt的信号与槽是很好的去耦合机质,但在实际使用中,要特别注意它的性能问题。信号与槽不适合非常密集的触发,切记越靠近动态语言的东西(典型的是Qt的元对象系统 meta-object)性能肯定越差。 本次记录的测试,即在生产环境遇到的典型案例。含有煤层断面、地下水的回波是勘探中重要的传感器数据。一般由多个传感器汇聚到计算终端(上位机)上,进行模型解算。以前一直在上位机上采用TCP Server, 板卡.........

丁劲犇技术发布空间 9407

基于Qt的毫米波雷达数据采集与实时处理系统设计与实现

在嵌入式系统与数据采集领域,上位机软件扮演着连接硬件与算法的关键角色,其核心在于实现稳定、高效的数据通信与实时处理。通过TCP/UDP协议与硬件交互,结合多线程架构,可以构建高吞吐量的数据流水线。Qt框架凭借其强大的跨平台能力、网络模块以及信号槽机制,为开发此类系统提供了理想的技术栈。本文聚焦于毫米波雷达应用场景,针对TI DCA1000EVM数据采集卡与AWR1843雷达模块,详细阐述了如何利用Qt实现远程控制、高速数据流接收、实时FFT处理及可视化,解决了海量ADC数据实时传输与处理的工程挑战,为雷达算

weixin_34293246的博客 444

UDP Flood攻击原理与企业级防护实战指南

UDP Flood是一种基于UDP协议无状态特性的网络层泛洪攻击,其核心在于利用高pps小包冲击目标带宽与CPU资源,绕过传统连接跟踪机制。理解其协议原理、源IP伪造特性及混合包长策略,是构建有效防御的基础。技术价值体现在对防火墙、负载均衡器及Linux内核协议栈的精准压力测试能力,广泛应用于等保测评、DDoS防护验证与红蓝对抗演练。实际场景中需结合流量清洗、哈希限速、conntrack调优与应用层熔断实现七层纵深防御。本文聚焦udp-flood.rar这一典型黑盒工具,解析其行为特征与合规替代方案,如ip

weixin_34335458的博客 437

关于QT UDP组播的两个问题

UDP组播时最好不要提客户端/服务端的概念,而是提发送端/接收端的概念,避免出现逻辑理解混乱。 大家在使用QT UDP时,可能会出现下面的情况: 1.接收不到数据 1.1 代码不对 我看有些文章会这样写: m_udpSocket = new QUdpSocket(); m_udpSocket->bind(QHostAddress::AnyIPv4,8083,QUdpSocket::Sha

ASKLW的博客 6581

VLP-16硬件部署避坑指南:从物理层连接到UDP数据解析

激光雷达VLP-16并非即插即用的通用传感器,而是一个依赖严格物理层约束与硬编码协议的精密光机电系统。其工作原理基于FPGA实时解析UDP数据流、APD纳秒级时间测量及多通道球坐标到直角坐标的确定性转换。技术价值体现在高精度时间同步(±1μs)、抗干扰点云生成与车载/机器人平台嵌入可靠性。典型应用场景包括自动驾驶建图、农业机器人导航与室内外融合SLAM,但极易因电源纹波超标、MDI/MDI-X网线误配、PPS边沿抖动或UDP包结构解析错误导致‘有电无数据’‘点云畸变’‘时间戳失效’。本文紧扣VLP-16用户

weixin_34290631的博客 558

从零构建:Qt UDP通信中的高效数据报处理与实时性优化

本文深入探讨了Qt框架下UDP通信的高效数据报处理与实时性优化方法。通过解析QUdpSocket核心机制、优化缓冲区管理与QoS策略,以及实现时间戳、自适应发送间隔等技巧,显著提升UDP在实时音视频传输和物联网应用中的性能表现。

water的专栏 713

点云配准实战:用DGCNN+Transformer+SVD搞定3D模型对齐(附PyTorch代码)

本文详细介绍了基于深度学习的点云配准实战方法,重点解析了Deep Closest Point (DCP)模型。该模型融合了DGCNN、Transformer和可微分SVD三大核心模块,能够端到端地预测点云间的刚性变换,有效克服传统ICP算法对初始位置敏感、易陷入局部最优的缺点。文章提供了完整的PyTorch代码实现、ModelNet40数据集处理、训练策略及显存优化技巧,旨在帮助开发者在机器人、自动驾驶等领域实现精准的3D模型对齐。

weixin_29061041的博客 155

用Multisim仿真AD630锁定放大器:从2012年电赛A题实战到避坑指南

本文详细介绍了如何使用Multisim仿真AD630锁定放大器,从2012年电赛A题实战出发,提供完整的电路搭建、参数优化及避坑指南。重点解析AD630的开关调制架构和双相位检测的工程实现,帮助读者在强噪声背景下有效提取微弱信号,提升电子设计竞赛和工程实践中的信号处理能力。

weixin_42549451的博客 203

上位机与下位机架构实战:通信选型、C#与C++互操作及工业现场避坑指南

在工业控制与嵌入式开发中,上位机与下位机架构通过职责分离解决实时性与交互性矛盾。上位机基于C#/.NET或C++实现人机界面与数据管理,下位机依托MCU或RTOS完成硬实时控制。二者通过串口、以太网或CAN总线通信,协议设计需处理粘包、校验与重传。该架构广泛应用于CNC、机器人及ECU刷写等场景,确保系统稳定与实时响应。C#调用C++动态库时,需注意调用约定与内存管理,避免access violation异常。

weixin_34187862的博客 387

ue4 角色奔跑/冲刺/蹲下 /蹲走 动作切换蓝图

序列:文章分为4部分: 一、准备工作+简单的蓝图连线 二、编写“行走” 混合空间 三、编写“蹲下”混合空间 四、合成2个动画,设置动画蓝图 —————————————— 一、准备工作 下载“动画初学者包”,添加到项目! 主要文件: 打开BP_playerCharacter,组价——添加组件,找到“摄像机”,“机臂” 没有找到就去其他项目复制过来 ———————————— 手写人物的移动,也可以在...

凉城古梦猫扑街的博客 4863

Socket丢包解决对策

socket使用过程中遇到个问题:因为数据量太大,大约有2w个字节的响应数据报,之前同事代码实现的时候没有做完整的接收处理。仅使用InputStream.available()做了一次读取,然后就遇到问题了! 会发现,每次读取的时候获得的长度值不固定,且均无法获得完整长度。另一方面,响应的数据报并不会告知发送的长度是多少,但是有结束标志:byte类型03是结束标志。 所以做了重新: by...

hacker_crazy的专栏 5445

视频预处理--经典方法卷积3D

在三维卷积操作中,卷积核不仅在空间维度上滑动,还在时间维度上滑动,从而同时捕捉时间和空间上的特征。通过合理设置步长和填充,可以灵活控制输出特征图的大小和特征提取的效果。你的理解非常准确:三维卷积核就像是一个长度为 3 的滑动窗口,每次选取 3 个连续的帧进行卷积操作,而步长和填充则进一步优化了这一过程。

m0_73359068的博客 1649

【训练】Qwen2.5VL 多机多卡 Grounding Box定位

之前的相关文章:【深度学习】LLaMA-Factory微调sft Qwen2-VL进行印章识别使用LLaMA-Factory微调sft Qwen2-VL-7B-Instruct构建最新的LLaMA-Factory镜像。

q742971636的博客 2584

QT中UDPSocket丢包问题

Qt中的QUdpSocket发生严重丢包现象,在Linux下使用while死循环接收来解决,但存在CPU占用率太高的问题。

rabbitjerry的专栏 1万+

基于MATLAB的Hough变换指针式仪表识别

综上所述,本文介绍了如何使用MATLAB中的Hough变换算法来实现指针式仪表的自动识别和读数。通过图像预处理、Hough变换和直线提取,我们可以准确地检测指针的位置,并进一步进行仪表读数。本文将介绍如何使用MATLAB中的Hough变换算法来实现指针式仪表的自动识别和读数。在指针式仪表识别中,我们可以利用Hough变换来检测仪表盘上的指针。以上是基于MATLAB的Hough变换指针式仪表识别的详细步骤和源代码示例。根据指针在仪表盘上的位置,我们可以进行角度计算或使用其他技术来获取准确的读数。

techDM的博客 464

QUdpSocket接收数据丢包问题

项目需求要用QT做一个上位机,使用QUdpSocket接收相机采集的数据,数据是实时传输的,会出现大量丢包,刚开始以为是处理不过来,就去掉了后边的数据处理,只进行接收,虽然丢包率降低了,但是还是会丢包。相机是甲方调试好的,人家给的Python的程序就可以不丢包的接收数据。发送方的速度太快,qt来不及接收,我在csdn看到一些博主说,qt的udp在window下不太支持。用QUdpSocket只进行接收不处理数据,看下边的代码,这样会丢包。这个问题搞了一个多星期,尝试了好多办法,终于搞定了,太开心了!

weixin_43489276的博客 1782

在 Android Studio 中接入 DeepSeek:加速 Android 开发进程

通过在 Android Studio 中接入 DeepSeek,Android 开发者能够充分利用人工智能技术带来的强大优势,显著提升开发效率和代码质量。从前期的安装准备,到具体的接入步骤,再到使用过程中的技巧和注意事项,每一个环节都为打造高效、智能的开发环境提供了有力支持。希望本文能帮助你顺利将 DeepSeek 融入到 Android Studio 的开发工作流程中,让你在 Android 开发的道路上更加得心应手,创造出更优质的 Android 应用。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4175

基于cnn version_transformer VIT模型的动物图像分类 完整代码+数据 动物分类教程

基于cnn version_transformer VIT模型的动物图像分类 完整代码+数据 动物分类教程

机器学习深度学习业余选手 1002

QT中用udp客户端发送消息,丢失数据的情况以及处理!

QT写了一个udp客户端,每隔5秒,发送20K左右字节的udp报文。出现情况:在本机可以几乎不丢包的收到数据。而在局域网环境 ,几乎有90%的丢包率,无法使用。查询了一下资料和做了测试。问题主要是出现在 udp发送的报文过大。解决办法和相关资料的解释如下:首先,我们知道,TCP/

一个烂人的随手笔记 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

linux收不到组播qt,LWIP2.0.2组播收不到数据

LWIP2.0.2组播收不到数据发布于 2019-02-17 16:35:55我使用LWIP2.0.2单播收发都可以,组播发送也可以,但是组播接收不到数据。使用LWIP1.4.1全部都是可以的。[img]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAuoAAABuCAIAAAD+u6EWAAAU7ElEQVR4nO2du47jSJaG+UK5FlEG...

weixin_39606137的博客 1553

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

计算机网络之Socket

对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问: 1. 什么是TCP/IP、UDP? 2. Socket在哪里呢? 3. Socket是什么呢? 4. 你会使用它们吗? 什么是TCP/IP、UDP? TCP/IP(Transmission Control Protocol/Internet Pro

u011411283的专栏 781

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

下一篇: netsh命令绑定IP和MAC地址
cor_csdn
博客等级 码龄6年 11粉丝 3原创
评论 20
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值