当前位置:   article > 正文

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

qtudp通信发送与接收

1. 创建UDP套接字
使用QUdpSocket类创建一个UDP套接字。

  1. udpSend=new QUdpSocket(this);
  2. udpRece=new QUdpSocket(this);


2. 绑定套接字
绑定套接字到一个本地地址和端口。可以使用bind()函数来完成。
如果要在组播中发送数据,可以将套接字绑定到一个通配符地址(如QHostAddress::Any)和指定的端口上。

  1. void MainWindow::on_pBt_joinGroup_clicked()
  2. {
  3. QString IP_Group=ui->lineEdit_groupAddr->text();//获取组播地址
  4. groupAddr=QHostAddress(IP_Group);
  5. quint16 groupPort=ui->lineEdit_goupPort->text().toInt();//获取组播端口
  6. if(udpRece->bind(QHostAddress::AnyIPv4,groupPort,QUdpSocket::ShareAddress)){//绑定地址
  7. udpRece->joinMulticastGroup(groupAddr);//加入组播
  8. ui->plainTextEdit->appendPlainText("**加入组播成功");
  9. ui->plainTextEdit->appendPlainText("**组播IP地址:"+IP_Group);
  10. ui->plainTextEdit->appendPlainText("**绑定端口:"+QString::number(groupPort));
  11. ui->pBt_joinGroup->setEnabled(false);
  12. ui->pBt_exitGroup->setEnabled(true);
  13. }
  14. }


3. 加入组播组
使用joinMulticastGroup()函数将套接字加入到指定的组播组中。
该函数需要指定组播组的地址和接口地址。

udpRece->joinMulticastGroup(groupAddr);//加入组播


4. 发送数据
使用writeDatagram()函数发送组播数据。
需要指定要发送的数据、目标地址(即组播组的地址)和端口号。

  1. //发送组播
  2. void MainWindow::sendUdpMess(){
  3. quint16 groupPort=ui->lineEdit_goupPort->text().toInt();//获取组播端口
  4. QString mesage=ui->lineEdit->text();//读取发送信息
  5. QByteArray sendMess=mesage.toUtf8();//将发送的信息转化为字节流
  6. udpSend->writeDatagram(sendMess,groupAddr,groupPort);//将待发送信息写入udp通信中
  7. ui->plainTextEdit->appendPlainText("[发送端:]"+mesage);//发送信息显示
  8. }


5. 接收数据
当套接字收到组播数据时,会发出readyRead()信号。
在槽函数中,可以使用readDatagram()函数来读取接收到的数据报的内容、源地址和端口号。

  1. //接收组播信息
  2. void MainWindow::receUdpMess(){
  3. while (udpRece->hasPendingDatagrams()){
  4. QByteArray receData;//创建接收字节流
  5. QHostAddress peerAddr;//接收地址
  6. quint16 peerPort;//接收端口
  7. quint16 size=udpRece->pendingDatagramSize();//读取接收udp数据大小
  8. receData.resize(size);//重设接收字节流大小
  9. udpRece->readDatagram(receData.data(),receData.size(),&peerAddr,&peerPort);//读取以太网发送端的udp数据
  10. QString peer="[From]+"+peerAddr.toString()+":"+QString::number(peerPort)+"]";//读取发送端地址、端口
  11. ui->plainTextEdit->appendPlainText(peer+receData.data());//将接收内容显示在文本框中
  12. }
  13. }

完整代码如下:

一、主cpp文件

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent)
  4. : QMainWindow(parent)
  5. , ui(new Ui::MainWindow)
  6. {
  7. ui->setupUi(this);
  8. udpSend=new QUdpSocket(this);
  9. udpRece=new QUdpSocket(this);
  10. udpRece->setSocketOption(QAbstractSocket::MulticastTtlOption,1);
  11. connect(udpRece,&QUdpSocket::readyRead,this,&MainWindow::receUdpMess);//连接读取udp通信数据
  12. }
  13. MainWindow::~MainWindow()
  14. {
  15. delete ui;
  16. }
  17. //接收组播信息
  18. void MainWindow::receUdpMess(){
  19. while (udpRece->hasPendingDatagrams()){
  20. QByteArray receData;//创建接收字节流
  21. QHostAddress peerAddr;//接收地址
  22. quint16 peerPort;//接收端口
  23. quint16 size=udpRece->pendingDatagramSize();//读取接收udp数据大小
  24. receData.resize(size);//重设接收字节流大小
  25. udpRece->readDatagram(receData.data(),receData.size(),&peerAddr,&peerPort);//读取以太网发送端的udp数据
  26. QString peer="[From]+"+peerAddr.toString()+":"+QString::number(peerPort)+"]";//读取发送端地址、端口
  27. ui->plainTextEdit->appendPlainText(peer+receData.data());//将接收内容显示在文本框中
  28. }
  29. }
  30. //发送组播
  31. void MainWindow::sendUdpMess(){
  32. quint16 groupPort=ui->lineEdit_goupPort->text().toInt();//获取组播端口
  33. QString mesage=ui->lineEdit->text();//读取发送信息
  34. QByteArray sendMess=mesage.toUtf8();//将发送的信息转化为字节流
  35. udpSend->writeDatagram(sendMess,groupAddr,groupPort);//将待发送信息写入udp通信中
  36. ui->plainTextEdit->appendPlainText("[发送端:]"+mesage);//发送信息显示
  37. }
  38. //加入组播
  39. void MainWindow::on_pBt_joinGroup_clicked()
  40. {
  41. QString IP_Group=ui->lineEdit_groupAddr->text();//获取组播地址
  42. groupAddr=QHostAddress(IP_Group);
  43. quint16 groupPort=ui->lineEdit_goupPort->text().toInt();//获取组播端口
  44. if(udpRece->bind(QHostAddress::AnyIPv4,groupPort,QUdpSocket::ShareAddress)){//绑定地址
  45. udpRece->joinMulticastGroup(groupAddr);//加入组播
  46. ui->plainTextEdit->appendPlainText("**加入组播成功");
  47. ui->plainTextEdit->appendPlainText("**组播IP地址:"+IP_Group);
  48. ui->plainTextEdit->appendPlainText("**绑定端口:"+QString::number(groupPort));
  49. ui->pBt_joinGroup->setEnabled(false);
  50. ui->pBt_exitGroup->setEnabled(true);
  51. }
  52. }
  53. //退出组播
  54. void MainWindow::on_pBt_exitGroup_clicked()
  55. {
  56. udpRece->leaveMulticastGroup(groupAddr);//退出组播
  57. udpRece->abort();//解除绑定
  58. ui->plainTextEdit->appendPlainText("**已退出组播");
  59. ui->pBt_exitGroup->setEnabled(false);
  60. ui->pBt_joinGroup->setEnabled(true);
  61. sendTimer->stop();
  62. }
  63. //清空文本框
  64. void MainWindow::on_pBt_clearText_clicked()
  65. {
  66. ui->plainTextEdit->clear();
  67. }
  68. //退出
  69. void MainWindow::on_pBt_exit_clicked()
  70. {
  71. this->close();
  72. }
  73. //发送信息
  74. void MainWindow::on_pushButton_clicked()
  75. {
  76. sendTimer=new QTimer(this);
  77. connect(sendTimer,&QTimer::timeout,this,&MainWindow::sendUdpMess);
  78. sendTimer->start(1000);//一秒发一次
  79. }

二、头文件(.h)

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QUdpSocket>
  5. #include <QTimer>
  6. QT_BEGIN_NAMESPACE
  7. namespace Ui { class MainWindow; }
  8. QT_END_NAMESPACE
  9. class MainWindow : public QMainWindow
  10. {
  11. Q_OBJECT
  12. public:
  13. MainWindow(QWidget *parent = nullptr);
  14. ~MainWindow();
  15. private slots:
  16. void on_pBt_joinGroup_clicked();
  17. void on_pBt_exitGroup_clicked();
  18. void on_pBt_clearText_clicked();
  19. void on_pBt_exit_clicked();
  20. void receUdpMess();//接收组播信息
  21. void sendUdpMess();//发送信息
  22. void on_pushButton_clicked();
  23. private:
  24. Ui::MainWindow *ui;
  25. QUdpSocket *udpRece;
  26. QUdpSocket *udpSend;
  27. QHostAddress groupAddr;
  28. QTimer *sendTimer;
  29. };
  30. #endif // MAINWINDOW_H

运行结果:

源代码放在如下链接中,需要的点击获取:

udp组播发送与接收icon-default.png?t=N7T8https://download.csdn.net/download/weixin_51631044/88692407

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/826872
推荐阅读
相关标签
  

闽ICP备14008679号