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);}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/855227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

定个小目标之刷LeetCode热题(23)

今天写这道题&#xff0c;背过八股文的都应该知道LRU算法缓存的基本原理&#xff0c;在 Java 语言中&#xff0c;同样有类似的数据结构 LinkedHashMap&#xff0c;本题我们采用自己创建哈希表双链表的形式简单实现一下 对于get操作&#xff1a;通过cache.get(key)获取&#xff…

格雷母线定位与控制系统:确保机车平稳运行的关键

微深节能的格雷母线高精度位移检测系统是一种高精度的位置检测设备&#xff0c;它通过发射和接收信号来确定移动物体的实时位置。在机车定位系统中&#xff0c;格雷母线被安装在固定的轨道上&#xff0c;而机车上的检测装置则负责读取这些信号&#xff0c;从而准确计算出机车的…

一文弄懂 Python os.walk(),轻松搞定文件处理和目录遍历

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ Python os 模块的 walk() 方法以自顶向下或自底向上的方式遍历指定的目录树&#xff0c;从而显示目录树中的文件名。对于目录树中的每个目录&#xff0c;os.walk() 方法都会产生一个包含目录路径、当前…

Java17 --- redis7缓存双写一致性

一、缓存双写一致性 如果redis中有数据&#xff1a;需要和数据库中的值相同。如果redis中没有数据&#xff1a;数据库中的值要是最新值&#xff0c;且准备回写redis。只读缓存。读写缓存&#xff1a;①、同步直写策略&#xff1a;写数据库后也同步写redis缓存&#xff0c;缓存…

光纤三维布里渊温度和应变分布matlab模拟与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 光纤三维布里渊温度和应变分布matlab模拟与仿真。其中 , 布里渊散射是光波与声波在光纤中传播时相互作用而产生的光散射过程 , 在不 同的条件下 , 布里渊散射又分…

70、最长上升子序列

最长上升子序列 题目描述 给定一个长度为N的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数N。 第二行包含N个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1 ≤ N ≤ 1000 &am…

数据结构与算法-字符出现的次数

问题描述 以下是这个找出字符串中字符串出现频率最多的字符。大家可以自行研究一下&#xff0c;题目不难&#xff0c;我今天尝试使用C语言来完成解答&#xff0c;但是在解答过程居然出现了一个意想不到的问题。可能是高级语言用多了&#xff0c;C语言某些函数的限制和风险忘记管…

C++之std::type_identity

目录 1.简介 2.C20的std::type_identity 3.使用 type_identity 3.1.阻止参数推导 3.1.1.模板参数推导过程中的隐式类型转换 3.1.2.强制显式实例化 3.2.阻止推断指引 3.3.类型保持 3.4.满足一些稀奇古怪的语法 4.示例 5.总结 1.简介 std::type_identity 是 C17 引入的…

Spring框架对BeanUtils.copyProperties的优化

前言 在高并发环境下&#xff0c;我们难免要进行大量的存库操作&#xff0c;而一般的操作是监听kafka然后将消息转换成实体类&#xff0c;再使用一些orm框架(mybatis-plus,jpa等)进行入库&#xff0c;我们在将消息转换的时候难免要用到反射&#xff0c;今天我们来讲讲Spring框…

【Python/Pytorch - 网络模型】-- 手把手搭建E3D LSTM网络

文章目录 文章目录 00 写在前面01 基于Pytorch版本的E3D LSTM代码02 论文下载 00 写在前面 测试代码&#xff0c;比较重要&#xff0c;它可以大概判断tensor维度在网络传播过程中&#xff0c;各个维度的变化情况&#xff0c;方便改成适合自己的数据集。 需要github上的数据集…

这些数据可被Modbus采集,你还不知道???

为什么要用Modbus采集模块 Modbus采集模块之所以被广泛使用&#xff0c;是因为它提供了标准化的通信协议&#xff0c;确保了不同设备间的兼容性。它支持多种通信方式&#xff0c;易于实现&#xff0c;并且能够适应不同的网络环境。Modbus模块能够收集和传输各种工业数据&#x…

[递归和栈] Boolean Expressions

描述 The objective of the program you are going to produce is to evaluate boolean expressions as the one shown next: Expression: ( V | V ) & F & ( F | V ) where V is for True, and F is for False. The expressions may include the following operator…

061、Python 包:模块管理

包&#xff08;Package&#xff09;是一种用于组织模块的层次结构。包实际上就是一个包含了__init__.py文件的目录&#xff0c;该文件可以为空或包含包的初始化代码。通过使用包&#xff0c;可以更好地组织和管理大型项目中的模块&#xff0c;避免命名冲突&#xff0c;并提高代…

Hadoop+Spark大数据技术(自命题试卷测试)

试卷一 一、选择题 (每小题2分&#xff0c;共20分) 1. Hadoop 核心组件包括&#xff1a; A. HDFS 和 Hive B. HDFS 和 MapReduce C. HBase 和 Spark D. YARN 和 ZooKeeper 2. HDFS 数据块存储方式的优势不包括&#xff1a; A. 文件大小不受单一磁盘大小…

kettle从入门到精通 第七十一课 ETL之kettle 再谈http post,轻松掌握body中传递json参数

场景&#xff1a; kettle中http post步骤如何发送http请求且传递body参数&#xff1f; 解决方案&#xff1a; http post步骤中直接设置Request entity field字段即可。 1、手边没有现成的post接口&#xff0c;索性用python搭建一个简单的接口&#xff0c;关键代码如下&#…

深度学习模型的生命周期与推理系统架构

目录 深度学习模型的生命周期 ​编辑 深度学习模型的生命周期 推理相比训练的新特点与挑战 推理系统架构 推理系统 vs 推理引擎 顶层:API接口和模型转换 中层:运行时(计算引擎) 底层:硬件级优化 边缘设备计算 主要问题 边缘部署和推理方式 方式1:边缘设备计…

可提供实习证明/实习鉴定报告,企业项目试岗实训开营啦

在数字化转型的浪潮中&#xff0c;大数据和人工智能等前沿技术已成为推动经济发展和科技进步的关键动力。当前&#xff0c;全球各行各业都在积极推进数字化转型&#xff0c;不仅为经济增长注入新活力&#xff0c;也对人才市场结构产生了深刻影响&#xff0c;尤其是对数字化人才…

如何编辑和修改ROM,快速上手

编辑和修改ROM是一个相对复杂的过程&#xff0c;需要一定的技术知识和准备。以下是编辑和修改ROM的详细步骤&#xff0c;供您参考&#xff1a; 一、准备工作 准备一台可root的安卓手机&#xff0c;并确保手机已解锁bootloader。 在电脑上下载并安装ADB&#xff08;Android De…

关于lamda表达式的使用

Lambda表达式是一种匿名函数,即没有函数名的函数,它可以以更简洁、更灵活的方式编写代码。以下是Lambda表达式的常用方式: 无参数,无返回值: 如果抽象方法不带参数且不返回值,可以使用空括号和主体编写Lambda表达式。例如:() -> System.out.println(“Hello, World!…

力扣(2024.06.18)

1. 39——组合总和 给你一个无重复元素的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有不同组合&#xff0c;并以列表形式返回。你可以按任意顺序返回这些组合。candidates 中的同一个数字可以无限制重复被选…