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
#include
#include
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组播发送与接收
https://download.csdn.net/download/weixin_51631044/88692407
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

