5.后台运行设置和包设计与实现

程序的入口点(想让其后台默认.exe进程运行)

也可以不通过vs设置也可以通过定义预处理设置

第三种就是没有窗口的

image-20250910214816892

变成后台运行的了

处理client传来的数据包

第一步:咱们怎么设计一种包呢?

FEFF在网络环境里面出现的概率低所以就采用这个

自己数据包截断了,运行在公网时候有很多嗅探包,其他应用的误发

class CPacket
{public:WORD sHead; //FEFFDWORD nLength; //包长度(从控制命令开始到和校验结束)WORD sCmd; //控制命令,为了对齐习惯用WORDstd::string strData; //要发的包数据WORD sSum;//和校验public:CPacket() :sHead(0), nLength(0), sCmd(0), sSum(0) {}//无参构造函数CPacket(const CPacket& pack) {sHead = pack.sHead;nLength = pack.nLength;sCmd = pack.sCmd;strData = pack.strData;sSum = pack.sSum;}CPacket(WORD nCmd, const BYTE* pData, size_t nSize) { //常量指针,指向的内容不能改变sHead = 0xFEFF; //头nLength = nSize + 2 + 2; //数据的长度加上命令长度加上校验的长度sCmd = nCmd; //命令if (nSize > 0) { //有数据strData.resize(nSize); //给包data容器重新设置长度memcpy((void*)strData.c_str(), pData, nSize); //给包打他字段设置上}else { //没有数据了,头字段和命令字段要清空strData.clear();}sSum = 0; //校验和for (size_t j = 0; j < strData.size(); j++) {sSum += BYTE(strData[j]) & 0xFF;}}CPacket(const BYTE* pData, size_t& nSize) { //一开始传入的这个nSize是传入的一个包总大小size_t i = 0;for (; i < nSize; i++) {if (*(WORD*)(pData + i) == 0xFEFF) {sHead = *(WORD*)(pData + i);i += 2; //解析成功后,给解析失败那里加逻辑break;}} //有没有一种可能性,就是前面杂音数据是不是字节整数倍的情况if (i + 4 + 2 + 2 > nSize) { //解析失败,怕越界呀,数据可能不全,或者包头未能全部接收到吗,这个前提是找到头了nSize = 0; //用掉了0个字节return;}nLength = *(DWORD*)(pData + i); i += 4;if (nLength + i > nSize) { //包未完全接收到,就返回,解析失败,半个包nSize = 0;//用掉了0个字节return;}sCmd = *(WORD*)(pData + i); i += 2;if (nLength > 4) { //这是构成包的前提strData.resize(nLength - 2 - 2);//命令和校验位,长度不包含自身memcpy((void*)strData.c_str(), pData + i, nLength - 4); //将pData + i起始地址的nLength - 4个连续的字节复制到包的data区i += nLength - 4;}sSum = *(WORD*)(pData + i); i += 2;//下面就是和校验的内容了WORD sum = 0;for (size_t j = 0; j < strData.size(); j++) {sum += BYTE(strData[j]) & 0xFF;}if (sum == sSum) {nSize = i;//nLength + 2 + 4;//head length datareturn;}nSize = 0;//解析失败了}~CPacket(){}CPacket& operator=(const CPacket& pack) {if (this != &pack) {sHead = pack.sHead;nLength = pack.nLength;sCmd = pack.sCmd;strData = pack.strData;sSum = pack.sSum;}return *this;}
};

注意nSize是地址传过来的,所以nSize全局跟随,为什么这里不用Length呢?因为前面可能有废数据,所以用nSize(程序里面的i)

接下来继续写上一章没有完成的DealCmd了

	int DealCommand() { //无限循环if (m_client == -1) return -1; //断开连接了//char buffer[1024] = "";char* buffer = new char[4096]; //缓冲区memset(buffer, 0, 4096); //缓冲区置0size_t index = 0; //一开始从0开始的while (true) {size_t len = recv(m_client, buffer + index, 4096 - index, 0); //index是用掉的if (len <= 0) {return -1;}index += len; //可能收到2000个字节的包len = index;m_packet = CPacket((BYTE*)buffer, index); //将缓冲区包化//这个地方出来的index就是处理包获得一段有效包用掉的大小if (len > 0) { //其实这段是废话,能到这里len已经大于0了memmove(buffer, buffer + len, 4096 - len);//从buffer + len复制4096-len个字节到buffer,将下一个包数据往前挪index -= len; //可能只用1000个return m_packet.sCmd;}}return -1;}

index表示整个缓冲区当前剩余的字节(可能用掉了一个包,可能用掉了多个包)

len在包处理以前(CPacket)表示包的长度,在包处理以后(CPacket)表示这个完整的包用掉了多少字节

本质就是客户端丢一坨数据(一般不超过4KB),自己想办法解析

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

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

相关文章

【开题答辩全过程】以 基于微信小程序校园综合服务平台的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

地级市人口集聚、经济集聚、产业集聚与绿色经济效率匹配数据(含区域经济研究相关的控制变量,Excel|shp|免费数据)

D006 地级市人口集聚、经济集聚、产业集聚与绿色经济效率匹配数据&#xff08;含区域经济研究相关的控制变量&#xff0c;Excel|shp|免费数据&#xff09;数据简介今天我们分享的数据是2004-2020年地级市人口聚集、经济聚集与绿色经济效率匹配数据&#xff0c;并对其进行可视化…

视觉SLAM第7讲:视觉里程计2(3D-2D:PnP、3D-3D:ICP)

接上文&#xff0c;视觉SLAM第7讲&#xff1a;视觉里程计1&#xff08;特征点法、2D-2D对极约束&#xff09;&#xff0c;本节主要学习3D-2D:PnP、3D-3D:ICP。 目录 7.7 3D-2D:PnP 7.7.1 直接线性变换&#xff08;DLT&#xff09; 7.7.2 P3P 1.原理 2.小结 7.7.3 最小化重…

友元的功能解析

目录 一、友元的作用 二、实例说明 1. 友元方法 例&#xff1a; 2.友元类 例&#xff1a; 三、注意事项 一、友元的作用 1. 可以让一个类外 函数 或 类对象 访问一个 类内私有 成员或方法。 二、实例说明 1. 友元方法 例&#xff1a; 用friend 关键字在Tom 类中声明…

GNSS校准气压计

1、gnss信号较好的时候得到的GNSS高&#xff0c;得到海拔高。2、气压计数据转到标准数据然后计算出来海拔高。3、gnss高作基准 - 气压高 高差 &#xff1b;需要修正的是气压偏差&#xff0c;那么如何得到气压偏差1&#xff09;用gnss高 反求出一个气压&#xff0c;这个气压与…

基于Springboot + vue3实现的校园二手交易平台

项目描述本系统包含管理员、用户两个角色。管理员角色&#xff1a;用户管理&#xff1a;管理系统中所有用户的信息&#xff0c;包括添加、删除和修改用户。配置管理&#xff1a;管理系统配置参数&#xff0c;如上传图片的路径等。权限管理&#xff1a;分配和管理不同角色的权限…

新型存储介质应用:CXL内存扩展技术与AI工作负载适配

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 引言&#xff1a;AI计算的内存瓶颈挑战 当前AI技术发展正面临着一…

Java 多线程(二)

目录synchronized刷新内存synchronized的特性可重入的出现死锁的情况如何避免死锁&#xff08;重点&#xff0c;死锁的成因和解决&#xff09;volatile关键字wait和notify多线程的代码案例饿汉模式和懒汉模式的线程安全问题指令重排序问题阻塞队列使用自己实现一个阻塞队列实现…

MySql 内外连接

1.内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连 接&#xff0c;也是在开发过程中使用的最多的连接查询。 语法&#xff1a;select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件&#xff1b;备注&…

【大前端】 断点续传 + 分片上传(大文件上传优化) 的前端示例

写一个 断点续传 分片上传&#xff08;大文件上传优化&#xff09; 的前端示例。这样即使网络中断&#xff0c;文件也可以从已上传的部分继续传&#xff0c;不需要重新传整个大文件。&#x1f539; 分片上传 断点续传思路分片切割&#xff1a;把大文件切成固定大小的小块&…

机器学习的发展与应用:从理论到现实

目录 引言 一、机器学习的发展历程 1. 萌芽阶段&#xff08;1950s–1970s&#xff09; 2. 符号主义与统计学习阶段&#xff08;1980s–1990s&#xff09; 3. 数据驱动与算法突破&#xff08;2000s–2010s&#xff09; 4. 深度学习崛起&#xff08;2012年至今&#xff09; …

Python实现讯飞星火大模型Spark4.0Ultra的WebSocket交互详解

核心架构设计与初始化机制 代码采用面向对象的设计模式构建了Ws_Param类作为核心配置载体。该类在初始化时接收四个关键参数:APPID(应用标识)、APIKey(接口密钥)、APISecret(签名秘钥)和Spark_url(服务端点地址)。通过urlparse模块解析URL结构,分离出主机名(host)与…

如何通过Linux在高通跃龙QCS6490 平台上优化部署AI/ML模型?

简介 高通于今年推出了高通跃龙&#xff0c;在边缘提供前沿的AI性能和超低延迟&#xff0c;为可扩展的工业创新带来新的可能性。研华已在各种规格尺寸的嵌入式方案中采用跃龙技术&#xff0c;包括由高通跃龙 QCS6490处理器支持的嵌入式模块、单板电脑和AI摄像头解决方案。研华…

MySQL内核革新:智能拦截全表扫描,百度智能云守护数据库性能与安全

在日常数据库运维中&#xff0c;“扫表风暴”数次悄然而至——某条未走索引的 SQL 突然执行全表扫描&#xff0c;短短几分钟内吃光 IO、拖高 CPU&#xff0c;最终引发集群抖动甚至服务不可用。这样的事故&#xff0c;你是否也曾经历过&#xff1f; 全表扫描&#xff08;Full Ta…

TCP 三次握手、四次挥手

三次握手 三次握手形象版&#xff0c;快速理解 deepseek 的象形比喻&#xff1a;三次握手建立连接就像打电话一样&#xff1a; (1) A 打给 B&#xff0c;“喂&#xff0c; 你能听到我说话吗&#xff1f;” (2) B 回答 A&#xff0c;“嗯&#xff0c;可以听到&#xff0c;你能听…

数据管理战略|1概念及组成部分

【小语】前面两个文章讲到了“数据管理战略数字化转型、数据驱动”三者之间关系,数字化改革中的原则与逻辑,本节用三次文章学习数据管理战略内容的组成部分(DAMA数据管理第1章1.2.6节)。 数据战略 VS 数字化转型 VS 数据驱动 数据管理战略|熵减与熵增相容原则 下文为【…

3.远程控制网络编程的设计上

RemoteCtrl.cpp// RemoteCtrl.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include "pch.h" #include "framework.h" #include "RemoteCtrl.h"#ifdef _DEBUG #define new DEBUG_NEW #endif// 唯一的应用程序对象C…

毕业设计|基于Python的课程智能问答系统

4系统设计4.1功能模块设计对本系统进行全面的系统功能的分析&#xff0c;可以得出基于Python《Python程序设计》课程智能问答系统的功能模块图&#xff0c;如图4-1所示。图4-1 系统功能模块图4.2数据库设计4.2.1数据库设计原则学习程序设计时&#xff0c;若想要深入理解数据库管…

iOS原生开发和Flutter开发的看法

这是一个技术选型的问题。作为一名同时精通iOS原生和Flutter的开发者&#xff0c;我的看法是&#xff1a;这不是一个“二选一”的问题&#xff0c;而是一个“如何根据场景做最佳选择”的问题。 它们不是替代关系&#xff0c;而是互补关系。以下是我对两者的对比和看法&#xff…

docker桌面版 镜像配置

配置内容 Docker Engine配置*&#xff08;截止2025年09月10日能用&#xff09; {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": [&q…