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.hqwc.cn/news/316452.html

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

相关文章

[GKCTF 2020]ez三剑客-eztypecho

[GKCTF 2020]ez三剑客-eztypecho 考点&#xff1a;Typecho反序列化漏洞 打开题目&#xff0c;发现是typecho的CMS 尝试跟着创建数据库发现不行&#xff0c;那么就搜搜此版本的相关信息发现存在反序列化漏洞 参考文章 跟着该文章分析来&#xff0c;首先找到install.php&#xf…

NSSCTF 1zjs

开启环境: 搞就完事了,别玩魔法! 源码打开 点击访问:./dist/index.umd.js" 搜索php,找到23条相关的,注意到有一个特别的信息: PERFORMANCE OF THIS SOFTWARE.Your gift just take it : /fk3f1ag.php 访问: node4.anna.nssctf.cn:28325/fk3f1ag.php 得到这样: ([![]…

JS中indexOf()方法的使用

在工作中 , indexOf() 方法使用频率还是非常高的&#xff0c;对于这个知识点&#xff0c;我们来做个简单的总结 基本定义&#xff1a;indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置&#xff0c;如果没有找到返回-1 - indexOf() 只返回字符串在规定的查找顺…

58.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏菜单文字资源读取的逆向分析

内容来源于&#xff1a;易道云信息技术研究院VIP课 之前的内容&#xff1a;接管游戏的自动药水设定功能-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;34b9c1d43b512d0b4a3c395b…

最小二乘法解线性回归

最小二乘法 算法介绍 基于均方误差最小化来进行模型求解的方法称为“最小二乘法(least square method)它的主要思想就是选择未知参数&#xff0c;(a5&#xff0c;b5)(a3&#xff0c;b3)(a1&#xff0c;b1)(a4&#xff0c;b4)(a2&#xff0c;b2)使得理论值与观测值之差的平方和…

大数据平台Bug Bash大扫除最佳实践

一、背景 随着越来越多的"新人"在日常工作以及大促备战中担当大任&#xff0c;我们发现仅了解自身系统业务已不能满足日常系统开发运维需求。为此&#xff0c;大数据平台部门组织了一次Bug Bash活动&#xff0c;既能提升自己对兄弟产品的理解和使用&#xff0c;又能…

CMake入门教程【基础篇】打印(message)

文章目录 1. 基本用法示例 2. 打印变量的值示例 3. 打印列表的值示例 4. 打印生成器表达式的值示例 5.总结 #mermaid-svg-pXC2tr41PvHonKJa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-pXC2tr41PvHonKJa .error-…

在pbootcms中制作静态化的TAG标签列表

如果你使用pbootcms来管理你的网站&#xff0c;你可能会遇到这样的需求&#xff1a;将TAG标签列表改成静态化的类似于栏目结构的需求。下面是实现这个需求的步骤。 步骤1 修改PHP文件 打开 apps/home/controller/ParserController.php 并找到大约在1852行左右的代码段&#x…

论文解读:A New CNN Building Block for Low-ResolutionImages and Small Objects

引言 之前通过stride和pooling这些下采样操作&#xff0c;但是这些操作都会或多或少丢失图像的信息&#xff0c;所以这不适用于具有低分辨率图像和小物体的更困难的任务上。像池化选择maxpooling或者是averagepooling、卷积的步长(太大的话会丢失信息)都是很头疼的问题&#x…

共识算法介绍

文章目录 共识算法Paxos 算法三种角色一致性提交算法prepare 阶段accept 阶段commit 阶段 CAP 定理BASE 理论Zookeeper 算法实现三类角色三个数据三种模式四种状态消息广播算法Leader选举算法 共识算法 Paxos 算法 Paxos 算法是莱斯利兰伯特(Leslie Lamport)1990 年提出的一种…

25道RabbitMQ面试题含答案(很全)

1. 什么是RabbitMQ RabbitMQ是一个开源的消息队列系统&#xff0c;它使用AMQP&#xff08;高级消息队列协议&#xff09;标准。RabbitMQ的主要目标是提供可靠的消息传递&#xff0c;确保消息的可靠性和顺序性&#xff0c;同时提供灵活的路由和消息确认机制。 RabbitMQ基于AMQ…

iCloud 备份 如何删除?

文章目录 Intro操作效果 浏览器端触发手机操作 Intro 前几天重置手机系统&#xff0c;不小心向 iCloud 推送了手机备份。 可是我用的是不需要这份备份&#xff0c;想要删除&#xff0c;可是常规入口找不到删除icloud中备份的按钮。 需要如下设备&#xff1a; 一台iphone &am…