【QT】- QUdpSocket
QUdpSocket 是 Qt 自带的一个类,属于 Qt 网络模块,用于进行 UDP(用户数据报协议) 通信。它提供了简便的接口来发送和接收 UDP 数据报(datagrams)。
UDP 是一种无连接的协议,适用于那些不需要确保数据可靠性和顺序的应用场景,比如实时游戏、流媒体、DNS 请求等。
- QUdpSocket 概述
QUdpSocket 继承自 QAbstractSocket,可以用于进行基于 UDP 协议的数据发送和接收。
它支持异步和同步操作,可以在发送和接收数据时使用事件驱动的机制。
常用于客户端和服务器模型之间的通信。 - 常见操作
发送数据
接收数据
绑定端口
连接到远程地址和端口 - 使用 QUdpSocket
3.1 创建和初始化 QUdpSocket
你可以创建一个 QUdpSocket 实例,默认情况下,它不会绑定到本地端口,直到你显式地调用 bind() 来进行绑定。
cpp
QUdpSocket *udpSocket = new QUdpSocket(this);
3.2 发送数据
使用 writeDatagram() 方法发送数据报。该方法需要指定数据报内容、数据的大小、目标地址和端口。
cpp
QHostAddress targetAddress("127.0.0.1"); // 目标地址
quint16 targetPort = 12345; // 目标端口// 发送消息
QString message = "Hello, UDP!";
udpSocket->writeDatagram(message.toUtf8(), targetAddress, targetPort);
message.toUtf8():将 QString 转换为字节数组。
targetAddress:目标主机的 IP 地址。
targetPort:目标端口号。
3.3 接收数据
通过连接到 readyRead() 信号来异步接收数据。每当有数据到达时,readyRead() 信号会被触发。
cpp
// 当有数据到达时触发 readyRead() 信号
connect(udpSocket, &QUdpSocket::readyRead, this, &MyClass::readPendingDatagrams);void MyClass::readPendingDatagrams() {while (udpSocket->hasPendingDatagrams()) {QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());udpSocket->readDatagram(datagram.data(), datagram.size());// 处理接收到的数据QString receivedMessage = QString::fromUtf8(datagram);qDebug() << "Received message:" << receivedMessage;}
}
udpSocket->hasPendingDatagrams():检查是否有待处理的数据报。
udpSocket->readDatagram():读取接收到的数据。
3.4 绑定端口
要接收数据,必须将 QUdpSocket 绑定到一个本地端口上。你可以使用 bind() 方法进行绑定。
cpp
quint16 localPort = 12345; // 本地端口号
if (!udpSocket->bind(localPort)) {qDebug() << "Failed to bind port";
} else {qDebug() << "Listening on port" << localPort;
}
bind() 使得该套接字能够接收从网络上发往该端口的数据。
如果你不指定 QHostAddress::Any,它默认会绑定到本地地址 QHostAddress::Any,即所有可用的网络接口。
3.5 关闭套接字
如果你不再需要套接字,可以调用 close() 方法关闭它。
cpp
udpSocket->close();
4. 完整示例:UDP 客户端和服务器
4.1 UDP 客户端示例
cpp
#include <QtNetwork/QUdpSocket>
#include <QtNetwork/QHostAddress>
#include <QCoreApplication>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QUdpSocket udpSocket;QHostAddress targetAddress("127.0.0.1");quint16 targetPort = 12345;QString message = "Hello from UDP client";// 发送数据udpSocket.writeDatagram(message.toUtf8(), targetAddress, targetPort);qDebug() << "Message sent to" << targetAddress << ":" << targetPort;return a.exec();
}
4.2 UDP 服务器示例
cpp
#include <QtNetwork/QUdpSocket>
#include <QtNetwork/QHostAddress>
#include <QCoreApplication>
#include <QDebug>class UdpServer : public QObject {Q_OBJECTpublic:UdpServer(QObject *parent = nullptr) : QObject(parent) {// 初始化 QUdpSocketudpSocket = new QUdpSocket(this);// 绑定端口quint16 port = 12345;if (udpSocket->bind(port)) {qDebug() << "Listening on port" << port;} else {qDebug() << "Failed to bind port";}// 连接 readyRead 信号connect(udpSocket, &QUdpSocket::readyRead, this, &UdpServer::readPendingDatagrams);}private slots:void readPendingDatagrams() {while (udpSocket->hasPendingDatagrams()) {QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());udpSocket->readDatagram(datagram.data(), datagram.size());// 输出接收到的数据qDebug() << "Received message:" << QString::fromUtf8(datagram);}}private:QUdpSocket *udpSocket;
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);UdpServer server;return a.exec();
}
- 总结
QUdpSocket 是 Qt 提供的一个用于进行 UDP 通信的类。
你可以使用 writeDatagram() 方法来发送数据,通过 readyRead() 信号和 readDatagram() 方法来接收数据。
要接收数据,必须将 QUdpSocket 绑定到一个本地端口,通常通过 bind() 方法来完成。
UDP 是无连接的协议,适用于那些对实时性要求高、但不需要完全可靠性的应用场景。
相关文章:
【QT】- QUdpSocket
QUdpSocket 是 Qt 自带的一个类,属于 Qt 网络模块,用于进行 UDP(用户数据报协议) 通信。它提供了简便的接口来发送和接收 UDP 数据报(datagrams)。 UDP 是一种无连接的协议,适用于那些不需要确…...
性能测试丨分布式性能监控系统 SkyWalking
软件测试领域,分布式系统的复杂性不断增加,如何保证应用程序的高可用性与高性能,这是每一个软件测试工程师所面临的重大挑战。幸运的是,现在有了一些强大的工具来帮助我们应对这些挑战,其中之一便是Apache SkyWalking。…...
SQL GROUP BY 详解
SQL GROUP BY 详解 引言 在数据库查询中,GROUP BY 子句是一个非常有用的工具,它允许我们对查询结果进行分组,并基于这些分组进行聚合计算。本文将详细介绍 GROUP BY 的用法、注意事项以及在实际应用中的场景。 什么是 GROUP BY? GROUP BY 子句用于对查询结果进行分组。…...
C语言中string.h头文件功能介绍
在C语言的世界里,string.h头文件提供了许多用于处理字符串和内存操作的函数。今天,我们就来深入探讨string.h头文件的功能、使用注意事项以及一些拓展应用。 一、功能介绍 string.h头文件定义了一系列用于操作字符串和内存的函数。这些函数可以分为几个…...
从规则到神经网络:机器翻译技术的演进与未来展望
从规则到神经网络:机器翻译技术的演进与未来展望 引言 还记得早些年用翻译软件翻译一句简单的英文句子,却发现翻译结果让人啼笑皆非的日子吗?从“我喜欢吃苹果”被翻译成“我喜欢吃苹果电脑”,到今天的神经网络机器翻译(Neural Machine Translation, NMT)能够生成语义流…...
园区管理智能化创新引领企业效能提升与风险控制新趋势
内容概要 在现代园区管理中,智能化创新正成为越来越多企业优化效能和控制风险的重要途径。通过引入先进的技术手段,企业能够更高效地管理资源,并实现全面的风险控制。 首先,园区管理系统的基本概念和发展现状让我们看到科技与管…...
Python爬虫之——Cookie存储器
目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 &…...
第21节课:前端构建工具—自动化与模块化的利器
目录 前端构建工具的重要性任务运行器:Gulp与GruntGulpGulp的工作原理安装与使用Gulp GruntGrunt的工作原理安装与使用Grunt 模块打包器:WebpackWebpack简介Webpack的工作原理安装与使用Webpack 实践:使用Gulp和Webpack构建前端项目示例&…...
企业SaaS(软件即服务)行业中AARRR
获取(Acquisition) 通过各种渠道吸引用户。 社交媒体广告:Facebook、Instagram等平台的广告。 内容营销:通过博客、视频等吸引用户。 SEO优化:提高网站在搜索引擎中的排名。 合作营销:与其他企业合作进行交…...
为什么要学习rust
内存管理:对于我来说,我就喜欢它的内存管理。我做了一个webapi,取100万行数据,导出到xlsx,再把这个xlsx文件发送给前端。分别用了java、c#、go和rust进行了相同的操作。只有rust做到了,启动时8MB内存&#…...
观察者模式和订阅发布模式的关系
有人把观察者模式等同于发布订阅模式,也有人认为这两种模式存在差异,本质上就是调度的方法不同。 发布订阅模式: 观察者模式: 相比较,发布订阅将发布者和观察者之间解耦。(发布订阅有调度中心处理)...
基于STM32的智能温控花盆设计
目录 引言系统设计 硬件设计软件设计 系统功能模块 空气质量传感器模块数据处理与分析模块实时显示与用户交互模块报警与提示模块远程监控与数据上传模块 控制算法 空气质量数据处理与分析算法异常检测与报警算法数据上传与历史数据回溯算法 代码实现 空气质量检测与数据处理代…...
OpenAI-Edge-TTS:本地化 OpenAI 兼容的文本转语音 API,免费高效!
文本转语音(TTS)技术已经成为人工智能领域的重要一环,无论是语音助手、教育内容生成,还是音频文章创作,TTS 工具都能显著提高效率。今天要为大家介绍的是 OpenAI-Edge-TTS,一款基于 Microsoft Edge 在线文本…...
P4681 [THUSC 2015] 平方运算 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an) 和常数 p p p ,有 m m m 个操作,分以下两种: modify ( l , r ) \operatorname{modify}(l,r) modify(l,r):对每个 i ∈ [ …...
【apt源】RK3588 平台ubuntu20.04更换apt源
RK3588芯片使用的是aarch64架构,因此在Ubuntu 20.04上更换apt源时需要使用针对aarch64架构的源地址。以下是针对RK3588芯片在Ubuntu 20.04上更换apt源到清华源的正确步骤: 步骤一:打开终端 在Ubuntu 20.04中,按下Ctrl Alt T打…...
Angular 2 表单深度解析
Angular 2 表单深度解析 引言 Angular 2作为现代前端开发的框架之一,以其灵活性和强大的功能赢得了众多开发者的青睐。在Angular 2中,表单处理是其中一个重要且复杂的部分。本文将深入解析Angular 2的表单,从基础知识到高级应用,旨在帮助开发者更好地理解和运用Angular 2…...
PHP 7 新特性
PHP 7 新特性 引言 PHP 作为一种广泛使用的服务器端脚本语言,自1995年诞生以来,已经经历了多个版本的迭代。PHP 7 是 PHP 的发展历程中的一个重要里程碑,它带来了许多新特性和改进,旨在提高性能、增强安全性和简化开发过程。本文将详细介绍 PHP 7 的新特性,帮助开发者更…...
vim如何解决‘’文件非法关闭后,遗留交换文件‘’的问题
过程描述: 由于我修改文件时(一定得修改了文件,不做任何修改不会产生这个问题)的非法关闭,比如直接关闭虚拟机,或者直接断开远程工具的远程连接,产生了以下遗留交换文件的问题: 点击…...
【练习】树形dp
G. Group Homework time limit per test: 3 s memory limit per test: 512 MB input: standard input output: standard output No, we don’t want group homework. It’s the place where KaTeX parse error: Expected EOF, got & at position 7: 1 1 &̲lt; 1 …...
Mybatis是如何进行分页的?
大家好,我是锋哥。今天分享关于【Mybatis是如何进行分页的?】面试题。希望对大家有帮助; Mybatis是如何进行分页的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 实现分页的方式有很多种,最常见…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
