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

news2024/11/19 17:36:19

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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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.coloradmin.cn/o/1351626.html

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

相关文章

【CASS精品教程】CASS11计算城镇建筑密度

CASS中可以很方便计算建筑密度。 文章目录 一、建筑密度介绍二、CASS计算建筑密度1. 绘制宗地范围2. 绘制建筑物3. 计算建筑密度三、注意事项一、建筑密度介绍 建筑密度(building density;building coverage ratio),指在一定范围内,建筑物的基底面积总和与占用地面积的比…

计算机网络-以太网交换基础

一、网络设备的演变 最初的网络在两台设备间使用传输介质如网线等进行连接就可以进行通信。但是随着数据的传输需求&#xff0c;多个设备需要进行数据通信时就需要另外的设备进行网络互联&#xff0c;并且随着网络传输的需求不断更新升级。从一开始的两台设备互联到企业部门内部…

【OpenCV】在MacOS上源码编译OpenCV

在MacOS上源码编译OpenCV 1. 下载项目源码2. 创建CMake编译文件3. 编译安装4. 案例测试5. 总结 前言 在做视觉任务时&#xff0c;我们经常会用到开源视觉库OpenCV&#xff0c;OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件…

Spring技术内幕笔记之IOC的实现

IOC容器的实现 依赖反转&#xff1a; 依赖对象的获得被反转了&#xff0c;于是依赖反转更名为&#xff1a;依赖注入。许多应用都是由两个或者多个类通过彼此的合作来实现业务逻辑的&#xff0c;这使得每个对象都需要与其合作的对象的引用&#xff0c;如果这个获取过程需要自身…

Java学习苦旅(十六)——List

本篇博客将详细讲解Java中的List。 文章目录 预备知识——初识泛型泛型的引入泛型小结 预备知识——包装类基本数据类型和包装类直接对应关系装包与拆包 ArrayList简介ArrayList使用ArrayList的构造ArrayList常见操作ArrayList遍历 结尾 预备知识——初识泛型 泛型的引入 我…

WebStorm 创建一个Vue项目(1)

一、下载并安装WebStorm 步骤一 步骤二 选择激活方式 激活码&#xff1a; I2A0QUY8VU-eyJsaWNlbnNlSWQiOiJJMkEwUVVZOFZVIiwibGljZW5zZWVOYW1lIjoiVU5JVkVSU0lEQURFIEVTVEFEVUFMIERFIENBTVBJTkFTIiwiYXNzaWduZWVOYW1lIjoiVGFvYmFv77yaSkVU5YWo5a625qG25rAIOa0uW3peS9nOWup…

json解析本地数据,使用JSONObject和JsonUtility两种方法。

json解析丨网址、数据、其他信息 文章目录 json解析丨网址、数据、其他信息介绍一、文中使用了两种方法作为配置二、第一种准备2.代码块 二、第二种总结 介绍 本文可直接解析本地json信息的功能示例&#xff0c;使用JSONObject和JsonUtility两种方法。 一、文中使用了两种方法…

R语言——R函数、选项参数、数学统计函数(六)

目录 一、R函数 二、选项参数 三、数学统计函数 四、参考 一、R函数 1.lm() lm()是R语言中经常用到的函数&#xff0c;用来拟合回归模型。它是拟合线性模型最基本的函数 lm()格式如下&#xff1a; fit<-lm(formula,data) 其中&#xff0c;formula指要拟合的模型形式…

【QT 自研上位机 与 ESP32下位机联调>>>串口控制GPIO-基础样例-联合文章】

【QT 自研上位机 与 ESP32下位机联调&#xff1e;&#xff1e;&#xff1e;串口控制GPIO-基础样例-联合文章】 1、概述2、实验环境3、 自我总结4、 实验过程1、验证上位机QT程序1、下载样例代码2、修改qt程序3、运行测试验证 2、验证下位机ESP32程序1、下载样例代码2、更改ESP3…

Ubuntu18 安装chatglm2-6b

记了下Ubuntu18 上安装chatglm2-6遇到的问题。 环境&#xff1a;Ubuntu18.04 V100(显卡) nvcc 11.6 显卡驱动cudacudnnaniconda chatglm6b 的安装 网上有很多&#xff0c; 不记录 了。 chatglm2-6b 我从别的地方拷贝的&#xff0c; 模型也包含了。 遇到的问题&#xf…

【MMC子系统】三、MMC子系统框架

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强企业&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …

【SpringBoot开发】之商城项目案例(购物车相关操作)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之商城项目系列》。&#x1f3af…

GZ075 云计算应用赛题第4套

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷4 某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenSt…

Pytorch上采样

文章目录 Upsample特殊上采样 Upsample 所谓上采样&#xff0c;实则是一个插值过程。所以上采样对象在初始化时&#xff0c;需要指定一个插值类型&#xff0c;Upsample是torch.nn中最基础的上采样类&#xff0c;初始化参数如下 Upsample(sizeNone, scale_factorNone, modenea…

计算机组成原理 主存和CPU连接与主存提速方案

文章目录 主存与CPU的连接译码器线选法译码片选法总结 位拓展字拓展字位同时拓展 主存提速方案存储周期双端口RAM多模块存储器单体多字存储器多模块多体并行存储器存储器高位交叉编址低位交叉编址 主存与CPU的连接 #mermaid-svg-3wv6WzRP2BvKEHQZ {font-family:"trebuchet…

GZ075 云计算应用赛题第1套

2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷1 某企业根据自身业务需求,实施数字化转型,规划和建设数字化平台,平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”,拟采用开源OpenStack搭建企业内部私有云平台,开源Kubernetes搭建云原生服务平台,…

HTML5 和 CSS3 新特性(常用)

HTML5 的新特性 HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题&#xff0c;基本是 IE9 以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以大量使用这 些新特性。 HTML…

Linux CPU 数据 Metrics 指标解读

过去从未仔细了解过使用 top 和 htop 等命令时显式的CPU信息&#xff0c;本文我们详解解读和标注一下各个数据项的含义&#xff0c;同时和 Ganglia 显式的数据做一个映射。开始前介绍一个小知识&#xff0c;很多查看CPU的命令行工具都是 cat /proc/stat 里的数据&#xff0c;所…

Element-ui自定义input框非空校验

1、vue自定义非空指令&#xff1a; main.js中自定义非空指令 当input框或下拉框中数据更新时&#xff0c;触发校验 Vue.directive(isEmpty,{update:function(el,binding,vnode){if(vnode.componentInstance.value""){el.classList.add("is-required");}e…

使用echarts的bmap配置项绘制区域轮廓遮罩

示例图 代码 <template><div id"map" style"width: 100%; height: 100vh"></div> </template><script> import * as echarts from "echarts"; import "echarts/extension/bmap/bmap"; export default…