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
英文地址,請注明出處:http://en.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…