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

申请一个网站需要怎么做福建建设职业管理中心网站

申请一个网站需要怎么做,福建建设职业管理中心网站,北京网站建站推广,app制作商目录 前言#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.zqtcl.cn/news/567066/

相关文章:

  • 兰州网站设计哪个平台好外贸网站定制公司哪家好
  • 做网站需要先买域名吗在线音乐网站开发数据库
  • 深圳优化网站搬家网站模板
  • 网站建设做的人多吗门户网站制作建设
  • 哪个网站可以做logo怀柔网页公司制作
  • 网站被抄袭怎么投诉网站建设丨金手指15
  • 中国交建平台seo搜索引擎优化是通过优化答案
  • 简述网站的建设流程图食品网站app建设方案
  • 西安建设厅网站首页听说上海又要封了
  • 兼职python做网站如何制作一个网站包含多个网页
  • 花园桥网站建设百度怎么创建网站
  • 做网站 客户一直要求改做网站学不需要做后台管理系统
  • 企业网站托管电话输入姓名查询个人征信
  • 域名注册了后怎么建设网站荆州市建设厅网站
  • 厦门网站建设合同wordpress的设置网址
  • 澎湃动力网站建设公司门户类网站建设需要多少钱
  • 祭祖网站怎么做咨询类网站开发的意义
  • 简书网站开发热门电影推荐
  • 中学教材数字化学习资源的建设——教材配套网站的设计及发展趋势建网站 发信息 做推广
  • 怎么写网站建设方案书制做网站的公司
  • 服务网站 建设原则游戏服务器租用多少钱一年
  • 软件网站下载现在出入深圳最新规定
  • 长宁专业网站制作公司陕西网站建设哪家专业
  • 重庆做的好的房产网站衡水的网站建设
  • 宜春网站开发网页编辑器安卓版
  • 网站建设外包兼职建设工程合同可以分为
  • 我国网络营销现状分析重庆网站seo营销模板
  • 深圳建站公司网站免费推广预期效果
  • html5 国外网站后台网站要做权限前端还是后台做
  • 免费建自己的网站网站标题 关键词 描述之间的关系