QUdpSocket服务端接收数据说明(非阻塞)

news/2024/5/18 15:13:44 标签: udp, tcp/ip

先说结论吧,QUdpSocket不支持阻塞式访问,正常非阻塞的要么需要信号槽机制访问,要么需要循环判断,导致的结果就是要不丢包严重,要不CPU占用率高,还是建以利用socket自己去实现UDP。

参考:QT中UDPSocket丢包问题_rabbitjerry的专栏-CSDN博客_qt udp丢包

1.信号槽机制访问

#include <QCoreApplication>
#include <QUdpSocket>
#include <QHostAddress>
#include <QDebug>
#include <QNetworkDatagram>
#include <QObject>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QUdpSocket *udp = new QUdpSocket();
    udp->bind(QHostAddress::LocalHost,8080);
    long count = 0;


    QObject::connect(udp,&QUdpSocket::readyRead,[udp,&count]()
    {while (udp->hasPendingDatagrams()) {
            QNetworkDatagram datagram = udp->receiveDatagram();

            qDebug() << datagram.data().size();
                        count ++;
                        qDebug() << "Packet " << count;
        }
    });
    return a.exec();
}

 本地循环测试情况下,客户端不加任何延迟全速发送,客户端发送5000包,服务端接收到230-250包不等,丢包严重,而且CPU占用率达4%-8%。

2.线程中轮询

#include <QCoreApplication>
#include <QUdpSocket>
#include <QHostAddress>
#include <QDebug>
#include <QNetworkDatagram>
#include <QObject>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QUdpSocket *udp = new QUdpSocket();
    udp->bind(QHostAddress::LocalHost,8080);
    long count = 0;
    char buffer[1280] = {0};
    while(1)
    {
        while(udp->hasPendingDatagrams())
        {
            qDebug() << udp->readDatagram(buffer,1280);
            count ++;
            qDebug() << "Packet " << count;
        }
    }

    return a.exec();
}

本地循环测试情况下,客户端不加任何延迟全速发送,客户端发送5000包,服务端接收到230-250包不等,丢包严重,而且CPU占用率达12%-15%。

总之,低速的UDP包接收可以利用QUdpSocker来实现,高速的在windows环境下支持挺差的。


http://www.niftyadmin.cn/n/701706.html

相关文章

apply筛选 pandas_使用pandas做数据分析,掌握这些函数就够了

pandas是数据分析师最常用的工具之一&#xff0c;掌握以下函数足以应对工作中的各种需求&#xff0c;P4 数据集描述P5 重命名列名称P6 删除列P7 整体排序P8 通过列条件筛选数据P9 多条件筛选P11 怎样使用axis参数P12 字符串方法P13 改变数据类型P14 什么时候使用groupbyP15 探索…

Matlab —— 实用小技巧

1. CtrlC 中断正在执行的操作 如果程序不小心进入死循环&#xff0c;或者计算时间太长&#xff0c;可以在命令窗口中使用Ctrlc来中断。MATLAB这时可能正疲于应付&#xff0c;响应会有些滞后。 2. figure命令新建一个绘图窗口 figure 可以打开一个空的绘图窗口&#xff0c;接下…

birt报表表格边框_表格控件SpreadJS V3.2重磅来袭!新增Vue等大三框架示例代码

SpreadJSSpreadJS是一款基于HTML5的纯前端电子表格控件&#xff0c;兼容 450 种以上的 Excel 公式&#xff0c;凭借其 “高性能、跨平台、与 Excel 高度兼容”的产品特性&#xff0c;备受以华为、苏宁易购等企业用户青睐。伴随着SpreadJS V13.0 Update2 的正式发布&#xff0c;…

Qt实现简易版的网络调试助手支持多端口监听(服务端)

调试DSP的小伙伴&#xff0c;需要对多个端口的客户端进行发送响应&#xff0c;但是用到的网络助手只支持单一发送&#xff0c;因此找我写了个简单Demo&#xff0c;供大家参考&#xff0c;后续可以考虑将combox作为勾选项&#xff0c;控制特定端口进行发送。 界面大概长这个样子…

更换mysql_用 Docker 构建 MySQL 主从环境

前言本篇文章记录我使用 docker-compose 以及 dockerfile 来构建基于 binlog 的 MySQL 主从环境。如果你严格按照文中的步骤进行配置&#xff0c;相信很快就可以搭建好一个基础的 MySQL 主从环境。介绍MySQL 主从同步分为 5 个步骤&#xff1a;master 节点将数据的更新记录写到…

XML笔记-XML基础

以下都是对W3CSchool网站上的一些知识点记录&#xff0c;便于日后查看和理解。 一、什么是XML&#xff1f; XML&#xff1a;Extensible Markup Language&#xff0c;可扩展标记语言。 XML的设计宗旨是传输数据而非显示数据。 XML便签不像HTML标签&#xff0c;XML标签没有被预…

XML笔记-XMLHttpRequest对象

XHR &#xff08;XMLHttpRequest&#xff09;用于与服务器进行局部数据也是AJAX 的基础&#xff0c;此处对其做较为详细的记录和全面的了解&#xff0c;便于日后查看。 参考地址&#xff1a; https://msdn.microsoft.com/zh-cn/sqlserver/ms535874 一、XMLHttpRequest 对象 …

卸载 插件_fcpx的fxfactory插件如何卸载?fxfactory无法完全卸载?fxfactory卸载教程...

有很多用户下载了fxfactory这款软件&#xff0c;并且安装了许多的fcpx插件&#xff0c;但是用clean my mac卸载&#xff0c;显示是已经删了&#xff0c;但在final cut里面还有&#xff0c;每次运行final cut都要载入好半天fxfactory的一大箩筐插件。接下来macw小编为大家带来正…