赞
踩
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组播发送与接收https://download.csdn.net/download/weixin_51631044/88692407
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。