建设品牌公司网站页面模板配置

pingmian/2026/1/25 14:18:19/文章来源:
建设品牌公司网站,页面模板配置,郑州今天的最新消息,搜索网站排名软件目录 前言#xff1a; 场景#xff1a; 原因#xff1a; 解决#xff1a; 方案2具体细节#xff1a; 纯C服务端处理如下#xff1a; Qt客户端处理如下#xff1a; 前言#xff1a; tcp协议里面#xff0c;除了心跳检测是关于长连接操作的处理#xff0c;这个在…目录 前言 场景 原因 解决 方案2具体细节 纯C服务端处理如下 Qt客户端处理如下 前言 tcp协议里面除了心跳检测是关于长连接操作的处理这个在前一篇已经提到过了这一篇将会对tcp本身的一个问题进行处理那就是做网络通信大概率会遇到的问题粘包、拆包问题碰到这类问题对于新手来说都是比较棘手的需要好好处理一下。 场景 使用tcp协议的时候 1、我明明发单个小包都很正常呀没啥问题呀怎么我对单个小包多发几次频率快一些就会数据错乱了 2、我明明发小包都好着怎么发打包就不行了很奇怪呢 其实这2个场景你用抓包工具一抓分析一下封包内容就会一目了然。 原因 最本质的原因是tcp协议发送数据的时候是不会告诉对方当前发送的数据包有多大的这是协议头决定的如果接收端用一个很大的缓冲区来接收发送端的小包的时候就有可能一下子接收到多个小包从而导致粘包现象如果用一个较小的缓冲区来接收发送端的较大的数据包也会导致一个包收不完得分好多次才能接收完导致拆包现象 解决 要解决粘包或者拆包问题 有如下几个方案 方案1可以给数据包前后加上一些特殊标识用来区分头尾这个方案的缺陷是必须找好特殊标识万一数据内容也包含特殊标识就会导致解包错误 方案2可以给数据包加上一个数据头在数据头里面加上一个长度信息来表示整个封包的长度通过长度来进行收包和解包这个方案的操作是把整个包看成两部分数据头数据体先收数据头取出长度来开辟指定长度的缓冲区先把数据头拷贝到缓冲区接着再把剩余的数据体内容接收到缓冲区剩余区域里即可。 方案3可以把方案1、方案2结合起来不过方案还是过于复杂但也相对安全。 下面就以方案2来进行代码演示 方案2具体细节 1、由于是C实现的可以给应用层封装一个私有协议那就使用结构体来作为私有协议。 结构体声明如下 enum TypeInfo {HEART_CHECK_REQ, // 心跳检测请求HEART_CHECK_RES, // 心跳检测响应LOGIN_REQ, // 登录请求LOGIN_RES, // 登录响应UPLOAD_REQ, // 文件上传请求UPLOAD_RES, // 文本上传响应 };struct Head {int flag;int type;int len; };struct HeartCheckReq {Head head;HeartCheckReq(){head.flag 0; // 0 表示软件客户端1表示硬件客户端head.type HEART_CHECK_REQ;head.len sizeof(HeartCheckReq);} };struct HeartCheckRes {Head head;HeartCheckRes() {head.flag 0;head.type HEART_CHECK_RES;head.len sizeof(HeartCheckRes);} }; 纯C服务端处理如下 收包线程函数代码 void ServerSocket::recvAndSendThread(SOCKET client) {// 循环收发包保存长连接通信while (true){/*char buffer[1024] { 0 };int len_recv recv(client, buffer, sizeof(buffer), 0);cout len_recv: len_recv endl;if (len_recv 0) {cout socket收包异常: WSAGetLastError() endl;break;}*/// 解决粘包或拆包问题char *head_buffer new char[sizeof(Head)];int len_recv recv(client, head_buffer, sizeof(Head), 0);int head_rest sizeof(Head) - len_recv;while (head_rest 0) { // 还有没收完的len_recv recv(client, head_buffer (sizeof(Head) - head_rest),head_rest , 0);head_rest - len_recv;}// 表示结构体头收完了,可以拿出总长度int len_total ((Head*)head_buffer)-len;char *buffer new char[len_total];memcpy(buffer, head_buffer, sizeof(Head)); // 先把数据头拷贝进去int len_rest len_total - sizeof(Head); // 算出剩余长度while (len_rest 0) {len_recv recv(client, buffer (len_total - len_rest), len_rest, 0);len_rest - len_recv;}// 正常m_clientSockets[client] HEART_CHECK_TIMES; // 重置心跳阈值cout buffer: buffer endl;int type ((Head*)buffer)-type;if (type 100) {Data *d (Data*)buffer;cout 收到内容: d-data endl;}else if (type HEART_CHECK_REQ) {// 收到心跳包// 回一个响应包cout 收到心跳请求包 endl;HeartCheckRes res;send(client, (char*)res, res.head.len, 0);}else if (type UPLOAD_REQ) {// 上传版本文件cout 收到版本管理上传文件包 endl;UploadFileReq *req (UploadFileReq*)buffer;cout req-file_info.file_name md5: req-file_info.md5 size: req-file_info.file_size endl old: req-file_info.old_version endl;// 服务端的业务将文件写到指定目录并且在数据库中记录相应的信息// 保存了之后回一个响应包给客户端UploadFileManager upload;upload.business(client, req);}// 将收到的数据原封不动的回给客户端// send(client, buffer, len_recv, 0);// 释放内存,防止内存泄露delete[] head_buffer;delete[] buffer;head_buffer nullptr;buffer nullptr;}closesocket(client); // 关闭客户端套接字 } Qt客户端处理如下 收包槽函数代码 这里要注意的是Qt的网络通信是异步的不能像纯windows服务端那样使用recv来阻塞收包所以采用了一个全局变量来存储数据包当然也可以考虑使用静态局部变量或者成员变量来处理本文为了表示得更加直白选择使用了全局变量 g_allBuffer。 QByteArray g_allBuffer; // 全局缓冲区用来保存收到的封包内容 void TcpMainWindow::myRead() {QByteArray buffer m_client-readAll();g_allBuffer.append(buffer);int len g_allBuffer.size();while(len 0){if(len sizeof(Head)) break; // 不满足数据头大小继续收包int len_total ((Head*)(g_allBuffer.data()))-len;if(len len_total) break; // 不满足全部大小继续收包QByteArray datas g_allBuffer.left(len_total); // 可能会收到多个先拿一个出来出来emit unpackSignal(datas);g_allBuffer g_allBuffer.mid(len_total); // 处理完了将后面的挪到前面来len g_allBuffer.size();} } 解包业务槽代码如下 void TcpMainWindow::unpackSlot(QByteArray buffer) {QString buf buffer;ui-label-setText(buf);m_heartCheckTimes HEART_CHECK_TIMES; // 重置阈值int type ((Head*)buffer.data())-type;if(type 100){Data *d (Data*)buffer.data();qDebug()收到:d-data;buf d-data;ui-label-setText(buf);}else if(type HEART_CHECK_RES){// 收到心跳响应包qDebug()收到心跳响应包;} }最后以上只提供了核心代码哪里有不清楚的可以留言谈论一些细节也可以关注后私信给回复可以发完整工程代码。

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

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

相关文章

制做网站首先应该怎么做工商注册地址有什么要求

使用 UNIX 权限保护文件通过 UNIX 文件权限和 ACL 可保证文件安全。带 sticky 位的文件和可执行文件要求特殊的安全措施。用于查看和保证文件安全的命令下表介绍了用于监视以及保证文件和目录安全的命令。表 7-1 保证文件和目录安全的命令命令说明手册页ls列出目录中的文件及其…

做视频链接哪个网站没有广告南昌做网站公司

随着国家信息化建设的不断深入,信息技术创新(信创)已成为推动我国经济发展的重要动力。在这样一个大环境下,信创运维作为保障信创环境稳定、高效运行的关键环节,其重要性日益凸显。本文将探讨信创运维的发展背景、数字…

陕西 网站建设wordpress给代码高亮

单选题 1、电子邮件地址中一定会出现的字符() A、- B、 C、! D、# 答案:B 2、以下常见的电脑硬件中,()不是一种输入设备 A、鼠标 B、键盘 C、触摸板 D、显示器 答案:D 3、…

嘉兴网站关键词沈阳网页设计兼职

Overview — OpenOFDM 1.0 documentation 本篇文章为学习OpenOFDM之后的产出PPT,仅供学习参考。

做的网站如何放在电脑上常见网站颜色搭配

1.全局变量[其不属于面向对象的思想,因为其放在对象之外的],面向对象有一个特点,其实封装的,php希望其所有的成员都应该放在类中;php的面向对象是基于面向对象的,不是纯粹面向对象的;也就是其可…

网站开发培训要多少钱自动的微信小程序开发

1. 系统设计 本次智能饮水机控制系统的设计研究一款以STC89C52单片机为核心的智能饮水机控制系统,其主要功能设计如下: 1.该饮水机利用DS18B20数字温度传感器实时采集饮水机内水的温度,其检测温度范围为0-100℃,精度0.1℃&#…

鼎湖网站建设广州电商小程序开发

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣121. 买卖股票的最佳时机二、力扣122.买卖股票的最佳时机II 前言 一、力扣121. 买卖股票的最佳时机 class Solution {public int maxProfit(int[] pr…

网站建设玖金手指排名14100个创意创业项目

开发/测试模型 瀑布模型 设计:技术文档(设计那些接口,库表,mq,定时任务),UI视觉稿 特点:线性的结构。 优点:每个阶段做什么,产出什么非常清晰 缺点:测试人员介入太晚…

中堂东莞网站建设合肥大型网站设计

一、什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据&#xf…

怎样做自己网站免费服务器ip

文章目录 环境软件版本服务器系统初始化设置关于etcd签名证书etcd集群部署负载均衡器组件安装设置关于k8s自签证书自签CAkube-apiserver 自签证书kube-controller-manager自签证书kube-scheduler自签证书kube-proxy 自签证书admin 自签证书 控制平面节点组件部署**部署kube-api…

网页设计项目报告总结做搜狗网站优化

0x0 最近在clone yaffs2仓库时发现clone的异常缓慢,就算开了代理也是,搜索一番发现网上大多都是将设置http、https、ssh协议的代理,对于git协定的代理讲的很少,下面分享下如何让git协议走socks代理 以下内容前提是里已经在电脑上…

外贸公司网站建设哪家好福州建设发展集团有限公司网站

Infortrend 使企业能够实现高效和可靠的数据备份,确保业务不间断的运行,保护有价值的业务信息。用户可以依靠我们的存储解决方案实现恢复时间目标(RTO)和恢复点目标(RPO),用于广泛的备份应用场景…

交互式网站是什么意思深圳市住房和建设局办事大厅

目录 文章导航一、字段解释1、电站基础信息表2、电站事实表 二、需求三、操作步骤1、将新增一列日期12、以左关联的形式增加装机容量3、年度发电总量4、年度售电完成率4、发电量及发电效率5、年售电完成比、售电回款比、管理费用比、运维费用比5、总装机容量6、最近日期7、最近…

可以做富集分析的网站国内最大设计网站

转自 http://blog.sina.com.cn/s/blog_4fd2a65a0101gg2o.html 在做安卓应用是我们经常要判断用户对返回键的操作,一般为了防止误操作都是在用户连续按下两次返回键的时候提示用户是否退出应用程序。 第一种实现的基本原理就是,当按下BACK键时&#xff0c…

网站开发程序制作域名备案公众号外链网站怎么做

点击上方“占小狼的博客”,选择“设为星标“本文阅读时间大约4分钟。来源:https://dwz.cn/dLRLBZabJava虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的 Java 线程状态均来自于 Thr…

绍兴网站网站建设做网站买服务器

一 、伪类(不存在的类,特殊的类) -伪类用来描述一个元素的特殊状态 比如:第一个元素,被点击的元素,鼠标移入的元素 -特点:一般请情况下,使用:开头 1、 :first-child …

株洲建设网站制作深圳市住房和建设局官网站首页

Mysql之聚合函数 什么是聚合函数常见的聚合函数GROUP BYWITH ROLLUPHAVINGHAVING与WHERE的对比 总结SQL底层原理 什么是聚合函数 对一组数据进行汇总的函数,但是还是返回一个结果 聚合函数也叫聚集,分组函数 常见的聚合函数 1.AVG(): 求平均值 2.SUM() :…

重庆电力建设公司网站网站建设推广文案

工服穿戴检测联动门禁开关算法通过yolov8深度学习框架模型,工服穿戴检测联动门禁开关算法能够准确识别和检测作业人员是否按照规定进行工服着装,只有当人员合规着装时,算法会发送开关量信号给门禁设备,使门禁自动打开。YOLO的结构…

肇庆有哪家做企业网站的注册城乡规划师好考吗

Hadoop的介绍Hadoop最早起源于Nutch.Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题. 2003年、2004年谷歌发表的两…

公司网站 设计北京公司注册地址政策

mytomcat项目简介自己实现的简易的TomcatTomca实现说明Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,我们可以通过实现它来深刻了;了解它的实现原理。考虑自己…