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_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.mfbz.cn/a/286407.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

m1芯片电脑上的paragon15如何安装激活 m1芯片电脑上ntfs for mac如何安装

Paragon NTFS软件在M1芯片电脑上安装之后&#xff0c;最后一步会让我们“允许加载第三方内核扩展”&#xff0c;具体如下图所示。 图1&#xff1a;允许加载第三方内核扩展 按照图中提示“单击此处“&#xff0c;然后打开安全与隐私。接下来依次点击小锁标志进行解锁&#xff0c…

Abstract Factory抽象工厂模式(对象创建)

抽象工厂模式&#xff1a;Abstract Factory 链接&#xff1a;抽象工厂模式实例代码 解析 目的 在软件系统中&#xff0c;经常面临着“一系列相互依赖的对象工作”&#xff1b;同时&#xff0c;由于需求的变化&#xff0c;往往存在更多系列对象的创建工作。 如何应对这种变化…

EBDP:解锁大数据的奥秘✨

大数据时代已经来临&#xff0c;你是否也想掌握这门“显学”&#xff1f;&#x1f31f; EBDP&#xff0c;这个让众多专业人士趋之若鹜的认证&#xff0c;究竟有何魅力&#xff1f;今天就带你一探究竟&#xff01; &#x1f31f;EBDP&#xff1a;大数据的“敲门砖”&#x1faa…

无线路由器的五种工作模式:

1.Router&#xff0c;即无线路由模式&#xff0c;这也是我们最常用的一种工作方式&#xff0c;一般家里宽带连接&#xff0c;将宽带猫连接在无线路由的WAN口上&#xff0c;然后做拨号帐号设置&#xff0c;就用这个模式即可。 在Router&#xff08;无线路由&#xff09;模式下&a…

预售价80万元的ET9,能否拯救蔚来【不断恶化】的财务业绩?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 发布新车型 12月23日&#xff0c;蔚来&#xff08;NIO&#xff09;的创始人李斌在西安NIO DAY上发布了蔚来自成立以来售价最高的车型--ET9。 据猛兽财经了解&#xff0c;ET9定位于行政旗舰&#xff0c;预售价为80万元&…

【C语言】Windows上用GTK写GUI程序

要使用GTK开发一个Windows图形用户界面程序&#xff0c;需要首先设置GTK开发环境。这通常包括安装GTK库和它的依赖&#xff0c;以及配置编译器和工具链。可以选择使用纯C语言和GTK库或者使用支持GTK绑定的其他语言&#xff0c;如Python、C或Rust。 1. 安装GTK开发库 在Window…

QT上位机开发(绘图软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 稍微复杂一点的软件&#xff0c;一般都是带有绘图功能。绘图的意义&#xff0c;不仅仅是像CAD一样&#xff0c;可以进行模型的设计、比对和调试。它…

mysql之四大引擎、账号管理以及建库

一.数据库存储引擎 1.1存储引擎的查看 1.2InnoDB 1.3MyISAM 1.4 MEMORY 1.5 Archive 二.数据库管理 2.1元数据库简介 2.2元数据库分类 2.3 相关操作 2.4 MySQL库 三.数据表管理 3.1三大范式 3.2 基本数据类型 3.2.1优化原则 3.3 整形 3.4 实数 3.5 字符串 3.6 text&…

Java反射机制和动态代理

反射和动态代理 反射前言获取class对象的方式反射获取构造方法反射获取成员变量反射获取成员方法实例 动态代理 反射 前言 什么是反射&#xff1f; 反射允许对成员变量&#xff0c;成员方法和构造方法的信息进行编程访问。 为什么用反射 / 反射的作用&#xff1f; 可以轻易地获…

Scene Creator

场景创建器是一个方便、易于使用的编辑工具&#xff0c;旨在简化创建新场景的过程。使用场景创建器&#xff0c;您可以选择一个模板场景&#xff0c;定义一个目录来存储您的场景&#xff0c;并在需要时自动将新场景添加到构建中。 下载&#xff1a; ​​Unity资源商店链接 资…

微软好听的tts语音包下载,粤语,韩语,日语

微软的 tts 语音库&#xff0c;都是离线的&#xff0c;所以速度非常快 但资源比较少&#xff0c;比如粤语&#xff0c;韩语&#xff0c;日语 我发现一个老牌语音技术供应商。 资源丰富&#xff0c;可自行下载免费或收费语音包。 网站&#xff1a;正版用户专用配套播音员下载…

im6ull学习总结(三-2)文字显示中文字符

承接上篇文章 中文字符的点阵显示 使用点阵字库时&#xff0c;中文字符的显示原理跟 ASCII 字符是一样的。要注意的地方在于中文的编码&#xff1a;在 C 源文件中它的编码方式是 GB2312 还是 UTF-8&#xff1f;编译出的可执行程序&#xff0c;其中的汉字编码方式是 GB2312 还…

机器学习(二) -- 数据预处理(2)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 未完待续…… 目录 系列文章目录 前言 四、【数…

三、C语言中的分支与循环—while循环 (5)

本章分支结构的学习内容如下&#xff1a; 三、C语言中的分支与循环—if语句 (1) 三、C语言中的分支与循环—关系操作符 (2) 三、C语言中的分支与循环—条件操作符 与逻辑操作符(3) 三、C语言中的分支与循环—switch语句&#xff08;4&#xff09;分支结构 完 本章循环结…

部署上传漏洞的靶场环境upload-labs

1、工具介绍 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关&#xff0c;每一关都包含着不同上传方式。 upload-labs靶场开源地址&#xff1a;&#xff1a;https://…

Android14之禁掉Selinux的两种方式(一百七十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

经典卷积神经网络-ResNet

经典卷积神经网络-ResNet 一、背景介绍 残差神经网络(ResNet)是由微软研究院的何恺明、张祥雨、任少卿、孙剑等人提出的。ResNet 在2015 年的ILSVRC&#xff08;ImageNet Large Scale Visual Recognition Challenge&#xff09;中取得了冠军。残差神经网络的主要贡献是发现了…

为什么python值得学习,python的应用领域。

文章目录 前言Web 应用开发自动化运维网络爬虫数据分析科学计算人工智能胶水语言Python技术资源分享1、Python所有方向的学习路线2、学习软件3、入门学习视频4、实战案例5、清华编程大佬出品《漫画看学Python》6、Python副业兼职与全职路线 前言 说起编程语言&#xff0c;Pyth…

【电商项目实战】购物车完善

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…

ElasticSearch的DSL查询语法解析

Elasticsearch提供了基于ISON的DSL (Domain Specific Lanquage)来定义查询。 目录 一、常见查询类型 二、DSLQuery基本语法 三、全文检索查询 3.1 match查询&#xff1a;会对用户输入内容分词&#xff0c;常用于搜索框搜索 &#xff0c;语法&#xff1a; 3.2 multi match…