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

2024-01-02 22:23:53

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

文章来源:https://blog.csdn.net/weixin_51631044/article/details/135349797
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。