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…

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

  1. 2021-04-13 由于网络配置导致UDP广播通信接收信息异常问题

    机器一网络配置: IP地址: 192.168.200.1 子网掩码: 255.255.0.0 网关: 192.168.220.1 DNS服务器: DHCP客户端ID:机器一网络配置: IP地址: 19 ...

  2. android udp 广播通信,Android开启热点进行UDP通信中的坑

    1.写在前面: 2018年的第一篇文章,最近在使用UDP协议进行硬件通信,大家都知道UDP协议通信必须在同一个局域网内,但是每个用户家的wifi都是不一样的,硬件设备是无法只值连接到用户家的wifi的 ...

  3. Qt UDP 广播简单示例

    前言 用 Qt 的 UDP 来实现一个广播示例,代码其实非常简单,需要用到 QUdpSocket 类,这里实现两个工程,服务端和客户端,由服务器端发送广播消息到每个客户端接收显示. 正文 先来看看两个 ...

  4. 网络与通信程序设计-基于UDP的广播通信实例

    目录 实验内容和设计思想 实验的内容 UDP的设计思想 UDP的协议头部 UDP通信编程思想 UDP的工作流程 UDP编程收发函数 广播通信 广播模式设置 广播套接字 UDP Socket的使用过程 ...

  5. 广播通信设计——WinSock编程(QT界面)

    广播通信设计 一.设计要求 设计要求是通过学习winSock API编程,实现局域网消息广播的应用程序. 系统采用CS架构的方式,具有服务端和客户端.完成的功能有私聊.群聊和私聊时的文件传输,私聊和文 ...

  6. 【QT网络编程】实现UDP协议通信

    文章目录 概要:本期主要讲解QT中对UDP协议通信的实现. 一.UDP协议通信 二.Qt中UDP协议的处理 1.QUdpSocket 三.Qt实现UDP通信 1.客户端 2.服务器端 结尾 概要:本期 ...

  7. QT - 创建UDP Socket通信

    1.UDP概述 相对与TCP通信,UDP通信是面向无连接的,也即服务器端与客户端不需要建立连接即可发送接收数据. UDP的通信特点:简单轻便.不可靠.面向数据报.无连接的传输协议,可以应用在可靠性不是 ...

  8. 【QT实现TCP和UDP协议通信(二)】

    QT实现TCP和UDP协议通信(二) 编程环境 :Windows10 x64 下 QtCreator 语言 :C++ 作者 :wddkxg 时间 :2022.4.24 项目 :Server + Cli ...

  9. 【QT实现TCP和UDP协议通信(一)】

    QT实现TCP和UDP协议通信(一) 编程环境 :Windows10 x64 下 QtCreator 语言 :C++ 作者 :wddkxg 时间 :2022.4.24 项目 :Server + Cli ...

最新文章

  1. 套接字I/O模型之WSAEventSelect
  2. nginx真的存在文件类型解析漏洞吗?
  3. 第十届 蓝桥杯样题 ——代码填空
  4. 两个小块随鼠标拖动_html,类练习
  5. sql多行插入insert多行无法分析查询文本_收藏!SQL语法全集合!
  6. 导出无法正常启动的VMware虚拟机中的文件
  7. Java开发利器Eclipse和IDEA
  8. 国家/地区 语言缩写代码 查询备用
  9. 《西部世界》,能给现实世界的人工智能带来怎样的狂想
  10. 极智AI | 目标检测实现分享二:听说克莱今天复出了?详解 YOLOv2 算法与克莱检测
  11. Lua IDE - x-studio 强大的IDE
  12. 微信公众号的系统功能定位
  13. oracle utl_http.request,通过ORACLE的UTL_HTTP工具包发送包含POST参数的请求
  14. 安卓8.0下的应用安装
  15. 对SPU、SKU的一点理解
  16. FreeBSD开发手册(一)
  17. 仿小米商城官网首页模板(HTML+CSS)
  18. 车牌定位系统matlab,基于Matlab的车牌定位系统的研究与设计论文
  19. 【Hack The Box】linux练习-- Ophiuchi
  20. win10 WmiPrvSE.exe WMI Provider 占用CPU过高的问题

热门文章

  1. 手机游戏投屏软件有哪些 适合安卓用户
  2. repr方法有什么作用
  3. python中getitem_解析Python中的__getitem__专有方法
  4. pytorch独热编码
  5. git 删除本地/远程分支
  6. 【Python入门基础】算法与数据结构
  7. 爱从26个字母开始 (可爱的史努比)
  8. 学习率(Learning rate)的理解及调整依据
  9. java基础入门第一天须知
  10. STM32F4--PWM控制LED忽明忽暗(呼吸灯)