QT中,对于大小端UDP网络发送的demo,帧头帧尾
简单demo:
发送端:
#include <QUdpSocket>
#include <QtEndian>#pragma pack(1)
struct Test
{unsigned char t1:1;unsigned char t2:2;unsigned char t3:3;unsigned char t4:2;quint8 a = 1;quint16 b = 2;quint16 c = 3;//double b = 2;quint8 d = 4;quint8 e = 1;
};
#pragma pack(pop)int main(int argc, char *argv[])
{QApplication app(argc, argv);QByteArray temp_byte_array;Test test;test.b = qToBigEndian(test.b);test.c = qToBigEndian(test.c);test.b = qToBigEndian(test.b);test.t1 = 0x1;test.t2 = 0x2;test.t3 = 0x3;test.t4 = 0x2;QUdpSocket *m_pUdpSocket = new QUdpSocket();m_pUdpSocket->bind(QHostAddress("127.0.0.1"),8002);QByteArray frame = QByteArray((char *)&test, sizeof(Test));m_pUdpSocket->writeDatagram(frame, QHostAddress("127.0.0.1"), 8001);return 0;
}
接收:
#include <QUdpSocket>
#include <QtEndian>#pragma pack(1)
struct Test
{unsigned char t1:1;unsigned char t2:2;unsigned char t3:3;unsigned char t4:2;quint8 a = 0x1;quint16 b = 0x2;quint16 c = 0x3;//double b = 2;quint8 d = 0x4;quint8 e = 0x1;
};
#pragma pack(pop)int main(int argc, char *argv[])
{QApplication app(argc, argv);QUdpSocket *m_pUdpSocket = new QUdpSocket();m_pUdpSocket->bind(QHostAddress("127.0.0.1"),8001);QObject::connect(m_pUdpSocket,&QUdpSocket::readyRead,[=](){QByteArray frame;frame.resize(m_pUdpSocket->pendingDatagramSize());// 接收数据报,将其存放到datagram中m_pUdpSocket->readDatagram(frame.data(), frame.size());struct Test *pFrame = (struct Test *)frame.data();qDebug()<<"a:"<<pFrame->a;qDebug()<<"b:"<<pFrame->b;qDebug()<<"c:"<<pFrame->c;qDebug()<<"d:"<<pFrame->d;qDebug()<<"*****************";});return app.exec();
}
有帧头帧尾:
发送:
#include <QUdpSocket>
#include <QtEndian>// 以1字节对齐:
#pragma pack(1)
struct Test
{// 帧头 0xabcdunsigned short dataHead = 0xabcd;// 小于1字节:unsigned char t1:1;unsigned char t2:2;unsigned char t3:3;unsigned char t4:2;// 小于或者大于1字节quint8 a = 0x1;quint16 b = 0x2;quint16 c = 0x3;quint8 d = 0x4;quint8 e = 0x1;// 包尾 dcbaunsigned short dataTail = 0xdcba;
};
#pragma pack(pop)int main(int argc, char *argv[])
{QByteArray temp_byte_array;Test test;//test.b = qToBigEndian(test.b);//test.c = qToBigEndian(test.c);test.t1 = 0x1;test.t2 = 0x2;test.t3 = 0x3;test.t4 = 0x2;QUdpSocket *m_pUdpSocket = new QUdpSocket();m_pUdpSocket->bind(QHostAddress("127.0.0.1"),8002);QByteArray frame = QByteArray((char *)&test, sizeof(Test));m_pUdpSocket->writeDatagram(frame, QHostAddress("127.0.0.1"), 8001);}
接受:
#include <QUdpSocket>
#include <QtEndian>// 以1字节对齐:
#pragma pack(1)
struct Test
{// 帧头 0xabcdunsigned short dataHead = 0xabcd;// 小于1字节:unsigned char t1:1;unsigned char t2:2;unsigned char t3:3;unsigned char t4:2;// 小于或者大于1字节quint8 a = 0x1;quint16 b = 0x2;quint16 c = 0x3;quint8 d = 0x4;quint8 e = 0x1;// 包尾 dcbaunsigned short dataTail = 0xdcba;
};
#pragma pack(pop)int main(int argc, char *argv[])
{QApplication app(argc, argv);QUdpSocket *m_pUdpSocket = new QUdpSocket();m_pUdpSocket->bind(QHostAddress("127.0.0.1"),8001);QObject::connect(m_pUdpSocket,&QUdpSocket::readyRead,[=](){QByteArray frame;frame.resize(m_pUdpSocket->pendingDatagramSize());// 接收数据报,将其存放到datagram中m_pUdpSocket->readDatagram(frame.data(), frame.size());struct Test *pFrame = (struct Test *)frame.data();if(pFrame->dataHead == 0xabcd && pFrame->dataTail == 0xdcba){qDebug()<<"接收到信息*********";qDebug()<<"a:"<<pFrame->a;qDebug()<<"b:"<<pFrame->b;qDebug()<<"c:"<<pFrame->c;qDebug()<<"d:"<<pFrame->d;qDebug()<<"*****************";}});return app.exec();
}
会发现,如果不是这个帧头和帧尾,就会出问题,只有帧头帧尾正确,才可以正常解析。


注意事项:
1. 结构体前后一定要加1字节对齐,否则可能会多出很多字节,比如你们可以自己尝试不加一字节对齐,然后加入double会增加多少的字节。
2. 接收的时候,不要使用readall() 。
3. 测试的时候,发送不要使用串口调试助手等工具,哪些会出问题。
4. 大小端:很多系统默认小端,如果需要转为大端发送数据,大于1字节的数据,需要使用qToBigEndian()来转换。
相关文章:
QT中,对于大小端UDP网络发送的demo,帧头帧尾
简单demo: 发送端: #include <QUdpSocket> #include <QtEndian>#pragma pack(1) struct Test {unsigned char t1:1;unsigned char t2:2;unsigned char t3:3;unsigned char t4:2;quint8 a 1;quint16 b 2;quint16 c 3;//double b …...
ip网络的三类地址及其相互关系
随着互联网的普及和发展,IP网络已成为全球范围内最重要的信息交换平台。在IP网络中,IP地址是每个设备在网络中的唯一标识,是实现网络通信的关键。虎观代理小二二将详细介绍IP网络中的三类地址,即A类、B类和C类地址,以及…...
开源计算机视觉库OpenCV详细介绍
开源计算机视觉库OpenCV详细介绍 1. OpenCV简介 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它最初由Intel开发,现在由一个庞大的社区维护和更新。OpenCV旨在提供一个通用、跨平台的计算机…...
go消息队列RabbitMQ - 订阅模式-direct
1.发布订阅 在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下: 队列与交换机的绑定,不能…...
PyTorch 2.2 中文官方教程(十八)
开始使用完全分片数据并行(FSDP) 原文:pytorch.org/tutorials/intermediate/FSDP_tutorial.html 译者:飞龙 协议:CC BY-NC-SA 4.0 作者:Hamid Shojanazeri,Yanli Zhao,Shen Li 注意…...
jenkins部署vue项目
首次加载比较慢、需要等待很长时间 到这个页面算是初始化完成了 输入密码路径为 之前设置的路径 可以在文件中找或者 docker logs jenkins 直接安装推荐插件 正在安装中!! 安装成功后创建管理员账号(一定要记住这个也是登录账号密码) 这里实例配置直接…...
十一、C++核心编程(2)引用
一、引用的基本使用 作用: 给变量起别名语法: 数据类型 &别名 原名 #include<iostream> #include<string.h> using namespace std;int main() {//引用基本语法//数据类型 &别名 原名int a 10;//创建引用int &b a;cout << "a "…...
numpy学习总结二
单词发音: squeeze 发音:死贵子 concatenation [kɒnˌktəˈneɪʃən] 拼接;串联 threshold [θreʃhəʊld] 死re后的 quantile 拷n太哦 分位数 因果不能改 智慧不能赐 正法不可说 无缘不能度 天雨虽宽不润无根之草;佛法虽广不度无缘之人 …...
3 编辑器(Vim)
1.完成 vimtutor。备注:它在一个 80x24(80 列,24 行) 终端窗口看起来效果最好。 2.下载我们提供的 vimrc,然后把它保存到 ~/.vimrc。 通读这个注释详细的文件 (用 Vim!), 然后观察 …...
C/C++ (stdio.h)标准库详解
cstdio,在C语言中称为stdio.h。该库使用所谓的流与物理设备(如键盘、打印机、终端)或系统支持的任何其他类型的文件一起操作。 在本文将会通过介绍函数参数,举出实际的简单例子来帮助大家快速上手使用函数。 目录 一、流 二、库函数 1、F…...
深度学习介绍
对于具备完善业务逻辑的任务,大多数情况下,正常的人都可以给出一个符合业务逻辑的应用程序。但是对于一些包含超过人类所能考虑到的逻辑的任务,例如面对如下任务: 编写一个应用程序,接受地理信息、卫星图像和一些历史…...
ywtool dhcp命令
一.dhcp功能介绍 就是通过脚本实现dhcp地址池的增、删、改、查这几个功能日志文件路径: /var/log/ywtools/ywtool-dhcp.log/usr/local/ywtools/config/config.ini中account参数(ywtool dhcp这个命令用的,但是这个命令只能配置1个地址池,所以这里面的参数没什么意义) 二.配置…...
ChatGPT高效提问—基础知识(LM、PLM以及LLM)
ChatGPT高效提问—基础知识(LM、PLM以及LLM) 了解语言模型(language model, LM)、预训练语言模型(pre-trained language model, PLM)和大型语言模型(large language model, LLM)…...
MongoDB复制集实战及原理分析
文章目录 MongoDB复制集复制集架构三节点复制集模式PSS模式(官方推荐模式)PSA模式 典型三节点复制集环境搭建复制集注意事项环境准备配置复制集复制集状态查询使用mtools创建复制集安全认证复制集连接方式 复制集成员角色属性一:Priority 0属…...
Java并发之synchronized详解
☆* o(≧▽≦)o *☆嗨~我是小奥🍹 📄📄📄个人博客:小奥的博客 📄📄📄CSDN:个人CSDN 📙📙📙Github:传送门 📅&a…...
Flask 项目自动生成 API 文档的高效实践
Flasgger,作为一款强大的 Flask 扩展,自动从 Flask 应用中提取并生成 OpenAPI 规范文档,配备 SwaggerUI,为开发者提供了一条快捷通道,让 API 的文档编制和交互式测试变得简单易行。Flasgger 的设计原则是简化开发流程&…...
WebChat——一个开源的聊天应用
Web Chat 是开源的聊天系统,支持一键免费部署私人Chat网页的应用程序。 开源地址:https://github.com/loks666/webchat 目录树 TOC 👋🏻 开始使用 & 交流🛳 开箱即用 A 使用 Docker 部署B 使用 Docker-compose…...
【Linux系统 01】Vim工具
目录 一、Vim概述 1. 文件打开方式 2. 模式切换 二、命令模式 1. 移动与跳转 2. 复制与粘贴 3. 剪切与撤销 三、编辑模式 1. 插入 2. 替换 四、末行模式 1. 保存与退出 2. 查找与替换 3. 分屏显示 4. 命令执行 一、Vim概述 1. 文件打开方式 vim 文件路径&#…...
Oracle 面试题 | 09.精选Oracle高频面试题
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
基于Springboot的校园失物招领网站(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的校园失物招领网站(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…...
Super Qwen Voice World Java面试题精讲:语音处理核心考点
Super Qwen Voice World Java面试题精讲:语音处理核心考点 1. 引言 语音处理技术正在成为Java开发者必须掌握的重要技能之一。无论是智能客服、语音助手还是实时翻译系统,语音处理都扮演着关键角色。Super Qwen Voice World作为业界领先的语音处理解决…...
Graphormer与YOLOv5跨界应用:从分子结构到材料缺陷的视觉识别
Graphormer与YOLOv5跨界应用:从分子结构到材料缺陷的视觉识别 1. 当图神经网络遇上目标检测 你可能很难想象,一个原本用于分析分子结构的AI模型,和一个专门检测图像中物体的算法,能擦出怎样的火花。这就是我们今天要展示的Graph…...
HunyuanVideo-Foley部署教程:vSphere虚拟机中GPU直通RTX4090D配置指南
HunyuanVideo-Foley部署教程:vSphere虚拟机中GPU直通RTX4090D配置指南 1. 环境准备与硬件要求 1.1 硬件配置清单 显卡:RTX 4090D 24GB显存(必须)CPU:10核及以上(推荐Intel Xeon或AMD EPYC)内…...
百度网盘下载加速终极指南:3分钟学会高速下载技巧
百度网盘下载加速终极指南:3分钟学会高速下载技巧 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的龟速下载而烦恼吗?每次下载大文件都…...
StructBERT模型监控方案:性能与质量实时追踪
StructBERT模型监控方案:性能与质量实时追踪 1. 引言 当你把StructBERT模型部署到生产环境后,最担心的是什么?是服务突然崩溃,还是响应速度变慢,或者是模型预测质量下降?这些问题如果等到用户投诉才发现&…...
利用卷积神经网络原理优化万象熔炉·丹青幻境的图像生成效果
利用卷积神经网络原理优化万象熔炉丹青幻境的图像生成效果 最近在玩一个叫“万象熔炉丹青幻境”的AI图像生成工具,效果挺惊艳的,但有时候总觉得生成的图片差点意思——要么细节不够清晰,要么风格不是我想要的。这让我想起了以前做计算机视觉…...
双模型协作!OpenClaw同时调用Qwen3-4B与Codex完成编程任务
双模型协作!OpenClaw同时调用Qwen3-4B与Codex完成编程任务 1. 为什么需要双模型协作 作为一个经常需要写代码的技术博主,我一直在寻找更高效的编程方式。传统的单模型调用虽然能完成基础任务,但在复杂场景下往往力不从心——要么生成的代码…...
OpenClaw故障排查大全:Gemma-3-12b-it接口连接失败解决方案
OpenClaw故障排查大全:Gemma-3-12b-it接口连接失败解决方案 1. 问题背景与典型场景 上周我在本地部署Gemma-3-12b-it模型时,遭遇了OpenClaw连接失败的经典问题。明明模型服务已经启动,OpenClaw网关也显示运行正常,但每次发起请求…...
TreeSize专业评测:德国老牌磁盘分析工具的实力
在Windows系统工具领域,德国软件一向以严谨和专业著称。 TreeSize作为德国的老牌磁盘空间分析工具,多年来一直深受用户信赖。 本文将从专业角度对这款工具进行全面评测,帮助读者更好地了解它的实力。 首先来看TreeSize的定位,它是…...
Candleduino:面向MAB驱动器的跨平台CAN控制库
1. Candleduino库概述:面向MAB Robotics驱动器的跨平台CAN控制解决方案Candleduino是一个专为嵌入式平台设计的Arduino兼容C库,核心目标是实现对MAB Robotics公司MD系列伺服驱动器(Motor Drive)与PDS系列电源分配系统(…...
