• Qt | UDP广播通信、简单使用案例


    Qt | UDP广播通信、简单使用案例


    1、UDP广播介绍

    UDP广播地址固定IP地址为:255.255.255.255,

    接收方绑定0.0.0.0地址并监听指定端口即可收到广播的群发消息。

    2、使用场景

    某设备的业务通信是使用TCP协议,当该设备部署到一个新的网络环境当中时,设备的IP地址是未知的,需要知道或修改设备的IP地址才能够进行TCP的通信。

    此时就可以在局域网内通过UDP广播的形式使该设备收到广播消息,从而使用设备返回IP地址、返回设备的MAC、修改IP地址等操作。

    3、Qt UDP广播示例

    服务器(发送广播消息端)示例代码:

    我这里设定的端口为10123,不是固定的。但是服务器往哪个端口发送广播消息,客户端就得监听哪个端口。

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        socket = new QUdpSocket(this);
        connect(socket, &QUdpSocket::readyRead, this, [=](){
            while(socket->hasPendingDatagrams())
            {
                QByteArray data;
                data.resize(socket->pendingDatagramSize());
                QHostAddress host;
                quint16 port;
                socket->readDatagram(data.data(), data.size(), &host, &port);  // 将客户端发来的数据在发送回去
            }
        });
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        socket->writeDatagram("this is broadcast message !", QHostAddress::Broadcast, 10123);  // 发送广播消息
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    客户端(接收广播消息端)示例代码:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        socket = new QUdpSocket(this);
        if(!socket->bind(10123, QUdpSocket::ShareAddress))
        {
            ui->textBrowser->append("bind failed !");
        }
    
        connect(socket, &QUdpSocket::readyRead, this, [=](){
            while(socket->hasPendingDatagrams())
            {
                QByteArray data;
                data.resize(socket->pendingDatagramSize());
                QHostAddress host;
                quint16 port;
                socket->readDatagram(data.data(), data.size(), &host, &port);
    
                QString text = QString("[%1:%2]:%3").arg(host.toString()).arg(port).arg(QString(data));
    
                ui->textBrowser->append(text);
            }
        });
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    4、运行效果

    一个服务端用于发布广播消息,两个客户端(网络调试助手是客户端):
    在这里插入图片描述


    ends…

  • 相关阅读:
    编译丨迅为iTOP4412开发板Makefile编译
    mindspore提示Syntax error. Invalid data, Page size: 33554432 is too small
    2022年最新湖北水利水电施工安全员考试题库及答案
    接口测试框架实战 | 流程封装与基于加密接口的测试用例设计
    【集合】如果初始化HashMap,传一个17的值,它会怎么处理?
    八大排序算法
    利用 API 接口进行自动代码生成的最佳实践
    383.赎金信
    发送成绩的app或小程序推荐
    PyTorch
  • 原文地址:https://blog.csdn.net/qq153471503/article/details/125622356