Qt | UDP广播通信的使用、实战项目使用案例

Qt | UDP广播通信的使用、实战项目使用案例


1、UDP广播介绍

UDP广播地址固定IP地址为:XXX.XXX.XXX.255。

如果向全网段发送广播消息,那么广播地址为:255.255.255.255;

如果向单个网段发送广播消息,例如你的IP是192.168.31.104,那么广播地址为192.168.31.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);  // 发送广播消息
}

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

#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;
}

4、运行效果

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

5、实战项目使用案例

此部分的代码移植自大名鼎鼎的开源软件LANDrop,这是一个局域网内文件互传的一个软件,支持windows、linux、android、macos,我日常一直在用,比微信文件传输助手好用多了!

在研读LADDrop源码时,发现他的搜索并发现局域网设备的代码写的很好,是个不错的轮子,可以直接移植出来使用。

LANDrop发现局域网的流程为:

当前设备发送广播为Json格式的UDP广播消息:

{"request":true}

局域网内其他设备收到该广播消息后,将设备信息、设备类型、端口号等信息返回,例如:

{"request":false,"device_name":"MyAndroid","device_type":"android","port":39091}

补充:这里有个小问题,为什么不在返回信息里面加上IP地址的返回?

答:因为UDP接收到广播消息时,信息里会带着消息的IP地址,直接提取出来就可以使用,所以只需要知道端口号即可,当然也可以加上IP地址的信息。

发现服务的代码为:discoveryservice.cppdiscoveryservice.h,移植直接添加到自己项目即可。

settings.cppsettings.h是配置文件的一些操作。

写了一个简单的Demo,界面如下:

点击搜索设备按钮后会发送广播消息,局域网内的其他设备如果有回复则在ListView显示。

Demo代码下载:https://gitee.com/jhuangBTT/boradcast_demo


ends…

  • 4
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

觉皇嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值