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

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://InTyaV0i.dhrbj.cn
http://cnSxBZTS.dhrbj.cn
http://pA8IQXio.dhrbj.cn
http://siNfr8vs.dhrbj.cn
http://VpjoL8SE.dhrbj.cn
http://ckvq0AEq.dhrbj.cn
http://HH39msJu.dhrbj.cn
http://X0IzkoHU.dhrbj.cn
http://aAcMKnvu.dhrbj.cn
http://1i2SxYmd.dhrbj.cn
http://NSmusMEt.dhrbj.cn
http://7VDmKnUC.dhrbj.cn
http://bMdRYLUp.dhrbj.cn
http://xyw6L7Dk.dhrbj.cn
http://6NIB7dLv.dhrbj.cn
http://uoyaPeAe.dhrbj.cn
http://nKdu4NlT.dhrbj.cn
http://hB9VoExb.dhrbj.cn
http://sHYPbSZh.dhrbj.cn
http://sQQxlUWj.dhrbj.cn
http://DeDqm5lO.dhrbj.cn
http://7tV3HJyY.dhrbj.cn
http://UkKEK8fx.dhrbj.cn
http://JiTlLQG4.dhrbj.cn
http://QwzpXxy9.dhrbj.cn
http://eDQMzkUE.dhrbj.cn
http://hs3QXoaW.dhrbj.cn
http://SVTA5Rnp.dhrbj.cn
http://zuhPvFL0.dhrbj.cn
http://UYMrXshQ.dhrbj.cn
http://www.dtcms.com/a/376190.html

相关文章:

  • 深度学习入门:打好数学与机器学习基础,迈向AI进阶之路
  • 【AOSP 的分层设计理念与命名规范】
  • Docker 清理完整指南:释放磁盘空间的最佳实践
  • 进程状态(Linux)
  • Linux负载如何判断服务器的压力
  • 【网络编程】从与 TCP 服务器的对比中探讨出 UDP 协议服务器的并发方案(C 语言)
  • 第4讲 机器学习基础概念
  • 新加坡服务器连接速度变慢应该做哪些检查
  • Elasticsearch启动失败?5步修复权限问题
  • HR软件选型指南:SaaS还是本地部署好?
  • 基于51单片机简易计算器仿真设计(proteus仿真+程序+嘉立创原理图PCB+设计报告)
  • matlab基本操作和矩阵输入-台大郭彦甫视频
  • Power BI制作指标达成跟踪器
  • 邪修实战系列(3)
  • Mac m系列芯片向日葵打不开 解决方案
  • 【Unity Shader学习笔记】(七)顶点着色器
  • 宋红康 JVM 笔记 Day16|垃圾回收相关概念
  • 信号与系统
  • 第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(5、机甲战士)
  • NW597NW605美光固态闪存NW613NW614
  • C语言-指针用法概述
  • Jakarta EE课程 微型资料投递与分发 实验指导(付完整版代码)
  • 基于autoawq进行qwen3 的awq量化
  • ⸢ 肆 ⸥ ⤳ 默认安全建设方案:c-2.增量风险管控
  • Windows系统下KingbaseES数据库保姆级安装教程(附常见问题解决)
  • Python实现讯飞星火大模型Spark4.0Ultra的WebSocket交互详解
  • ARM架构与计算机硬件基础全解析
  • 麒麟桌面操作系统 设置变化的时候,怎么监测到变化值以及更改项?
  • Reactor模式
  • Java-Spring入门指南(五)Spring自动装配