QT中UDPSocket丢包问题

2023-11-11

1.配置和编程

下位机向上位机发送UDP数据包,由于UDP小包不能写太大,每个小包也就1kB左右。

下位机周期性地发送数据,每个周期发送数百个udp包,并且是使用while死循环来发送的。

上位机使用QUdpSocket类接收UDP数据。采用信号-槽的机制,信号使用socket的readyRead,来通知函数接收数据。

2.现象

在上位机上使用wireshark监测接收到的数据包,发现在4-5个ms内收到两百多个udp小包,相邻小包的时间间隔在几个us。

使用QT编写的软件接收数据,出现严重的丢包现象。二百多包数据,每次仅能收到一半左右的数据包,并且这个数量是不固定的。

3.初步解决

查询网上资料,有很多人遇到了这个问题,一种观点认为:

在Windows下,QT对udp socket的支持较差,建议使用WinSocket。QT在Linux下对udp socket的支持较好。

于是进行了以下改进:

(1)操作系统变更为Linux

(2)摒弃了信号-槽的方式,在程序中新开了一个线程,在线程中利用while循环来接收数据。基本的代码如下:

    while(1)
    {
        while( p_socket->hasPendingDatagrams())  // 有数据
        {
            net_pack_size = p_socket->pendingDatagramSize();
            p_socket->readDatagram((char*)p_net_pack,net_pack_size);
	    // 补充其他处理:数据存储等
        }
    }

4.测试情况及问题

(1)在Linux下,不丢包了。但有CPU上有一个核始终占用100%。

(2)在Windows下,仍然存在丢包的现象。只有一次瞬间发送udp小包在64包以下时,才不丢包。

5.思考及后续解决方案

(1)Qt的UDP Socket不能使用阻塞模式,所以不丢包的代价就是使用while死循环收数,CPU占用率100%,并且还得是Linux系统。

(2)拟采用原始的Socket处理函数,或在Windows下使用WinSocket库来改进。改进结果尚不清楚,后续仍会跟进。

[20170524]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT中UDPSocket丢包问题 的相关文章

  • 使用 QGraphicsScene 和 QGraphicsView 在 Qt 中开始基于 Tile 的游戏

    我将开始在 Qt 中编写基于 2D 图块的游戏 并阅读 QGraphicsScene 和 QGraphicsView 类 这些类旨在显示和处理大量 2D 对象 我的问题是 使用 QGraphicsScene 创建一个包含大量图块的世界是否可
  • 使用 QNetworkAccessManager 的 Qt 控制台应用程序

    我正在尝试写一个Qt调用网络服务的应用程序 这是一个控制台应用程序 url 将作为命令行参数传入 我搜索了例如http程序在Qt并找到这个链接 http qt project org doc qt 5 qnetworkaccessmanag
  • 使用 C++ 访问 Azure blob 存储 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 QWT 构建时出错

    我收到一个错误 undefined reference to QwtPlot QwtPlot QWidget 当我尝试构建我的项目时 即使设置中一切看起来都很好 在我的 CmakeLists txt 中我有 include director
  • 当选项卡到另一个组件位置时,QML 中相应的滚动

    我想做的是 如果我从TextField到另一个组件 aComboBoxwtv 我希望滚动能够适应这一点 当我认为这非常重要时 当我执行连续选项卡时 我会转到滚动视图显示的内容下方的控件 一个例子是 假设我在这里 now i do 2 tab
  • PyQt:在运行时向滚动区域添加小部件

    我试图在运行时通过按下按钮来添加新的小部件 在下面的示例中我使用标签 这里是例子 import sys from PyQt4 QtCore import from PyQt4 QtGui import class Widget QWidge
  • 如何为QTableView中的当前项目设置样式表

    When QTableView编辑控件对于发生编辑的当前项目可见 当窗口中没有活动的编辑控件时QTableView当前项目的样式使用QTableView selection background color 如何只为当前项目设置不同的样式
  • 仅具有年/月视图的 PyQt 日历

    在 Qt Designer 中 QDateTimeEdit 具有日历视图选项 通过设置显示格式 我只能显示月 年 但是 当用户单击视图时 它会自动显示每日日历 有没有办法让它只显示月 年日历 为了形象地解释一下 Windows 日历具有与
  • 如何在 Qt4 OpenGL 应用程序中启用 HiDPI (Retina) 支持?

    我正在使用带有 QGraphicsView 的 QGraphicsScene 如中所述这个文件 https doc qt io archives qq qq26 openglcanvas html 我打算最终将 Qt 小部件覆盖在我的 Op
  • qtcreator中C++14的编译

    我有一个 qt 项目 其中包含以下部分C 14 最近 我改变了我的 ubuntu 发行版 现在我有 16 04 LTS 并且安装了 Qt Creator 4 02 建于 6 月 13 日 为了启用C 14编译 我放入项目文件中 QMAKE
  • 从 QTableView 读取和写入文件

    如何读取和写入输入 QTableView 的文本文件日期 这就是我所拥有的 但我想在将数据添加到表中时保存数据 当然能够在重新打开应用程序时读回它 有什么教程可以参考吗 MainWindow MainWindow QWidget paren
  • QNetworkAccessManager 的替代方案

    我正在BB10中绘制地图 地图被划分为图块 开始时 用户给出经度 纬度和缩放级别 地图将显示在该坐标处 我通过使用 QNetworkAccessManager 执行 http 请求来获得单个图块 首先下载 7x5 块 但问题是 当用户开始在
  • 用Qt制作无边框窗口

    我是 Qt C 新手 我下载了最新的 Windows 版本 做了一些教程 非常棒 我看到了 Qt 框架具有的一些样式选项 而且它很棒 但现在我需要构建我的应用程序 其主窗口 形式 是用没有矩形边框 无边框 的图像设计 蒙皮的 我怎样才能用Q
  • 更改 QGraphicsView 中的光标

    我正在尝试更改 a 的光标QGraphicsView而ScrollHandDrag已开启 但似乎不起作用 如果禁用 我可以更改光标ScrollHandDrag但不是在它处于活动状态时 我不知道我可能做错了什么 下面是重现该问题的代码的一部分
  • Qt 中的智能指针[重复]

    这个问题在这里已经有答案了 就像已经写过一样here http blog qt digia com 2009 08 25 count with me how many smart pointer classes does qt have Q
  • 如何禁用滚轮事件 QGraphicsView Qt C++ 上的滚动功能

    我有一个图形视图 并且我设置了自己的功能 以便在用户按下 Control 并单击鼠标时手动拖动滚动 我已经删除了滚动条 但鼠标滚轮仍然会滚动 甚至滚动到显示在图像中的图像qGraphicsView显示我的手拖动没有的空白 白色 空间 我怎样
  • 交叉引用标头中出现“未终止条件指令”错误

    有两个类在其标头中彼此相关 绘图标记 ifndef PLOTMARKER H define PLOTMARKER H include
  • 在 Qt 5.12 的 OpenCV dll 上找不到入口点

    TLDR 将 OpenCV 与 QT MingW 链接会使应用程序在调试时崩溃 但不会在发布时崩溃 我正在尝试在基于 Qt 的大型多操作系统项目中使用 OpenCV 我已经轻松地为 Mac 和 Linux 构建了 OpenCV 但在 Win
  • QTextEdit:仅当滚动条位于底部时自动向下滚动

    有一个 QTextEdit 显示相当多的文本 它不可编辑 假设我想在开头阅读一些内容 向上滚动 但随后添加了一个新行 并且滚动条自动转到底部 我在使用各种程序时遇到类似的问题 无论它们是用什么语言编写的 如何处理这个问题 当向文本添加新行时
  • Qt 模型/视图与标准小部件

    我目前正在阅读模型 视图tutorial http qt project org doc qt 4 8 modelview html来自 Qt 但我仍然不确定是否应该为我的 Qt 程序使用模型 视图或小部件 我需要做一个记录器应用程序来监视

随机推荐

  • 结构体指针

    结构体指针 当一个指针变量用来指向一个结构体变量时 1 结构体指针变量的值是所指向的结构体变量的起始地址 2 通过结构体指针可以访问结构体变量 定义形式 结构体名 结构体指针变量 也可在定义结构体时 同时定义这个结构体变量 注 1 结构体指
  • 实现从一个类中的实体对象获取所有属性值注入到另一个不同类的实体对象的对应属性中

    背景 由于dao层的可视化对象 bean 跟service层以及controller层的bean对象是分开的 也就是同一业务流水线中 在controller层是跟界面或者接口的交互bean 而到了操作数据库层则用的匹配数据库表的实体bean
  • python wechatsougou_使用Python的requests库模拟登陆微信搜狗,爬取100X10篇微信文章并保存到MySQL...

    自学的python和爬虫技术 使用到Redis MySQL数据库 request请求模块 re Xpath解析模块 dumps loads序列化和反序列化 还可以配合代理池使用 爬取的是https weixin sogou com 网站只能
  • RPM打包原理、示例、详解

    RPM Redhat Package Manager 是用于Redhat CentOS Fedora等Linux 分发版 distribution 的常见的软件包管理器 因为它允许分发已编译的软件 所以用户只用一个命令就可以安装软件 看到这
  • BI数据系统的设计流程

    BI大数据产品 数据管理平台可以通过报表或者BI模块来搭建 在专栏 帆软数据应用研究院 里有关于企业数据管理和BI报表平台建设的案例 站在项目实施的角度 可以从技术和业务两个层面来考虑 前期进行需求调研 罗列了一张建设思路图 技术上需要考虑
  • 量化投资学习-30:股性与人性,从傅里叶变换谈谈股市大V的操作风格的观察

    1 名家的操作风格的差异 2 方波的傅里叶变换 徐小明 1次基频率 冯矿伟 3次谐波 东风红 5 7次谐波
  • 把多层次的 XML 文档解析为 TreeView 显示

    XML 文档是一个有多层树形节点的文档 因为节点数不确定 所以要跟踪每个节点 需要用到递归 肉眼阅读 XML 比较累 需要去对付一堆的尖括号 用 Delphi 程序把它显示为一个 TreeView 的树结构 比较容易用眼睛去看 以下是我的代
  • 对比学习MocoV1

    对比学习 希望模型能分辨哪些图片类似 哪些图片不类似 即类似的图片特征空间拉近 不类似的拉远 可以设计不同的代理任务提供监督信号 代理任务例子 个体判别 Xi经过两种Ti变成两张不一样的照片 为正样本 其他都是负样本 损失 NCE loss
  • 项目8—八位数码管动态显示(包含程序化简)

    利用74HC573芯片 74HC573的八个锁存器都是透明的D型锁存器 当使能 G 为高时 Q输出将随数据 D 输入而变 当使能为低时 输出将锁存在已建立的数据电平上 输出控制不影响锁存器的内部工作 即老数据可以保持 甚至当输出被关闭时 新
  • centos sftp配置

    SFTP 即 SSH 文件传输协议 或者说是安全文件传输协议 通过SSH端口加密传输 但是 由于这种传输方式使用了加密 解密技术 所以传输效率比普通的FTP要低得多 SFTP的优势在于SSH软件包中包含SFTP 无需额外安装 iptable
  • ES6中const详解

    我们使用const声明常量时 总认为值一旦声明就不可改变 然后我发现在定义对象时 对象的值是可以改变的 对于数值 var message Hello let age 25 以下两行都会报错 const message Goodbye con
  • 在计算机网络中 主机及主机上运行的程序,防灾科技学院网络协议分析复习题...

    一 单项选择题 1 为了提高传输效率 TCP通常采用 A 三次握手法 B 窗口控制机制 C 自动重发机制 D 端口机制 2 某校园网的地址是202 100 192 0 18 要把该网络分成30个子网 则子网掩码应该是 A 255 255 2
  • 李超树(无脑秒斜率)

    文章目录 一 What 二 How 1 插入 update 2 查询 query 三 板题 JSOI2008 Blue Mary开公司 https www luogu com cn problem P4254 五 高端操作 1 动态开点 2
  • delphi中常见错误提示说明

    Delphi的中文错误提示 not allowed before ELSE ElSE前不允许有 clause not allowed in OLE automation section 在OLE自动区段不允许 子句 is not a typ
  • URL中的转义字符

    URL中的转义字符 当URL的参数中出现诸如 空格 等特殊字符串符号时 因为上述字符有特殊含义 导致服务器端无法正确解析参数 如何处理 解决办法 将这些字符转化成服务器可以识别的字符 如果要在URL中传递特殊符号的原本意义 要对他们进行编码
  • chromium 之 webui 调用逻辑

    chromium之webui详细文档参考 WebUI Explainer googlesource com 本文主要讲述webui的调用逻辑 webui webui 用于管理chrome浏览器 通过 chrome url 的方式 可以进行不
  • K8s知识点梳理

    1 k8s是一个编排容器的工具 其实也是管理应用的全生命周期的一个工具 从创建应用 应用的部署 应用提供服务 扩容缩容应用 应用更新 都非常的方便 而且可以做到故障自愈 例如一个服务器 挂了 可以自动将这个服务器上的服务调度到另一个主机上进
  • Java之对象比较

    目录 1 同一性比较 2 相等性比较 3 需要比较对象之间的大小关系 3 1 Comparable接口比较 两个对象 3 1 1 已经实现了Comparable接口的类 例如下面的String类 3 1 2 自己定义类并实现Comparab
  • Apollo原理

    Apollo原理 https github com ctripcorp apollo wiki Apollo E9 85 8D E7 BD AE E4 B8 AD E5 BF 83 E8 AE BE E8 AE A1 提交就是 提交给客户端
  • QT中UDPSocket丢包问题

    1 配置和编程 下位机向上位机发送UDP数据包 由于UDP小包不能写太大 每个小包也就1kB左右 下位机周期性地发送数据 每个周期发送数百个udp包 并且是使用while死循环来发送的 上位机使用QUdpSocket类接收UDP数据 采用信