当前位置: 首页 > news >正文

【QT】- QUdpSocket

QUdpSocket 是 Qt 自带的一个类,属于 Qt 网络模块,用于进行 UDP(用户数据报协议) 通信。它提供了简便的接口来发送和接收 UDP 数据报(datagrams)。

UDP 是一种无连接的协议,适用于那些不需要确保数据可靠性和顺序的应用场景,比如实时游戏、流媒体、DNS 请求等。

  1. QUdpSocket 概述
    QUdpSocket 继承自 QAbstractSocket,可以用于进行基于 UDP 协议的数据发送和接收。
    它支持异步和同步操作,可以在发送和接收数据时使用事件驱动的机制。
    常用于客户端和服务器模型之间的通信。
  2. 常见操作
    发送数据
    接收数据
    绑定端口
    连接到远程地址和端口
  3. 使用 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();
}
  1. 总结
    QUdpSocket 是 Qt 提供的一个用于进行 UDP 通信的类。
    你可以使用 writeDatagram() 方法来发送数据,通过 readyRead() 信号和 readDatagram() 方法来接收数据。
    要接收数据,必须将 QUdpSocket 绑定到一个本地端口,通常通过 bind() 方法来完成。
    UDP 是无连接的协议,适用于那些对实时性要求高、但不需要完全可靠性的应用场景。

相关文章:

【QT】- QUdpSocket

QUdpSocket 是 Qt 自带的一个类&#xff0c;属于 Qt 网络模块&#xff0c;用于进行 UDP&#xff08;用户数据报协议&#xff09; 通信。它提供了简便的接口来发送和接收 UDP 数据报&#xff08;datagrams&#xff09;。 UDP 是一种无连接的协议&#xff0c;适用于那些不需要确…...

性能测试丨分布式性能监控系统 SkyWalking

软件测试领域&#xff0c;分布式系统的复杂性不断增加&#xff0c;如何保证应用程序的高可用性与高性能&#xff0c;这是每一个软件测试工程师所面临的重大挑战。幸运的是&#xff0c;现在有了一些强大的工具来帮助我们应对这些挑战&#xff0c;其中之一便是Apache SkyWalking。…...

SQL GROUP BY 详解

SQL GROUP BY 详解 引言 在数据库查询中,GROUP BY 子句是一个非常有用的工具,它允许我们对查询结果进行分组,并基于这些分组进行聚合计算。本文将详细介绍 GROUP BY 的用法、注意事项以及在实际应用中的场景。 什么是 GROUP BY? GROUP BY 子句用于对查询结果进行分组。…...

C语言中string.h头文件功能介绍

在C语言的世界里&#xff0c;string.h头文件提供了许多用于处理字符串和内存操作的函数。今天&#xff0c;我们就来深入探讨string.h头文件的功能、使用注意事项以及一些拓展应用。 一、功能介绍 string.h头文件定义了一系列用于操作字符串和内存的函数。这些函数可以分为几个…...

从规则到神经网络:机器翻译技术的演进与未来展望

从规则到神经网络:机器翻译技术的演进与未来展望 引言 还记得早些年用翻译软件翻译一句简单的英文句子,却发现翻译结果让人啼笑皆非的日子吗?从“我喜欢吃苹果”被翻译成“我喜欢吃苹果电脑”,到今天的神经网络机器翻译(Neural Machine Translation, NMT)能够生成语义流…...

园区管理智能化创新引领企业效能提升与风险控制新趋势

内容概要 在现代园区管理中&#xff0c;智能化创新正成为越来越多企业优化效能和控制风险的重要途径。通过引入先进的技术手段&#xff0c;企业能够更高效地管理资源&#xff0c;并实现全面的风险控制。 首先&#xff0c;园区管理系统的基本概念和发展现状让我们看到科技与管…...

Python爬虫之——Cookie存储器

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——> 一晌小贪欢的博客主页求关注 &…...

第21节课:前端构建工具—自动化与模块化的利器

目录 前端构建工具的重要性任务运行器&#xff1a;Gulp与GruntGulpGulp的工作原理安装与使用Gulp GruntGrunt的工作原理安装与使用Grunt 模块打包器&#xff1a;WebpackWebpack简介Webpack的工作原理安装与使用Webpack 实践&#xff1a;使用Gulp和Webpack构建前端项目示例&…...

企业SaaS(软件即服务)行业中AARRR

获取&#xff08;Acquisition&#xff09; 通过各种渠道吸引用户。 社交媒体广告&#xff1a;Facebook、Instagram等平台的广告。 内容营销&#xff1a;通过博客、视频等吸引用户。 SEO优化&#xff1a;提高网站在搜索引擎中的排名。 合作营销&#xff1a;与其他企业合作进行交…...

为什么要学习rust

内存管理&#xff1a;对于我来说&#xff0c;我就喜欢它的内存管理。我做了一个webapi&#xff0c;取100万行数据&#xff0c;导出到xlsx&#xff0c;再把这个xlsx文件发送给前端。分别用了java、c#、go和rust进行了相同的操作。只有rust做到了&#xff0c;启动时8MB内存&#…...

观察者模式和订阅发布模式的关系

有人把观察者模式等同于发布订阅模式&#xff0c;也有人认为这两种模式存在差异&#xff0c;本质上就是调度的方法不同。 发布订阅模式: 观察者模式: 相比较&#xff0c;发布订阅将发布者和观察者之间解耦。&#xff08;发布订阅有调度中心处理&#xff09;...

基于STM32的智能温控花盆设计

目录 引言系统设计 硬件设计软件设计 系统功能模块 空气质量传感器模块数据处理与分析模块实时显示与用户交互模块报警与提示模块远程监控与数据上传模块 控制算法 空气质量数据处理与分析算法异常检测与报警算法数据上传与历史数据回溯算法 代码实现 空气质量检测与数据处理代…...

OpenAI-Edge-TTS:本地化 OpenAI 兼容的文本转语音 API,免费高效!

文本转语音&#xff08;TTS&#xff09;技术已经成为人工智能领域的重要一环&#xff0c;无论是语音助手、教育内容生成&#xff0c;还是音频文章创作&#xff0c;TTS 工具都能显著提高效率。今天要为大家介绍的是 OpenAI-Edge-TTS&#xff0c;一款基于 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 &#xff0c;有 m m m 个操作&#xff0c;分以下两种&#xff1a; modify ⁡ ( l , r ) \operatorname{modify}(l,r) modify(l,r)&#xff1a;对每个 i ∈ [ …...

【apt源】RK3588 平台ubuntu20.04更换apt源

RK3588芯片使用的是aarch64架构&#xff0c;因此在Ubuntu 20.04上更换apt源时需要使用针对aarch64架构的源地址。以下是针对RK3588芯片在Ubuntu 20.04上更换apt源到清华源的正确步骤&#xff1a; 步骤一&#xff1a;打开终端 在Ubuntu 20.04中&#xff0c;按下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如何解决‘’文件非法关闭后,遗留交换文件‘’的问题

过程描述&#xff1a; 由于我修改文件时&#xff08;一定得修改了文件&#xff0c;不做任何修改不会产生这个问题&#xff09;的非法关闭&#xff0c;比如直接关闭虚拟机&#xff0c;或者直接断开远程工具的远程连接&#xff0c;产生了以下遗留交换文件的问题&#xff1a; 点击…...

【练习】树形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是如何进行分页的?

大家好&#xff0c;我是锋哥。今天分享关于【Mybatis是如何进行分页的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Mybatis是如何进行分页的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 实现分页的方式有很多种&#xff0c;最常见…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...