首页 > 编程语言 >QT网络编程之实现UDP广播发送和接收

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

时间:2024-03-21 09:30:58浏览次数:26  
标签:UDP QT 编程 广播 ui IP地址 data MainWindow socket

一.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

标签:UDP,QT,编程,广播,ui,IP地址,data,MainWindow,socket
From: https://blog.csdn.net/xieliru/article/details/136896644

相关文章

  • QT6实现创建与操作sqlite数据库三种方式方式对比(二)
    一.概述Qt访问Sqlite数据库的三种方式(即使用三种类库去访问),QSqlQuery、QSqlQueryModel、QSqlTableModel,对于这三种类库,可看为一个比一个上层,也就是封装的更厉害,甚至第三种QSqlTableModel,根本就不需要开发者懂SQL语言,也能操作Sqlite数据库。二.Qt读写Sqlite数据库的三种方......
  • 飞凌RK3568开发板移植Qt5.9.8
    1、安装Ubuntu18.04虚拟机,并开启root登录2、gcc环境搭建从官方提供的网盘资料OK3568-C_ForlinxDesktop20.04_用户资料_R3(更新日期:20231201),解码\Linux\源码\OK3568-linux-source,在prebuilts文件夹将gcc拷贝到虚拟机(Ubuntu18.04)的/usr/local目录下 设置环境变量,修改/etc/pr......
  • Java并发编程:第四章 线程池(Executor框架)
    文章目录一、为什么需要线程池1、线程的创建2、线程销毁二、优点1、降低资源消耗2、提高响速度3、线程管理三、架构说明四、Executors工具类1、介绍2、Executors工具类常用的方法(1)newFixedThreadPool(intnThreads):(2)newCachedThreadPool()(3)newSingleThreadExecutor()......
  • C++ 编程入门指南:深入了解 C++ 语言及其应用领域
    C++简介什么是C++?C++是一种跨平台的编程语言,可用于创建高性能应用程序。C++是由BjarneStroustrup开发的,作为C语言的扩展。C++为程序员提供了对系统资源和内存的高级控制。该语言在2011年、2014年、2017年和2020年进行了4次重大更新,分别为C++11、C++14、C+......
  • JavaScript 中的函数式编程
    一、问题背景例子下面的代码是一个函数式编程的例子我们先观察一下里面有哪些特殊的语法点,再一一讲解constprogrammerOutput=[{name:'UncleBobby',linesOfCode:500,},{name:'SuzieQ',linesOfCode:1500,},{name:'JimmyGosl......
  • AST20201网络编程
    Web编程实验JavaScript-2将所有完成的html、CSS和图像文件保存在名为lab4_yourname的文件夹中,其中包含的子文件夹必要时组织文件夹。压缩文件夹并在截止日期前提交给Moodle在Moodle中指定。注意,您需要确保所有图像路径/链接都可以工作适当地放在您提交的文件夹和子文件夹中。任务......
  • Linux网络编程: TCP协议首部与可选项简述
    一、TCP/IP五层模型物理层(PhysicalLayer):物理层是最底层,负责传输比特流(bitstream)以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流,例如通过电缆、光纤或无线传输等。数据链路层(DataLinkLayer):数据链路层位于物理层之上,负责在直接相连的节点之间传输......
  • 如何理解UDP 和 TCP? 区别? 应用场景?
    一、UDPUDP(UserDatagramProtocol),用户数据包协议,是一个简单的面向数据报的通信协议,即对应用层交下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层也就是说无论应用层交给UDP多长的报文,它统统发送,一次发送一个报文而对接收方,接到后直接去除首部,交给上面的应......
  • 提升Java编程安全性-代码加密混淆工具的重要性和应用
     在Java编程领域中,保护代码安全性和知识产权至关重要。本文旨在探讨代码加密混淆工具在提升代码安全性和保护知识产权方面的重要性。我们将介绍几款流行的Java代码加密混淆工具,如ProGuard、DexGuard、Jscrambler、DashO和ipaguard,并分析它们的功能和适用场景,旨在帮助开发者选择......
  • QT 基于qcustomplot实现热力图(三)
    QT基于qcustomplot实现热力图(一)-CSDN博客QT基于qcustomplot实现热力图(二)-CSDN博客1.背景前面个两篇文章基本完成了热力图的基本使用场景,但对于一些负复杂的项目来说功能还是不够,本片讲继续完善。a.增加动态刷新,从右想做刷新;b.增加鼠标点击事件,获得当前的鼠标对应的行......