news 2026/5/30 19:39:03

QUdpSocket---单播

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
QUdpSocket---单播

Qt发个UDP消息,实打实得就两步:

1)创建QUdpSocket

2)发消息

就是这么滴简单,相比纯用C/C++来写,简直简化了太多。

01 搞个UDP服务

void DialogUdpSocket::startUdpServer() { server_ = new QUdpSocket(this); connect(server_, &QUdpSocket::readyRead, this, [this]{ auto datagram = server_->receiveDatagram(); ui->plainTextEdit_serv->appendPlainText( QString("recv ip:%1 port:%2 msg:%3") .arg(datagram.senderAddress().toString()) .arg(datagram.senderPort()) .arg(QString(datagram.data())) ); //回复 QNetworkDatagram d; d.setDestination(datagram.senderAddress(), datagram.senderPort()); d.setData("收到!"); server_->writeDatagram(d); }); connect(server_, QOverload<QAbstractSocket::SocketError>::of(&QUdpSocket::error), this, [](QAbstractSocket::SocketError err){ qDebug() << err; }); bool ret = server_->bind(QHostAddress::AnyIPv4, 8888); ui->plainTextEdit_serv->appendPlainText(QString("端口绑定结果:%1").arg(ret?"成功":"失败")); ui->plainTextEdit_serv->appendPlainText(QString("本地端口:%1").arg(server_->localPort())); }

程序一运行就调用这个函数启动UDP服务,看代码是写了这么多,关键就两步,

server_ = new QUdpSocket(this);

创建UDP

server_->bind(QHostAddress::AnyIPv4, 8888);

绑定到本地IP的8888端口上

其它都是打辅助,草丛中插眼的。

这个UDP服务主要干一件事情:

收到消息回OK:

1、连接readyRead信号,有消息过来时,这个信号就会触发。

2、receiveDatagram() 读取消息的内容,包括发送者的ip、端口信息。

3、然后回复它“收到!”就完了。

02 无连接udp

//客户端发送 void DialogUdpSocket::on_pushButton_send_clicked() { //创建 if(client_ == nullptr) { client_ = new QUdpSocket(this); connect(client_, &QUdpSocket::readyRead, this, [this]{ auto datagram = client_->receiveDatagram(); ui->plainTextEdit_client->appendPlainText( QString("serv reply: %1").arg(QString(datagram.data())) ); }); connect(client_, &QUdpSocket::stateChanged, this, [](QAbstractSocket::SocketState socketState){ qDebug() << socketState; }); } //发送一个消息 QString msg = ui->lineEdit_send->text(); client_->writeDatagram(msg.toUtf8(), QHostAddress::LocalHost, 8888); ui->plainTextEdit_client->appendPlainText(QString("send msg: %1").arg(msg)); }

1)创建一个QUdpSocket

2) writeDatagram 发送消息给上面的UDP服务

看下咱们做好的示例:

代码本豆故意连接stateChanged信号

看下它的打印:

就是说,

虽然我们没给客户端udp做端口绑定,

但是客户端在发消息会自动绑定一个端口。

示例中是绑定到52040端口上了,

这是系统随机给udp分配的一个可用端口。

作为一个发送客户端,

通常情况下还真就不需要显式绑定端口,

需要显式绑定的一般是服务端。

总不能让服务端的端口随机绑定吧,

那客户端在这六万个端口里可不知道,

哪个是自家的服务了。

03 有连接udp

把前面的客户端代码改改:

改动一:创建好socket后直接去连接服务端

改动二:用write发送消息

看看还能不能发送消息:

眉毛冰!

有连接的UDP,

1)显而易见的好处:

发消息时就不用再去指定目标IP和端口!

2)还有个好处是:

它能略微提升些性能!

首先需要说明的是,

UDP的连接只是虚拟的连接,

或者叫逻辑上的连接,

与服务端并无真实连接。

逻辑连接是让系统记录下通信双方,

节省系统对IP和端口的解析流程,

还能过滤掉无关数据包,减少无效数据的处理。

举个栗子:

TFTP是简单文件传输协议,

使用UDP进行传输。

所以在TFTP协议下收发文件,

用有连接的方式稳定性和效率上会更高些。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 23:52:22

CLIP多模态匹配:TensorFlow双塔模型构建

CLIP多模态匹配&#xff1a;TensorFlow双塔模型构建 在电商搜索、内容推荐和智能客服等实际场景中&#xff0c;用户常常希望用一段自然语言描述去查找对应的图像——比如“一件红色的复古连衣裙”或“一只正在奔跑的金毛犬”。传统的基于标签或OCR的方法难以理解这种抽象语义&a…

作者头像 李华
网站建设 2026/5/28 15:07:43

用WOA-DELM实现回归预测:基于鲸鱼优化算法与深度极限学习机的结合

一种鲸鱼优化算法优化深度极限学习机DELM中的各极限学习机中自动编码器的输入权重与偏置&#xff0c;建立WOA-DELM回归预测模型&#xff0c;多输入单输出模型&#xff0c;时间窗法&#xff0c;代码注释清晰&#xff0c;替换数据简单&#xff0c;只需替换自己的excel或者csv数据…

作者头像 李华
网站建设 2026/5/28 21:50:38

python工程项目任务分配管理系统_q6ij795l

目录已开发项目效果实现截图开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 python工程项目任务分配管理系统_q6ij795l 开发技术路线…

作者头像 李华
网站建设 2026/5/28 22:57:16

python教学管理自动化系统设计与实现 大学课程课表管理系统_54r67p9b

目录已开发项目效果实现截图开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 python教学管理自动化系统设计与实现 大学课程课表管理系统_5…

作者头像 李华
网站建设 2026/5/28 20:00:30

物联网毕设 stm32的火灾监控与可视化系统(源码+硬件+论文)

文章目录 0 前言1 主要功能2 硬件设计(原理图)3 核心软件设计4 实现效果5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉…

作者头像 李华
网站建设 2026/5/28 21:07:05

Theano遗产继承者:TensorFlow的历史使命

TensorFlow&#xff1a;从Theano的遗产到AI工业化的引擎 在深度学习刚刚崭露头角的年代&#xff0c;研究者们常常需要手动推导梯度、用C写GPU内核&#xff0c;甚至为每一个矩阵乘法操作分配显存。那时&#xff0c;一个能自动求导、支持符号计算的工具无异于“解放生产力”的钥匙…

作者头像 李华