QT网络编程之实现UDP广播发送和接收

news/2024/5/18 14:00:44 标签: 网络, qt, udp

一.UDP广播介绍

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

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

如果向单个网段发送广播消息,例如你的IP是192.168.31.104,那么广播地址为192.168.31.255。

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

二.使用场景

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

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

常见的比如IP摄像头。

三.Qt UDP广播代码实现

(1)发送广播消息端示例代码:

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

#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, 5100);  // 发送广播消息

}

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

#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(QHostAddress::Any, 5100, 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;

}

参考文章:https://blog.csdn.net/qq153471503/article/details/125622356


http://www.niftyadmin.cn/n/5443448.html

相关文章

hive SQL 移位、运算符、REGEXP正则等常用函数

orderflag & shiftleft(1,14) shiftleft(1,14) SQL中使用的运算符号详解_sql中各种符号-CSDN博客 Hive函数_hive shift-CSDN博客 (内建函数(类型排序)_云原生大数据计算服务 MaxCompute(MaxCompute)-阿里云帮助中心)

开源表单设计器颗粒度级别控制表单的显示条件原理分析

表单渲染中, 有些表单的显示有不同条件, 比如需要上一个表单的开关打开,或者文本内容为 xxxx, 或者需要大于或等于或小于指定值, 或者需要选中某个选项, 或者需满足以上多个条件或在满足多个条件中的一个, 有 n 种场景选择, 这样就需要条件显示配置功能, 来满足多样化需求 预览…

Machine Vision Technology:Lecture10 Object Detection

Machine Vision Technology:Lecture10 Object Detection object detection and challengesFace Detection人脸检测Sliding Window Face Detection with Viola-Jones 2001Pedestrian Detection行人检测 计算机视觉(本科) 北京邮电大学 鲁鹏 In…

Linux环境JMeter脚本性能测试、easyNmon生成监控报告

一、下载JMeter安装包 Jmeter是Java开发的,需要依赖JDK环境,因此我们需提前安装好JDK。 Jmeter是开源的工具,我们直接到官网下载即可。 最新版本下载地址:Apache JMeter - Download Apache JMeter 二、安装JMeter #新建jmete…

css与鼠标光标指针相关的属性有哪些?

CSS中与鼠标光标相关的属性以下几个: cursor: 设置鼠标光标的样式。常见的取值有: auto:浏览器自动决定光标样式。pointer:手型光标,表示链接可点击。default:默认光标样式。text:文本光标&…

HBase中过滤器部分命令符操作

首先表大概是这样的---- 1.列出所有过滤器命令 show_filters 2.PrefixFilter-行键前缀过滤器 返回符合条件的行键的数据 scan student,FILTER>"PrefixFilter(行键)" 3.ColunmPrefixFilter-列前缀过滤器 返回符合条件的列名前缀的数据 scan 表名, FILTER>…

算法体系-14 第十四 贪心算法(上)

一 、 递归套路解决判断完全二叉树 1.1 描述 1.2 分析 1.3 代码 public static boolean isCBT2(Node head) {return process(head).isCBT;}public static class Info {public boolean isFull;public boolean isCBT;public int height;public Info(boolean full, boolean cbt…

java 完全背包问题

java 完全背包问题 问题描述 在完全背包问题中,给定一个背包的最大容量,和一系列物品,每种物品都有无限个可用,每个物品有自己的重量和价值。目标是在不超过背包容量的情况下,使得背包中物品的总价值最大。 与01背包…