QT 中 UDP 的使用
目录
一、UDP 简介
二、QT 中 UDP 编程的基本步骤
(一)包含头文件
(二)创建 UDP 套接字对象
(三)绑定端口
(四)发送数据
(五)接收数据
三、完整示例代码
(一)发送端代码
(二)接收端代码
四、总结
一、UDP 简介
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议。与 TCP 相比,UDP 在数据传输时不需要建立连接,也不保证数据的可靠传输、顺序到达以及不重复。这使得 UDP 具有较低的开销和较高的传输效率,适用于对实时性要求较高,而对数据准确性要求相对较低的场景,如视频流、音频流传输等。
二、QT 中 UDP 编程的基本步骤
在 QT 框架下进行 UDP 编程,主要涉及以下几个关键步骤。
(一)包含头文件
首先,在源文件中需要包含QUdpSocket头文件,它提供了 UDP 套接字的功能实现。
#include <QUdpSocket>
(二)创建 UDP 套接字对象
在需要使用 UDP 的类中,声明一个QUdpSocket类型的成员变量。
class MyUdpClass : public QObject
{Q_OBJECT
public:MyUdpClass(QObject *parent = nullptr);
private:QUdpSocket *udpSocket;
};
在类的构造函数中,初始化这个 UDP 套接字对象。
MyUdpClass::MyUdpClass(QObject *parent) : QObject(parent)
{udpSocket = new QUdpSocket(this);
}
(三)绑定端口
为了能够接收和发送数据,需要将 UDP 套接字绑定到一个特定的端口上。可以使用bind函数进行绑定。
if (!udpSocket->bind(12345))
{qDebug() << "Failed to bind port";return;
}
这里尝试将 UDP 套接字绑定到端口 12345,如果绑定失败,会输出错误信息。
(四)发送数据
使用writeDatagram函数来发送 UDP 数据报。该函数需要指定发送的数据、目标主机的 IP 地址和端口号。
QByteArray data = "Hello, UDP!";
QHostAddress destAddress("192.168.1.100");
quint16 destPort = 54321;
qint64 bytesSent = udpSocket->writeDatagram(data, destAddress, destPort);
if (bytesSent == -1)
{qDebug() << "Failed to send data";
}
这段代码将字符串"Hello, UDP!"发送到目标 IP 地址为192.168.1.100,端口号为 54321 的主机上。如果发送失败,会输出相应的错误信息。
(五)接收数据
为了接收数据,需要连接QUdpSocket的readyRead信号到一个槽函数,当有数据可读时,该槽函数会被调用。
connect(udpSocket, &QUdpSocket::readyRead, this, &MyUdpClass::readPendingDatagrams);
在槽函数readPendingDatagrams中,通过readDatagram函数读取数据。
void MyUdpClass::readPendingDatagrams()
{while (udpSocket->hasPendingDatagrams()){QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());QHostAddress sender;quint16 senderPort;udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);qDebug() << "Received datagram:" << datagram << "from" << sender.toString() << ":" << senderPort;}
}
这段代码会不断读取所有接收到的 UDP 数据报,并输出数据内容、发送方的 IP 地址和端口号。
三、完整示例代码
下面是一个完整的 QT UDP 通信示例代码,包括发送端和接收端。
(一)发送端代码
#include <QCoreApplication>
#include <QUdpSocket>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QUdpSocket udpSocket;QByteArray data = "Hello, UDP from sender!";QHostAddress destAddress("192.168.1.100");quint16 destPort = 54321;qint64 bytesSent = udpSocket.writeDatagram(data, destAddress, destPort);if (bytesSent == -1){qDebug() << "Failed to send data";}else{qDebug() << "Data sent successfully";}return a.exec();
}
(二)接收端代码
#include <QCoreApplication>
#include <QUdpSocket>
#include <QDebug>class UdpReceiver : public QObject
{Q_OBJECT
public:UdpReceiver(QObject *parent = nullptr);
private slots:void readPendingDatagrams();
private:QUdpSocket *udpSocket;
};UdpReceiver::UdpReceiver(QObject *parent) : QObject(parent)
{udpSocket = new QUdpSocket(this);if (!udpSocket->bind(54321)){qDebug() << "Failed to bind port";return;}connect(udpSocket, &QUdpSocket::readyRead, this, &UdpReceiver::readPendingDatagrams);
}void UdpReceiver::readPendingDatagrams()
{while (udpSocket->hasPendingDatagrams()){QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());QHostAddress sender;quint16 senderPort;udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);qDebug() << "Received datagram:" << datagram << "from" << sender.toString() << ":" << senderPort;}
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);UdpReceiver receiver;return a.exec();
}
四、总结
通过以上步骤和示例代码,我们可以在 QT 中实现基本的 UDP 通信功能。在实际应用中,还需要根据具体需求对代码进行优化和扩展,例如处理网络异常、实现更复杂的数据结构传输等。UDP 在实时性要求高的场景中有着广泛的应用,掌握 QT 中 UDP 的编程方法,有助于开发出高效的网络应用程序。
相关文章:

QT 中 UDP 的使用
目录 一、UDP 简介 二、QT 中 UDP 编程的基本步骤 (一)包含头文件 (二)创建 UDP 套接字对象 (三)绑定端口 (四)发送数据 (五)接收数据 三、完整示例代…...

leetcode刷题记录(七十二)——146. LRU 缓存
(一)问题描述 146. LRU 缓存 - 力扣(LeetCode)146. LRU 缓存 - 请你设计并实现一个满足 LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类: * LRUCache(int capacity)…...

深圳大学-计算机系统(3)-实验一MIPS指令集实验
实验目标 a) 了解WinMIPS64的基本功能和作用; b) 熟悉MIPS指令、初步建立指令流水执行的感性认识; c) 掌握该工具的基本命令和操作,为流水线实验作准备。 实验内容 按照下面的实验步骤及说明,完成相关操作记录实验过程的截图&a…...

Java面试专题——面向对象
面向过程和面向对象的区别 面向过程:当事件比较简单的时候,利用面向过程,注重的是事件的具体的步骤/过程,注重的是过程中的具体的行为,以函数为最小单位,考虑怎么做。 面向对象:注重找“参与者…...

知行合一:解决有心无力的问题,解决知易行难的问题,知行合一并不意味着事事都要合一,而是....
问题是什么? 想学习的时候,有手机阻碍我们。想戒掉手机短视频,卸载后,几天的时间,又下载了回来。制定了减肥计划,但就是不执行。明知道这样做是不对的,但依然行动不起来。 沉溺于各种各样的享…...

Qt中自定义信号与槽
在学习信号和槽的时候,我们知道信号一般对应的就是用户的行为,槽指的是接受到信号后的响应,在类内有许多的内置信号和槽函数,能够去实现一些常见的行为,但实际业务开发中,尤其是接受到信号的响应会根据具体…...
.NET 8 项目 Docker 方式部署到 Linux 系统详细操作步骤
本文将详细介绍如何将一个 .NET 8 项目通过 Docker 部署到 Linux 系统中。以下步骤包括从项目的创建、Dockerfile 的编写、镜像构建、到最后在 Linux 上的容器运行。 1. 环境准备 在开始之前,请确保你已经具备以下环境: Linux 系统(如 Ubu…...
深入了解 Java split() 方法:分割字符串的利器
Java 提供的 split() 方法是 String 类中一个常用的工具,它可以将一个字符串根据指定的分隔符切割成多个子字符串,并以字符串数组的形式返回。这个方法常用于字符串的处理、数据解析等场景。本文将详细介绍 Java 中 split() 方法的使用方式,并…...
pgsql中处理数组类型字段
1、代码中存入和读取 需要使用自定义转换器 Slf4j public class ArrayTypeHandler extends BaseTypeHandler<List<String>> {Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType)throws SQL…...
如何正确定位前后端bug?
在平时的开发过程中,正确定位前后端bug是提高开发效率和项目质量的关键。以下是一些实用的方法。 一、前后端bug 特征 前端主要负责显示数据,后端主要负责处理数据、存储数据,前后端主要通过接口进行数据交换。 1.前端bug特征 界面显示类…...

mfc操作json示例
首先下载cJSON,加入项目; 构建工程,如果出现, fatal error C1010: unexpected end of file while looking for precompiled head 在cJSON.c文件的头部加入#include "stdafx.h"; 看情况,可能是加到.h或者是.cpp文件的头部,它如果有包含头文件, #include &…...

【技术总结类】2024,一场关于海量数据治理以及合理建模的系列写作
目录 1.今年的创作路线 2.先说第一条线 2.1.由日志引出的海量文本数据存储和分析问题 2.2.监控以及监控的可视化 2.3.数据量级再往上走牵扯出了大数据 2.4.由大数据牵扯出的JAVA线程高级内容 3.第二条线,也是2025要继续的主线 1.今年的创作路线 今年的写作内…...

Dockerfile另一种使用普通用户启动的方式
基础镜像的Dockerfile # 使用 Debian 11.9 的最小化版本作为基础镜像 FROM debian:11.11# 维护者信息 LABEL maintainer"caibingsen" # 复制自定义的 sources.list 文件(如果有的话) COPY sources.list /etc/apt/sources.list # 创建…...
python的pushbullet库在设备之间发送通知链接文件
Pushbullet 是一个非常方便的 Python 库,可以帮助你在设备之间发送通知、链接、文件等。以下是 Pushbullet 的一些主要功能和使用方法: 功能 与你的 Pushbullet 账户关联的设备(需要下载对应的pushbullet手机APP、电脑客户端)之…...

STM32之FreeRTOS开发介绍(十九)
STM32F407 系列文章 - freertos(十九) 目录 前言 一、简述 二、开源网址 三、原理及功能特性 1.原理简介 2.功能介绍 1.任务调度 2.任务管理 3.中断管理 4.消息队列 3.特点说明 4.优缺点 四、参考书籍 五、实现方式 总结 前言 FreeRTOS是…...

用java配合redis 在springboot上实现令牌桶算法
令牌桶算法配合 Redis 在 Java 中的应用令牌桶算法是一种常用的限流算法,适用于控制请求的频率,防止系统过载。结合 Redis 使用可以实现高效的分布式限流。 一.、引入依赖首先,需要在 pom.xml 文件中引入 spring-boot-starter-data-re…...

DCGAN - 深度卷积生成对抗网络:基于卷积神经网络的GAN
深度卷积生成对抗网络(DCGAN,Deep Convolutional Generative Adversarial Network)是生成对抗网络(GAN)的一种扩展,它通过使用卷积神经网络(CNN)来实现生成器和判别器的构建。与标准…...

51c~SLAM~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12327374 #GSLAM 自动驾驶相关~~~ 一个通用的SLAM架构和基准 GSLAM:A General SLAM Framework and Benchmark 开源代码:https://github.com/zdzhaoyong/GSLAM SLAM技术最近取得了许多成功&am…...
优化使用 Flask 构建视频转 GIF 工具
优化使用 Flask 构建视频转 GIF 工具 优化后的项目概述 在优化后的版本中,我们将实现以下功能: 可设置每个 GIF 的帧率和大小:用户可以选择 GIF 的帧率和输出大小。改进的用户界面:使用更现代的设计使界面更美观、整洁。自定义…...
spring cloud如何实现负载均衡
在Spring Cloud中,实际上并没有直接支持lb:\\这样的URL前缀来自动解析为负载均衡的服务地址。lb:\\这样的表示可能是在某些特定框架、文档或示例中自定义的,但它并不是Spring Cloud官方API或规范的一部分。 Spring Cloud实现负载均衡的方式通常依赖于服…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 时间事件处理部分)
揭秘高效存储模型与数据结构底层实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 时间事件:serverCron函数更新服务器时间缓存更新LRU时钟-lruclock更新服务器每秒执行命令次…...

Langchaine4j 流式输出 (6)
Langchaine4j 流式输出 大模型的流式输出是指大模型在生成文本或其他类型的数据时,不是等到整个生成过程完成后再一次性 返回所有内容,而是生成一部分就立即发送一部分给用户或下游系统,以逐步、逐块的方式返回结果。 这样,用户…...
《操盘实战》速读笔记
文章目录 书籍信息概览第一部分 趋势困惑第二部分 入仓困惑第三部分 止损困惑第四部分 止盈困惑第五部分 资管困惑第六部分 交易系统困惑第七部分 心态困惑 书籍信息 书名:《操盘实战:如何走出股票、期货的交易困境》 作者:张胜波 概览 第…...

【OpenGL学习】(四)统一着色和插值着色
文章目录 【OpenGL学习】(四)统一着色和插值着色统一着色(Flat/Uniform Shading)插值着色(Interpolated Shading) 【OpenGL学习】(四)统一着色和插值着色 着色器介绍: h…...

【知识点】第7章:文件和数据格式化
文章目录 知识点整理文件概述文件的打开和关闭文件的读操作文件的写操作 练习题填空题选择题 知识点整理 文件概述 文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容。概念上,文件是数据的集合和抽象,类似地,函…...

06-排序
排序 1. 排序的概念及其应用 1.1 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键…...

华为OD机试真题——告警抑制(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

C++——智能指针 unique_ptr
unique_ptr的实现原理:简单粗暴的防拷贝 目录 一、使用C11中的新用法unique_ptr 二、使用c11模拟实现 三、使用c98特性实现 四、模拟实现unique_ptr 五、发现问题 一、使用C11中的新用法unique_ptr 由于限制了拷贝以及赋值 导致缺陷:unique_ptr管理…...
Cursor 工具项目构建指南:Java 21 环境下的 Spring Boot Prompt Rules 约束
简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 Cursor 工具项目构建指南:Java 21 环境下的 Spring Boot Prompt Rules 约束前言项目简…...

Linux kill 暂停命令
暂停进程 kill -19 在一台服务器上部署了360Pika服务,先用RedisClient连接一下,可以连接 现在暂停进程 暂停后发现再次连接无法连接 恢复进程 kill -18 恢复后可连接...