Qt(三):udp组播的发送与接收

1. 创建UDP套接字
使用QUdpSocket类创建一个UDP套接字。

    udpSend=new QUdpSocket(this);udpRece=new QUdpSocket(this);


2. 绑定套接字
绑定套接字到一个本地地址和端口。可以使用bind()函数来完成。
如果要在组播中发送数据,可以将套接字绑定到一个通配符地址(如QHostAddress::Any)和指定的端口上。

void MainWindow::on_pBt_joinGroup_clicked()
{QString IP_Group=ui->lineEdit_groupAddr->text();//获取组播地址groupAddr=QHostAddress(IP_Group);quint16 groupPort=ui->lineEdit_goupPort->text().toInt();//获取组播端口if(udpRece->bind(QHostAddress::AnyIPv4,groupPort,QUdpSocket::ShareAddress)){//绑定地址udpRece->joinMulticastGroup(groupAddr);//加入组播ui->plainTextEdit->appendPlainText("**加入组播成功");ui->plainTextEdit->appendPlainText("**组播IP地址:"+IP_Group);ui->plainTextEdit->appendPlainText("**绑定端口:"+QString::number(groupPort));ui->pBt_joinGroup->setEnabled(false);ui->pBt_exitGroup->setEnabled(true);}
}


3. 加入组播组
使用joinMulticastGroup()函数将套接字加入到指定的组播组中。
该函数需要指定组播组的地址和接口地址。

udpRece->joinMulticastGroup(groupAddr);//加入组播


4. 发送数据
使用writeDatagram()函数发送组播数据。
需要指定要发送的数据、目标地址(即组播组的地址)和端口号。

//发送组播
void MainWindow::sendUdpMess(){quint16 groupPort=ui->lineEdit_goupPort->text().toInt();//获取组播端口QString mesage=ui->lineEdit->text();//读取发送信息QByteArray sendMess=mesage.toUtf8();//将发送的信息转化为字节流udpSend->writeDatagram(sendMess,groupAddr,groupPort);//将待发送信息写入udp通信中ui->plainTextEdit->appendPlainText("[发送端:]"+mesage);//发送信息显示}


5. 接收数据
当套接字收到组播数据时,会发出readyRead()信号。
在槽函数中,可以使用readDatagram()函数来读取接收到的数据报的内容、源地址和端口号。

//接收组播信息
void MainWindow::receUdpMess(){while (udpRece->hasPendingDatagrams()){QByteArray receData;//创建接收字节流QHostAddress peerAddr;//接收地址quint16 peerPort;//接收端口quint16 size=udpRece->pendingDatagramSize();//读取接收udp数据大小receData.resize(size);//重设接收字节流大小udpRece->readDatagram(receData.data(),receData.size(),&peerAddr,&peerPort);//读取以太网发送端的udp数据QString peer="[From]+"+peerAddr.toString()+":"+QString::number(peerPort)+"]";//读取发送端地址、端口ui->plainTextEdit->appendPlainText(peer+receData.data());//将接收内容显示在文本框中}
}

完整代码如下:

一、主cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);udpSend=new QUdpSocket(this);udpRece=new QUdpSocket(this);udpRece->setSocketOption(QAbstractSocket::MulticastTtlOption,1);connect(udpRece,&QUdpSocket::readyRead,this,&MainWindow::receUdpMess);//连接读取udp通信数据
}MainWindow::~MainWindow()
{delete ui;
}//接收组播信息
void MainWindow::receUdpMess(){while (udpRece->hasPendingDatagrams()){QByteArray receData;//创建接收字节流QHostAddress peerAddr;//接收地址quint16 peerPort;//接收端口quint16 size=udpRece->pendingDatagramSize();//读取接收udp数据大小receData.resize(size);//重设接收字节流大小udpRece->readDatagram(receData.data(),receData.size(),&peerAddr,&peerPort);//读取以太网发送端的udp数据QString peer="[From]+"+peerAddr.toString()+":"+QString::number(peerPort)+"]";//读取发送端地址、端口ui->plainTextEdit->appendPlainText(peer+receData.data());//将接收内容显示在文本框中}
}//发送组播
void MainWindow::sendUdpMess(){quint16 groupPort=ui->lineEdit_goupPort->text().toInt();//获取组播端口QString mesage=ui->lineEdit->text();//读取发送信息QByteArray sendMess=mesage.toUtf8();//将发送的信息转化为字节流udpSend->writeDatagram(sendMess,groupAddr,groupPort);//将待发送信息写入udp通信中ui->plainTextEdit->appendPlainText("[发送端:]"+mesage);//发送信息显示}//加入组播
void MainWindow::on_pBt_joinGroup_clicked()
{QString IP_Group=ui->lineEdit_groupAddr->text();//获取组播地址groupAddr=QHostAddress(IP_Group);quint16 groupPort=ui->lineEdit_goupPort->text().toInt();//获取组播端口if(udpRece->bind(QHostAddress::AnyIPv4,groupPort,QUdpSocket::ShareAddress)){//绑定地址udpRece->joinMulticastGroup(groupAddr);//加入组播ui->plainTextEdit->appendPlainText("**加入组播成功");ui->plainTextEdit->appendPlainText("**组播IP地址:"+IP_Group);ui->plainTextEdit->appendPlainText("**绑定端口:"+QString::number(groupPort));ui->pBt_joinGroup->setEnabled(false);ui->pBt_exitGroup->setEnabled(true);}
}//退出组播
void MainWindow::on_pBt_exitGroup_clicked()
{udpRece->leaveMulticastGroup(groupAddr);//退出组播udpRece->abort();//解除绑定ui->plainTextEdit->appendPlainText("**已退出组播");ui->pBt_exitGroup->setEnabled(false);ui->pBt_joinGroup->setEnabled(true);sendTimer->stop();
}//清空文本框
void MainWindow::on_pBt_clearText_clicked()
{ui->plainTextEdit->clear();
}//退出
void MainWindow::on_pBt_exit_clicked()
{this->close();
}//发送信息
void MainWindow::on_pushButton_clicked()
{sendTimer=new QTimer(this);connect(sendTimer,&QTimer::timeout,this,&MainWindow::sendUdpMess);sendTimer->start(1000);//一秒发一次
}

二、头文件(.h)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QUdpSocket>
#include <QTimer>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pBt_joinGroup_clicked();void on_pBt_exitGroup_clicked();void on_pBt_clearText_clicked();void on_pBt_exit_clicked();void receUdpMess();//接收组播信息void sendUdpMess();//发送信息void on_pushButton_clicked();private:Ui::MainWindow *ui;QUdpSocket *udpRece;QUdpSocket *udpSend;QHostAddress groupAddr;QTimer *sendTimer;};
#endif // MAINWINDOW_H

运行结果:

源代码放在如下链接中,需要的点击获取:

udp组播发送与接收icon-default.png?t=N7T8https://download.csdn.net/download/weixin_51631044/88692407

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/592102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu安全重启方法

装Ubuntu系统时&#xff0c;经常会遇到各种各样的问题导致系统崩溃、卡死、黑屏等情况&#xff0c;新手或者小白可能直接选择长按电源键强制重启了 建议不要长按电源强制重启&#xff0c;很有可能会损坏磁盘文件&#xff0c;如果硬重启的时候&#xff0c;硬件还在读写数据的话&…

uniapp中uview组件丰富的Code 验证码输入框的使用方法

目录 基本使用 #自定义提示语 #保持倒计时 API #Props #Methods #Event 基本使用 通过ref获取组件对象&#xff0c;再执行后面的操作&#xff0c;见下方示例。 通过seconds设置需要倒计的秒数(默认60)通过ref调用组件内部的start方法&#xff0c;开始倒计时通过监听cha…

智慧旅游手机APP开发解决方案

我国的旅游市场已经逐渐地走向饱和&#xff0c;想要发展&#xff0c;就必须要寻求新的发展模式。本项目就是抓住贵州的交通飞速发展的契机&#xff0c;以高速为主线&#xff0c;高速周边的景点、酒店为依托&#xff0c;高速维修为辅线&#xff0c;借助今天得到广泛应用的智能移…

SpringBoot整合多数据源,并支持动态新增与切换

SpringBoot整合多数据源&#xff0c;并支持动态新增与切换 一、概述 在项目的开发过程中&#xff0c;遇到了需要从数据库中动态查询新的数据源信息并切换到该数据源做相应的查询操作&#xff0c;这样就产生了动态切换数据源的场景。为了能够灵活地指定具体的数据库&#xff0…

【深度学习:SENet】信道注意力和挤压激励网络(SENet):图像识别的新突破

【深度学习&#xff1a;SENet】信道注意力和挤压激励网络&#xff08;SENet&#xff09;&#xff1a;图像识别的新突破 为什么有效如何实现工作原理应用案例 挤压和激励网络&#xff08;SENets&#xff09;为卷积神经网络&#xff08;CNN&#xff09;引入了一个新的构建模块&am…

2024年1月1日答案

a)i. V B B V C C 16 V V_{BB} V_{CC} 16V VBB​VCC​16V R t h R B R E R B R E 10 k Ω 3 k Ω 10 k Ω 3 k Ω ≈ 2.31 k Ω R_{th} \frac{R_B \times R_E}{R_B R_E} \frac{10k\Omega \times 3k\Omega}{10k\Omega 3k\Omega} \approx 2.31k\Omega Rth​RB​R…

Web网页开发-盒模型-笔记

1.CSS的三种显示方式 (1)块级元素:标签所占区域默认为一行 特点&#xff1a;一行一个 可设宽高 (2)行内元素&#xff1a;标签所占区域由内容顶开&#xff0c;行内元素无法使用text-align 特点&#xff1a;一行多个 不可设宽高&#xff0c;margin上下和padding上下都不能改变位…

克服幻觉:提升语言模型在自然语言处理中的准确性与可靠性

随着语言模型&#xff08;LLM&#xff09;在自然语言处理&#xff08;NLP&#xff09;中的应用日益普及&#xff0c;它们在文本生成、机器翻译、情感分析等许多任务中展现出惊人的能力。然而&#xff0c;这些模型也常常显示出一个被称作“幻觉”&#xff08;hallucination&…

扫拖一体机哪个牌子好用?2024旗舰洗地机总结

近年来&#xff0c;家庭清洁的方式发生了翻天覆地的变化。在这场前所未有的洗地机创新浪潮中&#xff0c;消费者们迎来了更为便捷高效的家庭清洁解决方案。然而&#xff0c;随着市场竞争的激烈&#xff0c;面对众多品牌和型号的家用洗地机&#xff0c;究竟哪款扫拖一体机好用呢…

实现区域地图散点图效果,vue+echart地图+散点图

需求&#xff1a;根据后端返回的定位坐标数据实现定位渲染 1.效果图 2.准备工作,在main.js和index.js文件中添加以下内容 main.js app.use(BaiduMap, {// ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */ak: sRDDfAKpCSG5iF1rvwph4Q95M…

在spring boot中集成druid的数据监控页面

参考例子见这里&#xff0c;亲测有效&#xff01; 核心就是要加入下面的配置code Configuration public class DruidDataMonitorConfig {Beanpublic ServletRegistrationBean statViewServlet() {ServletRegistrationBean bean new ServletRegistrationBean(new StatViewServ…

使用 go-elasticsearch v8 基本请求

使用 go-elasticsearch 请求示例 你可以通过参考Go 官方文档找到简单的示例&#xff0c;所以我认为先看看这个是个好主意。 连接客户端有两种方式&#xff0c;如下图。 至于两者的特点&#xff0c;TypedClient有类型&#xff0c;更容易编写&#xff0c;但文档较少。另外&…

以 RoCE+软件定义存储同时实现信创转型与架构升级

目前&#xff0c;不少企业数据中心使用 FC 交换机和集中式 SAN 存储&#xff08;以下简称“FC-SAN 架构”&#xff09;&#xff0c;支持核心业务系统、数据库、AI/ML 等高性能业务场景。而在开展 IT 基础架构信创转型时&#xff0c;很多用户受限于国外交换机&#xff1a;FC 交换…

往期精彩推荐

所有的内容都在这个博客中&#xff0c;此博客为推广导航博客&#xff0c;过后会删掉https://blog.csdn.net/weixin_41620184/article/details/135042416 往期精彩&#xff1a;快来学习吧~~~ 机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归PySpark大数据处…

SVM 保存和加载模型参数

在 Python 中&#xff0c;你可以使用 scikit-learn 库中的 joblib 或 pickle 模块来保存和加载 SVM 模型的参数。以下是一个简单的示例代码&#xff0c;演示了如何使用 joblib 模块保存和加载 SVM 模型的参数&#xff1a; 保存模型参数&#xff1a; from sklearn import svm …

向日葵远程工具安装Mysql的安装与配置

目录 一、向日葵远程工具安装 1.1 简介 1.2 下载地址 二、Mysql 5.7 安装与配置 2.1 简介 2.2 安装 2.3 初始化mysql服务端 2.4 启动mysql服务 2.5 登录mysql 2.6 修改密码 2.7 设置外部访问 三、思维导图 一、向日葵远程工具安装 1.1 简介 向日葵远程控制是一款用…

VS2017 搭建opencv工程

VS2017 搭建opencv工程 opencv在处理图像方面具有很强的能力&#xff0c;在使用opencv之前先需要造好轮子。 1、opencv 官网 &#xff0c;下载对应的资源文件包。 根据自身选择。下载包之后&#xff0c;解压。分为build和sources source目录下分别存放&#xff1a; modules: …

侯捷C++ 2.0 新特性

关键字 nullptr and std::nullptr_t auto 一致性初始化&#xff1a;Uniform Initialization 11之前&#xff0c;初始化方法包括&#xff1a;小括号、大括号、赋值号&#xff0c;这让人困惑。基于这个原因&#xff0c;给他来个统一&#xff0c;即&#xff0c;任何初始化都能够…

CSS3设置圆角化

可以使用border-radius属性来设置圆角化 有四个值 分别是&#xff1a;左上 右上 左下 右下 三个值 分别是&#xff1a;左上 右上左下 右下 两个值 分别是&#xff1a;左上右下 右上左下 给单独一角设置圆角化可以使用&#xff1a;border-xxx-xxx-radius 例&#xff1a…

pytorch 转 onnx

ONNX 是目前模型部署中最重要的中间表示之一&#xff0c;在把 PyTorch 模型转换成 ONNX 模型时&#xff0c;使用的 torch 接口是 torch.onnx.export 这里记录了 pytorch 模型转 onnx 时的原理和注意事项&#xff0c;还包括部分 PyTorch 与 ONNX 的算子对应关系。 1 torch.onnx…