当前位置: 首页 > news >正文

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

推荐一个不错的人工智能学习网站,通俗易懂,内容全面,作为入门科普和学习提升都不错,分享一下给大家:前言icon-default.png?t=N7T8https://www.captainbed.cn/ai

一.UDP通信

1.QT中实现UDP通信主要用到了以下类:QUdpSocket、QHostAddress;

2.UdpServer是服务器端,用于监听客户端发送的消息并回复同样的消息;

  UdpClient是客户端,用于向服务器发送一条消息,并等待来自服务器的回复;

3.UDP与TCP的区别

UDP像写信,只要知道地址就可以发

TCP像打电话,只有两人同时在线才能通信

4.UDP多播组播

二.示例代码

本示例代码实现功能为本地管理的组播收发功能。

1.mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include    <QUdpSocket>

#include    <QLabel>

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

    Q_OBJECT

private:

    QLabel  *LabSocketState;

    QUdpSocket  *udpSocket;//用于与连接的客户端通讯的QTcpSocket

    QHostAddress    groupAddress;//组播地址

    QString getLocalIP();//获取本机IP地址

public:

    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();

private slots:

//自定义槽函数

    void    onSocketStateChange(QAbstractSocket::SocketState socketState);

    void    onSocketReadyRead();//读取socket传入的数据

    

    void on_actStart_triggered();

    void on_actStop_triggered();

    void on_actClear_triggered();

    void on_actHostInfo_triggered();

    void on_btnMulticast_clicked();

private:

    Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H

2.mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include    <QtNetwork>

QString MainWindow::getLocalIP()

{

    QString hostName=QHostInfo::localHostName();//本地主机名

    QHostInfo   hostInfo=QHostInfo::fromName(hostName);

    QString   localIP="";

    QList<QHostAddress> addList=hostInfo.addresses();//

    if (!addList.isEmpty())

    for (int i=0;i<addList.count();i++)

    {

        QHostAddress aHost=addList.at(i);

        if (QAbstractSocket::IPv4Protocol==aHost.protocol())

        {

            localIP=aHost.toString();

            break;

        }

    }

    return localIP;

}

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    LabSocketState=new QLabel("Socket状态:");//

    LabSocketState->setMinimumWidth(200);

    ui->statusBar->addWidget(LabSocketState);

    QString localIP=getLocalIP();//本地主机名

    this->setWindowTitle(this->windowTitle()+"----本机IP:"+localIP);

    udpSocket=new QUdpSocket(this);//用于与连接的客户端通讯的QTcpSocket

    udpSocket->setSocketOption(QAbstractSocket::MulticastTtlOption,1);

    connect(udpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),

            this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));

    onSocketStateChange(udpSocket->state());

    connect(udpSocket,SIGNAL(readyRead()),

            this,SLOT(onSocketReadyRead()));

}

MainWindow::~MainWindow()

{

    udpSocket->abort();

    delete udpSocket;

    delete ui;

}

void MainWindow::onSocketStateChange(QAbstractSocket::SocketState socketState)

{

    switch(socketState)

    {

    case QAbstractSocket::UnconnectedState:

        LabSocketState->setText("scoket状态:UnconnectedState");

        break;

    case QAbstractSocket::HostLookupState:

        LabSocketState->setText("scoket状态:HostLookupState");

        break;

    case QAbstractSocket::ConnectingState:

        LabSocketState->setText("scoket状态:ConnectingState");

        break;

    case QAbstractSocket::ConnectedState:

        LabSocketState->setText("scoket状态:ConnectedState");

        break;

    case QAbstractSocket::BoundState:

        LabSocketState->setText("scoket状态:BoundState");

        break;

    case QAbstractSocket::ClosingState:

        LabSocketState->setText("scoket状态:ClosingState");

        break;

    case QAbstractSocket::ListeningState:

        LabSocketState->setText("scoket状态:ListeningState");

    }

}

void MainWindow::onSocketReadyRead()

{//读取数据报

    while(udpSocket->hasPendingDatagrams())

    {

        QByteArray   datagram;

        datagram.resize(udpSocket->pendingDatagramSize());

        QHostAddress    peerAddr;

        quint16 peerPort;

        udpSocket->readDatagram(datagram.data(),datagram.size(),&peerAddr,&peerPort);

        QString str=datagram.data();

        QString peer="[From "+peerAddr.toString()+":"+QString::number(peerPort)+"] ";

        ui->plainTextEdit->appendPlainText(peer+str);

    }

}

void MainWindow::on_actStart_triggered()

{//加入组播

    QString     IP=ui->comboIP->currentText();

    groupAddress=QHostAddress(IP);//多播组地址

    quint16     groupPort=ui->spinPort->value();//端口

    if (udpSocket->bind(QHostAddress::AnyIPv4, groupPort, QUdpSocket::ShareAddress))//先绑定端口

    {

        udpSocket->joinMulticastGroup(groupAddress); //加入多播组

        ui->plainTextEdit->appendPlainText("**加入组播成功");

        ui->plainTextEdit->appendPlainText("**组播地址IP:"+IP);

        ui->plainTextEdit->appendPlainText("**绑定端口:"+QString::number(groupPort));

        ui->actStart->setEnabled(false);

        ui->actStop->setEnabled(true);

        ui->comboIP->setEnabled(false);

    }

    else

        ui->plainTextEdit->appendPlainText("**绑定端口失败");

}

void MainWindow::on_actStop_triggered()

{//退出组播

    udpSocket->leaveMulticastGroup(groupAddress);//退出组播

    udpSocket->abort(); //解除绑定

    ui->actStart->setEnabled(true);

    ui->actStop->setEnabled(false);

    ui->comboIP->setEnabled(true);

    ui->plainTextEdit->appendPlainText("**已退出组播,解除端口绑定");

}

void MainWindow::on_actClear_triggered()

{

    ui->plainTextEdit->clear();

}

void MainWindow::on_actHostInfo_triggered()

{

    QString hostName=QHostInfo::localHostName();//本地主机名

    ui->plainTextEdit->appendPlainText("本机主机名:"+hostName+"\n");

    QHostInfo   hostInfo=QHostInfo::fromName(hostName);

    QList<QHostAddress> addList=hostInfo.addresses();//

    if (!addList.isEmpty())

    for (int i=0;i<addList.count();i++)

    {

        QHostAddress aHost=addList.at(i);

        if (QAbstractSocket::IPv4Protocol==aHost.protocol())

        {

            QString IP=aHost.toString();

            ui->plainTextEdit->appendPlainText("本机IP地址:"+aHost.toString());

            if (ui->comboIP->findText(IP)<0)

                ui->comboIP->addItem(IP);

        }

    }

}

void MainWindow::on_btnMulticast_clicked()

{//发送组播消息

    quint16     groupPort=ui->spinPort->value();

    QString  msg=ui->editMsg->text();

    QByteArray  datagram=msg.toUtf8();

    udpSocket->writeDatagram(datagram,groupAddress,groupPort);

    ui->plainTextEdit->appendPlainText("[multicst] "+msg);

    ui->editMsg->clear();

    ui->editMsg->setFocus();

}

三.测试结果

  1. 初始状态

2.组播通讯结果

相关文章:

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

推荐一个不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;内容全面&#xff0c;作为入门科普和学习提升都不错&#xff0c;分享一下给大家&#xff1a;前言https://www.captainbed.cn/ai 一.UDP通信 1.QT中实现UDP通信主要用到了以下类&#xff1a;QUdpSocket、QHost…...

SSL VPN基础原理

目录 SSL ---安全传输协议&#xff08;安全套接层&#xff09;---TLS ----传输层安全协议 SSL的工作原理 SSL会话建立的过程 ​编辑 数据传输过程中的封装示意图 无客户端认证的过程 有客户端认证的过程 SSL VPN的核心技术---虚拟网关技术 服务器验证的点&#xff1a; 资源…...

深入理解FTP协议:文件传输的桥梁

深入理解FTP协议&#xff1a;文件传输的桥梁 在数字化时代&#xff0c;文件传输协议&#xff08;FTP&#xff09;是互联网上进行文件交换的重要手段。FTP允许用户在不同的计算机之间传输文件&#xff0c;无论是上传还是下载&#xff0c;都提供了一种稳定且高效的方式。本文将深…...

数字化转型导师坚鹏:金融机构数字化运营

金融机构数字化运营 课程背景&#xff1a; 很多金融机构存在以下问题&#xff1a; 不清楚数字化运营对金融机构发展有什么影响&#xff1f; 不知道如何提升金融机构数字化运营能力&#xff1f; 不知道金融机构如何开展数字化运营工作&#xff1f; 课程特色&#xff1a;…...

一、C#冒泡排序算法

一、C#冒泡排序算法 简介 冒泡排序算法是一种基础的排序算法&#xff0c;它的实现原理比较简单。核心思想是通过相邻元素的比较和交换来将最大&#xff08;或最小&#xff09;的元素逐步"冒泡"到数列的末尾。 实现原理 冒泡排序是一种简单的排序算法&#xff0c;其…...

docker部署mysql5

1. 进入面板 2. 新建挂载文件夹 新建三个文件夹: mkdir -p /docker/mysql5/config && mkdir -p /docker/mysql5/data && mkdir -p /docker/mysql5/logsconfig&#xff1a;存放mysql配置data&#xff1a;存放mysql数据logs&#xff1a;存放mysql记录日志 3.…...

Github 2024-03-15 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-15统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9非开发语言项目1TypeScript项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:476 天协议类型:OtherStar数量…...

SQLiteC/C++接口详细介绍之sqlite3类(六)

快速前往文章列表&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;五&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;七&#xff09; 19. sqlite3_changes与sqlite3_changes64 是SQLite中用…...

编码技巧:多条件判断拼接字符串

在写代码业务逻辑的时候&#xff0c;有时候需求稍微变化一下都让代码变的很麻烦&#xff0c;如果只在现有代码基础上硬改&#xff0c;可能会让可读性降低&#xff0c;本文通过一个例子来演示字符串拼接的变化。 一开始的业务逻辑比较简单&#xff0c;是固定条件加一个需要判断…...

气压计LPS25HB开发(1)----轮询获取气压计数据

气压计LPS25HB开发----1.轮询获取气压计数据 概述视频教学样品申请源码下载产品特性通信模式速率生成STM32CUBEMX串口配置IIC配置SA0地址设置串口重定向参考程序SA0设置模块地址获取ID复位操作BDU设置设置速率轮询读取数据演示 概述 本文将介绍如何使用 LPS25HB 传感器来读取数…...

这个不需要吗 HttpServletRequest req

这个不需要吗 HttpServletRequest req 在这个特定场景下&#xff0c;您在OnlineStudentFeignService接口中确实不需要直接使用HttpServletRequest对象。因为Feign是一个声明式的HTTP客户端&#xff0c;它的设计目标是简化服务间的远程调用&#xff0c;它并不直接处理原始的HTT…...

【算法与数据结构】深入解析二叉树(一)

文章目录 &#x1f4dd;数概念及结构&#x1f320; 树的概念&#x1f309;树的表示&#x1f320; 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; &#x1f309;二叉树概念及结构&#x1f320;概念&#x1f309;数据结构中的二叉树&#x1f320;特殊的二叉…...

深入浅出:Objective-C中使用MWFeedParser下载豆瓣RSS

摘要 本文旨在介绍如何在Objective-C中使用MWFeedParser库下载豆瓣RSS内容&#xff0c;同时展示如何通过爬虫代理IP技术和多线程提高爬虫的效率和安全性。 背景 随着信息量的激增&#xff0c;爬虫技术成为了获取和处理大量网络数据的重要手段。Objective-C作为一种成熟的编程…...

Java日志框架Log4j 2详解

有时希望能够以文件的形式记录执行过程中出现的异常信息&#xff0c;甚至记录程序正常运行的关键步骤&#xff0c;以便日后查看&#xff0c;那么该如何处理呢? 答:显然&#xff0c;可以自行编程实现这个需求&#xff0c;但是&#xff0c;从更注重效率和性能的方面考虑&#x…...

【剪枝实战】使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型

摘要 本次剪枝实战是基于下面这篇论文去复现的&#xff0c;主要是实现对BN层的γ/gamma进行剪枝操作&#xff0c;本文用到的代码和数据集都可以在我的资源中免费下载到。 相关论文&#xff1a;Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017…...

OSI(Open Systems Interconnection)模型和TCP/IP模型

OSI模型 OSI模型是一个概念模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;在1984年提出&#xff0c;用于促进不同系统间的通信互联。OSI模型将网络通信的过程分为七层&#xff0c;每一层都有其特定的功能&#xff0c;从下至上依次是&#xff1a; 物理层&#x…...

git基础命令(二)

目录 git revert 撤消上一次提交的更改但是会创建一个新的提交来撤消该提交所做的更改git show 显示提交详细信息git mv 重命名文件git rm 从工作树和索引中移除文件git clean 从工作树中移除未跟踪文件git checkout 将文件恢复到工作树git reset 撤销更改、移动 HEAD 指针以及…...

从零开始学习typescript系列 1:typescript 基本了解之是什么,为什么,以及怎么用

初识ts 基本了解 设计者&#xff0c;实现者&#xff1a;微软发行时间&#xff1a;2012年10月1日GitHub&#xff1a;https://github.com/microsoft/TypeScriptts和js关系&#xff1a;ts是js的扩展&#xff0c;ts语法包含js ts是新语言吗&#xff1f; 不是&#xff0c;在js基…...

【数学建模】线性规划

针对未来可能的数学建模比赛内容&#xff0c;我对学习的内容做了一些调整&#xff0c;所以先跳过灰色关联分析和模糊综合评价的代码&#xff0c;今天先来了解一下运筹规划类——线性规划模型。 背景&#xff1a; 某数学建模游戏有三种题型&#xff0c;分别是A&#xff0c;B&am…...

MQTT 的 QoS 等级:QoS 0、QoS 1、QoS 2

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的通信协议&#xff0c;在物联网和消息传递系统中广泛应用。MQTT 提供了三个不同的 QoS&#xff08;Quality of Service&#xff09;等级&#xff0c;用于确保消息的可靠性和传输效率。本文将详细…...

yuzu模拟器完全指南:在PC上免费畅玩Switch游戏的终极教程

yuzu模拟器完全指南&#xff1a;在PC上免费畅玩Switch游戏的终极教程 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu yuzu模拟器是一款开源的任天堂Switch模拟器&#xff0c;让你能够在Windows、Linux和Android设备…...

Diablo Edit2:暗黑破坏神II全版本角色存档编辑器终极指南

Diablo Edit2&#xff1a;暗黑破坏神II全版本角色存档编辑器终极指南 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否厌倦了在暗黑破坏神II中花费数百小时刷装备&#xff1f;是否想要尝试各…...

抖音批量下载器终极指南:如何3分钟搞定无损音乐提取与高效素材管理

抖音批量下载器终极指南&#xff1a;如何3分钟搞定无损音乐提取与高效素材管理 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fa…...

jvm垃圾回收器 - G1详解

G1垃圾收集器发展史与工作原理 G1&#xff08;Garbage First&#xff0c;垃圾优先&#xff09;收集器是JVM垃圾收集技术发展史上的里程碑之作&#xff0c;它开创了面向局部收集的设计思路和基于Region的内存布局形式&#xff0c;定位为CMS收集器的替代者和继承人。一、发展史 1…...

从零到专业:Sunshine虚拟手柄配置的5个关键突破点

从零到专业&#xff1a;Sunshine虚拟手柄配置的5个关键突破点 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾在深夜准备享受游戏时&#xff0c;发现手柄在Sunshine串流中…...

不只是open-vm-tools:让ArchLinux与VMware无缝协作的完整服务清单

不只是open-vm-tools&#xff1a;让ArchLinux与VMware无缝协作的完整服务清单在虚拟化环境中&#xff0c;ArchLinux以其极简和高度可定制的特性吸引着技术爱好者。然而&#xff0c;与VMware的深度集成往往被简化为"安装open-vm-tools"的单一操作&#xff0c;忽略了完…...

不是学框架,是看穿它

不是学框架&#xff0c;是看穿它&#xff1a;20 年政务开发里长出来的一种认知 写给那个拿到新框架先翻源码再写代码的自己。 文章目录不是学框架&#xff0c;是看穿它&#xff1a;20 年政务开发里长出来的一种认知从一个习惯说起一、看穿本质&#xff1a;框架在替你做什么例子…...

Linux 用户管理详解(useradd / userdel / usermod 实战)

前言用户管理是Linux运维基础核心&#xff0c;日常工作中需要频繁创建业务账号、删除废弃账号、修改用户权限信息。本文详解 useradd 创建用户、userdel 删除用户、usermod 修改用户 三大核心命令&#xff0c;搭配生产实战案例、高频参数、避坑技巧&#xff0c;新手可直接落地使…...

Mamba-X:为Vision Mamba模型定制的边缘AI硬件加速器架构解析

1. 项目概述&#xff1a;当视觉Transformer遇上状态空间模型最近在边缘AI硬件加速的圈子里&#xff0c;一个名为“Mamba-X”的设计概念开始被频繁讨论。这名字听起来有点神秘&#xff0c;但核心其实很明确&#xff1a;它瞄准的是当下两个最火热的AI架构趋势——Vision Transfor…...

LeetCode 724:寻找数组的中心下标 | 前缀和的平衡点

LeetCode 724&#xff1a;寻找数组的中心下标 | 前缀和的平衡点 引言 寻找数组的中心下标&#xff08;Find Pivot Index&#xff09;是 LeetCode 第 724 题&#xff0c;难度为 Easy。题目要求在数组中找到某个索引&#xff0c;使得该索引左侧所有元素的和等于右侧所有元素的和。…...