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

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: