72-UDP协议工作原理及实战
#ifndef UDPCOMM_H
#define UDPCOMM_H#include <QMainWindow>
#include <QUdpSocket> // 用于发送和接收UDP数据报
#include <QtNetwork>QT_BEGIN_NAMESPACE
namespace Ui { class udpComm; }
QT_END_NAMESPACEclass udpComm : public QMainWindow
{Q_OBJECTpublic:udpComm(QWidget *parent = nullptr);~udpComm();private slots:void on_pushButton_start_clicked();void on_pushButton_stop_clicked();void on_pushButton_sengmsg_clicked();void on_pushButton_broadastmsg_clicked();private:Ui::udpComm *ui;// 自定义函数获取本机的IP地址
public:QUdpSocket *udpsocket;QString GetLocalIpAddress(); // 获取本机IP地址// 自己定义槽
private slots:void SocketReadyReadData(); // 读取socket传输数据信息
};
#endif // UDPCOMM_H//.c#include "udpcomm.h"
#include "ui_udpcomm.h"
#include <QMessageBox>udpComm::udpComm(QWidget *parent): QMainWindow(parent), ui(new Ui::udpComm)
{ui->setupUi(this);QString strip=GetLocalIpAddress(); // 调用此函数返回对应本机IP地址QMessageBox::information(this,"结果",strip,QMessageBox::Yes);ui->comboBoxtargetip->addItem(strip); // 将IP地址显示到comboBox控件udpsocket=new QUdpSocket(this);connect(udpsocket,SIGNAL(readyRead()),this,SLOT(SocketReadyReadData()));}udpComm::~udpComm()
{delete ui;
}void udpComm::on_pushButton_start_clicked()
{quint16 port=ui->spinBoxbindport->value(); // 本机UDP端口if(udpsocket->bind(port)){ui->plainTextEditdispmsg->appendPlainText("**********绑定成功**********");ui->plainTextEditdispmsg->appendPlainText("$$$$$$$$$$绑定端口$$$$$$$$$$:"+QString::number(udpsocket->localPort()));ui->pushButton_start->setEnabled(false);ui->pushButton_stop->setEnabled(true);}else{ui->plainTextEditdispmsg->appendPlainText("**********绑定失败**********");}
}void udpComm::on_pushButton_stop_clicked()
{udpsocket->abort();ui->pushButton_start->setEnabled(true);ui->pushButton_stop->setEnabled(false);ui->plainTextEditdispmsg->appendPlainText("**********已经停止服务**********");}void udpComm::on_pushButton_sengmsg_clicked()
{QString targetIpAddress=ui->comboBoxtargetip->currentText(); // 获取目标IP地址QHostAddress targetaddress(targetIpAddress);quint16 targetport=ui->spinBoxtargetport->value(); // 获取端口QString strmsg=ui->lineEditmsg->text(); // 获取发送消息内容QByteArray str=strmsg.toUtf8();udpsocket->writeDatagram(str,targetaddress,targetport); // 发送数据报信息ui->plainTextEditdispmsg->appendPlainText("[out]:"+str);ui->lineEditmsg->clear(); // 清除编辑框控件内容ui->lineEditmsg->setFocus(); // 将光标焦点定位到编辑框控件}void udpComm::on_pushButton_broadastmsg_clicked()
{quint16 targetport=ui->spinBoxtargetport->value(); // 获取端口QString strmsg=ui->lineEditmsg->text(); // 获取发送消息内容QByteArray str=strmsg.toUtf8();udpsocket->writeDatagram(str,QHostAddress::Broadcast,targetport); // 发送数据报信息ui->plainTextEditdispmsg->appendPlainText("[broadcast]:"+str);ui->lineEditmsg->clear(); // 清除编辑框控件内容ui->lineEditmsg->setFocus(); // 将光标焦点定位到编辑框控件
}QString udpComm::GetLocalIpAddress()
{// 根据主机名称,获取IP地址QString strHostName=QHostInfo::localHostName();QHostInfo hostinfo=QHostInfo::fromName(strHostName); // 通过主机名称获取IP地址QString strLocalIp="";QList<QHostAddress> addresslist=hostinfo.addresses(); // IP地址列表if(!addresslist.isEmpty()){for(int i=0;i<addresslist.count();i++){QHostAddress hostaddr=addresslist.at(i);if(QAbstractSocket::IPv4Protocol==hostaddr.protocol()){strLocalIp=hostaddr.toString();break;}}}return strLocalIp;
}void udpComm::SocketReadyReadData()
{// 读取接收到的数据报信息// 用此函数返回true至少有一个数据报需要读取while(udpsocket->hasPendingDatagrams()){QByteArray datagrams;datagrams.resize(udpsocket->pendingDatagramSize());QHostAddress paddress;quint16 pport;// 通过readDatagram()此函数读取数据报,udpsocket->readDatagram(datagrams.data(),datagrams.size(),&paddress,&pport);QString strs=datagrams.data();QString peer="[From:"+paddress.toString()+":"+QString::number(pport)+"]:";ui->plainTextEditdispmsg->appendPlainText(peer+strs);}
}
相关文章:

72-UDP协议工作原理及实战
#ifndef UDPCOMM_H #define UDPCOMM_H#include <QMainWindow> #include <QUdpSocket> // 用于发送和接收UDP数据报 #include <QtNetwork>QT_BEGIN_NAMESPACE namespace Ui { class udpComm; } QT_END_NAMESPACEclass udpComm : public QMainWindow {Q_OBJECT…...
数据结构——顺序表的实现
数据结构——顺序表的实现 一 关于顺序表的简单知识二 动态顺序表 一 关于顺序表的简单知识 1.顺序表的底层结构是数组,在数组的基础上增加了增,删,查,改等方法。 2.顺序表的分类:静态顺序表和动态顺序表 静态顺序表的…...

【牛客面试必刷TOP101】Day33.BM70 兑换零钱(一)和BM71 最长上升子序列(一)
文章目录 前言一、BM70 兑换零钱(一)题目描述题目解析二、BM71 最长上升子序列(一)题目描述题目解析总结 前言 一、BM70 兑换零钱(一) 题目描述 描述: 给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币…...
重构与优化-优化函数调用(5)
Rename Method Rename Method(“函数改名”),它的核心目标是通过修改方法的名称来更好地反映其功能,提高代码的可读性和维护性。这项重构不仅适用于Java,也同样适用于其他面向对象的编程语言。下面是进行Rename Method重构时的一些关键点和步骤: 关键目的 提升代码清晰…...

6月18日(周二)A股行总结:A股震荡收涨,车路云概念全日强势,10年、30年国债期货齐创新高
车路云概念股发力上涨,中海达、华铭智能等多股20CM涨停。半导体板块走强,中芯国际港股上涨近3% 。白酒板块下跌,贵州茅台跌1.3% 。30年期及10年期国债期货主力合约均创上市以来新高。 周二,A股全日窄幅震荡 沪指收涨0…...

今年的618,似乎很平淡!
电商平台取消预售制度的第一个大促,快递业表现如何? 今年的618大促与往年有些不同,自4月起,天猫、京东、快手等主流平台相继官宣取消预售,打出“现货开卖”标签,这意味着消费者不用再被“烧脑”的优惠计算…...

嵌入式中间件_3.嵌入式中间件的一般架构
根据嵌入式中间件的不同类型和其应用对象的不同,其架构也有所不同,通常嵌入式中间件没有统一的架构,这里仅仅列举两种中间件架构。 1.消息中间件 1.1消息中间件原理架构 消息中间件是消息传输过程中保存消息的一种容器。它将消息从它的源中…...

Java基础 - 练习(二)打印菱形
Java基础练习 打印菱形,先上代码: // 方法一:基础,好理解 public static void diamond() {//控制行数for (int i 1; i < 4; i) {//空格的个数for (int k 1; k < 4 - i; k) {System.out.print(" ");}//控制星星…...

链表OJ--超详细解析
链表OJ 文章目录 链表OJ1. 反转链表2. 返回K值3. 链表的中间节点4. 回文链表5. 相交链表6. 带环链表6.1 为什么一定会相遇,有没有可能会错过,或者出现永远追不上的情况,请证明6.2 slow一次走一步,fast如果一次走3步,走…...

JavaFX 分隔符
Separator类表示水平或垂直分隔线。它分割元素,不产生任何动作。 我们可以设计风格,应用视觉效果,并为分隔符设置动画。 默认情况下,分隔符是水平的。我们可以使用setOrientation方法改变它的方向。 Separator类扩展了Node类。…...
mysql安装配置教程(Linux+Windows)
mysql安装配置教程(LinuxWindows) 文章目录 mysql安装配置教程(LinuxWindows)摘要在 Linux 上安装和配置 MySQL1. 安装 MySQLUbuntu/DebianCentOS/RHEL 2. 配置 MySQL初始化 MySQL登录 MySQL创建数据库和用户配置 MySQL 文件 3. 测…...

MySQL数据库与基本操作(增删改查)
一、数据库的基本概念 数据库要学习的四个基本概念,主要是:数据、数据库系统、数据库、数据管理系统。数据(Date)是描述事物的记录,数据库系统(DBS),数据库管理系统(DBMS…...
【学习总结】SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习)
最近在学习若依这个开源项目,发现他记录登录日志的时候使用了异步线程去记录日志,觉得这个方案也挺不错的,在此学习记录下来,以后在工作中也能提供一种思路,其他小伙伴如果有觉得不错的方案也可以在评论区里留言&#…...

shell脚本编程(概念、编程和语句)
一、shell脚本概述 1、shell脚本概念 Shell 脚本是利用 shell 的功能所写的一个程序。这个程序是使用纯文本文件,将一些 shell 的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能。 2、Shell 脚…...

设置角色运动的动画
(1) 打开Assets-UnityTechnologies-Animation-Animators,Create-Animation-Controller,命名为JohnLemon (2) 打开JohnLemon,出现下图 (3) 依次将Assets-UnityTechnologies-Animation-Animation中的JohnIdle和JohnWalk拖放到Base Layer窗口中 (4) 右击Idl…...

OKR:2024年目标和关键成果常见问题
什么是目标和关键结果(OKR)? 目标和关键结果(#OKR#)是一种由结果驱动的目标制定方法。在企业中,OKR经常被用来指导基于结果的成功。使用结果而不是任务作为驱动力,OKRs 鼓励通过度量指标对实现成…...
轻量级 ioc/aop 框架 loveqq 1.0 发布,完全替换掉若依底层 spring 及其 starter
loveqq-framework 轻量级 ioc/aop 框架,比 spring 更强大的条件注解推断,打包后支持 jar index 启动。 本次更新: 正式更名为:loveqq-famework 新增:loveqq-boot-starter-mybatis 新增:loveqq-boot-start…...

【递归、搜索与回溯】DFS解决FloodFill算法
一、经验总结 之前我们已经研究过了BFS解决FloodFill算法:【优选算法】BFS解决FloodFill算法-CSDN博客 DFS只是遍历顺序发生了变化,其他需要注意的点大差不差。 二、相关编程题 2.1 图像渲染 题目链接 733. 图像渲染 - 力扣(LeetCode&am…...

【Spine学习12】之 事件帧
1、新建事件帧: 2、选择第8s的攻击帧,点击第一步新建的attack事件帧前面的钥匙 这样每次动作到8s的时候会自动跳出事件帧提示 这个文字实际动画不会显示 事件是动画过程中所发生情况的触发器。 给程序员识别的...

【C语言习题】31.冒泡排序
文章目录 作业标题作业内容2.解题思路3.具体代码 作业标题 冒泡排序 作业内容 实现一个对整形数组的冒泡排序 2.解题思路 先了解一下冒泡排序: 两两相邻的元素进行比较,如果前面元素大于后面元素就交换两个元素的位置,最终的结果是最大的…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...