HighConcurrencyCommFramework c++通讯服务器框架 :TCP粘包解决

news2024/9/22 23:18:00

服务器设计:原则综述:

通用服务器框架:游戏,网络交易,通讯框架,聚焦在业务逻辑上;

收发包:格式问题提出;

例子:第一条命令出拳【1abc2】,第二条命令加血【1def2|30】

【1abc2|1def2|30】两条命令在一起了怎么服务器解决粘包问题

粘包: TCP粘包问题

client发送 send(“abc”) send(“def”) send(“hij”)

服务器端粘包问题:不管你客户端是否粘包,服务器端都会存在粘包问题

服务器两次recv的间隔可能在100毫秒,在这100毫秒内客户端发送的这三个包都会收到,保存到服务器端的读缓冲区,你recv的时候可能拿到了全部“abcdefhij”

当你发送很多数据时,服务器一次性拿不完send(“abc。。。。。”)//8000字节,可能被操作系统拆成6个包发送过去

网络出现延迟或者阻塞:“ab” “c。。”“。。de。。”缺包;

TCP粘包、缺包解决

面试经常考:

解决粘包的方案很多:严谨,有效的一种解决方案

(我们要考虑恶意数据包):不能只用什么分割符号来分割数据包,因为客户端会伪造可能会发一些没有分割符号的数据包;

如何解决拆包问题:给收发的数据包定义个统一的格式;c、s都按照这个格式来就能解决粘包问题;

包格式:用包头包体的格式,

结构:

包头是固定长度(10字节),在包头中有一个成员变量会记录整个包(包头加包体)的长度

原理:

1.这样的话,先收包头,从包头中知道了整个包的长度,然后整个包的长度-10个字节(包头的固定长度)=包体的长度

2.然后我在收包体的长度这么多的字节,收满了包体的长度的字节数,我就认为,一个完成的数据包收完了

收包总结:

1.先收固定包头10字节

2.收满后,根据包头的内容,计算出包体的长度:整个长度-10

3.我再收包体的字节数据,收完了,一个包就解决了

我们就认为收到了一个完整的数据包,从而解决了粘包的问题;

官方nginx专用 web服务器,我们的是通用的服务器;

可以应用各种领域,不太适合web服务器;需要固定格式;

收包解包实战:

收包 包头结构:

发包:采用包头加包体的结构,包头记录了整个包的(包头+包体)的长度;

我们定义一个包的长度的不能超过30000,必须要有最大值,以防伪造的大数据包卡住我们

在网络通讯的时候,我们会有结构的内存对齐问题,有可能你发送的8数据的字节数在对端被成了16字节,这不乱套了,那么我们要同意给成内存紧挨着的,而不是让系统在传输中用空白内存补齐对齐

收包状态宏定义

//收包:粘包,缺包

//收包思路:先收包头→根据包头中的内容确定包体的长度并接受包体,收包状态(状态机)

定义四种收包的状态;

从连接池获取一个连接的时候,把状态设置为收包头

收包实战代码

聚焦在ngxwait_request_handler()函数;

同时设置好各种收包状态

服务器按照包头加包体的格式收包

引入消息头用来记录额外信息

服务器收包时,收到:包头加包体,我在额外附加一个消息头→

消息头+包头+包体

再介绍一个分配和释放内存类的Cmemory

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

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

相关文章

Linux高性能服务器编程 总结索引 | 第1章:TCP/IP协议族

现在 Internet(因特网)使用的主流协议族是 TCP/IP 协议族,它是一个分层、多协议的通信体系。本章简要讨论 TCP/IP 协议族各层 包含的主要协议,以及它们之间是 如何协作完成网络通信的 1、TCP/IP 协议族体系结构 以及主要协议 1.1…

区块链变革:Web3时代的数字化前沿

随着科技的飞速发展,数字化正在深刻影响着我们生活的方方面面。区块链技术作为一种新兴的去中心化技术,正成为推动这一变革的重要力量。特别是在Web3时代,区块链的作用不仅仅局限于加密货币,而是延伸到了各个领域,成为…

代码随想录训练营 Day37打卡 动态规划 part05 完全背包理论基础 518. 零钱兑换II 377. 组合总和 Ⅳ 卡码70. 爬楼梯(进阶版)

代码随想录训练营 Day37打卡 动态规划 part05 一、完全背包理论基础 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装…

Postman【使用总结】--SpringBoot的Controller规范【重修】

【企业规范!!!】 【响应数据】

提升学术论文质量的智能助手:ChatGPT

提升学术论文质量的智能助手:ChatGPT 前言ChatGPT的核心功能ChatGPT的优势具体应用案例局限性与最佳实践结语 前言 在这个知识爆炸的时代,学术研究已成为推动社会进步和科技发展的重要力量。每一篇论文的撰写,都是对人类知识边界的一次探索和…

攻防世界-web题型-2星难度汇总-个人wp

command_execution 典型的SSRF,先用命令找一下flag在哪里 xff_referer 修改一下xff和refere就可以了 php_rce 经典的thinkphp框架,闭着眼睛拿工具梭 这款工具无法直接getshell换一个 拿蚁剑直接连 Web_php_include 先分析代码 while (strstr($page,…

搜索二叉树进阶之AVL树

前言 二叉搜索树(BST)是一种基础的数据结构,能够高效地进行搜索、插入和删除操作。然而,在最坏的情况下,普通的BST可能会退化成一条链表,导致操作效率降低。为了避免这种情况,出现了自平衡二叉…

C语言-输出菱形

题目要求&#xff1a; 输出以下图形 程序&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int i, j;for (i 0; i < 4; i){for (j i 1; j < 4; j)printf(" ");for (j 0; j < 2 * i 1; j)printf("*");…

虽迟但到:Midjourney推出网页端并限时免费!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

【最长公共子序列】

题目 代码 #include <bits/stdc.h> using namespace std;const int N 1010; int f[N][N]; char A[N], B[N]; int main() {int n, m;cin >> n >> m;cin >> A1 >> B1;for(int i 1; i < n; i){for(int j 1; j < m; j){if(A[i] B[j]) f[…

Linux三剑客-sedawk

一、三剑客-sed命令 1、格式 sed 找谁干啥 文件 找谁:条件&#xff0c;匹配哪一行&#xff0c;哪些行. 干啥:动作&#xff0c;增删改查. #显示文件的第3行 sed -n 3p /etc/passwd选项说明-n取消默认输出-p查找-rsed支持扩展正则-i修改文件内容&#xff0c;这个选项放在最后…

VS2017编译osg3.6.0和osgearth2.10

osg3.6.0正常编译即可&#xff0c;osgearth2.10编译过程中会出现如下错误 1.osgEarth出错 1>HTTPClient.obj : error LNK2019: 无法解析的外部符号 curl_global_init&#xff0c;该符号在函数 "public: static void __cdecl osgEarth::HTTPClient::globalInit(void)&…

【日常记录-Docker】基于Alibaba Cloud Linux3安装nodejs18

Author&#xff1a;赵志乾 Date&#xff1a;2024-08-23 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 问题 Alibaba Cloud Linux3基础镜像中携带的nodejs安装包版本为v14&#xff0c;与项目开发中使用的v18版本不同&#xff0c;需要更新…

数据库 —>数据库编程

数据库&#xff0c;用来保存信息&#xff0c;和文件有同样的作用&#xff0c;但是却有别于文件&#xff1b; 文件掉电不会消失&#xff0c;一般用来存储软件配置&#xff0c;想要保存的东西&#xff0c;他在查找的时候是一行一行的去查找&#xff0c;效率不高&#xff1b; 数据…

虚谷数据库连接断开-常见问题的排查及解决方法

在日常的数据库管理工作中。虚谷数据库连接断开是一个常见的问题&#xff0c;这不仅会影响数据库的性能&#xff0c;还可能导致应用程序无法正常运行&#xff0c;本文将探讨Xugu数据库连接断开的原因&#xff0c;并提供相应的解决方法。 E50022 与服务器间的连接已经断开,可能…

如何用ACME.SH实现SSL证书自动化管理?

在上篇《免费SSL证书有效期缩短至90天&#xff0c;该如何应对&#xff1f;》中&#xff0c;想必大家都已经get到了——建站必备四件套之SSL证书的有效期不断缩短已成不可逆的趋势。 这一趋势下&#xff0c;如何有效管理SSL证书成了一道难题。有机智的小伙伴反馈&#xff0c;使用…

golang(go语言)打包成带图标的 exe 可执行文件

目录 1、准备 ico 图标 2、生成 syso 文件 3、打包 4、效果 1、准备 ico 图标 2、生成 syso 文件 创建 main.rc 文件&#xff0c;rc文件的名称main 与项目根目录下 main.go的 main 同名 IDI_ICON1 ICON "favicon.ico" cmd 窗口运行命令 windres -o main.syso main…

从零开始编程:Go语言真的适合新手吗?

Go语言自诞生以来&#xff0c;一直以其简洁、高效和面向工程的特性受到开发者的青睐&#xff0c;尤其是在后端开发和并发编程方面&#xff0c;Go表现出了独特的优势。然而&#xff0c;作为一门以简单著称的语言&#xff0c;它是否适合作为编程初学者的第一门语言呢&#xff1f;…

电脑换硬盘怎么全盘克隆?轻松实现数据迁移

随着科技的不断发展&#xff0c;电脑硬盘的存储容量和读写速度也在不断提升。为了获得更好的电脑使用体验&#xff0c;许多用户会选择更换更大容量、更高效的硬盘。然而&#xff0c;在更换硬盘的过程中&#xff0c;一个关键的问题摆在了我们面前&#xff1a;如何将旧硬盘中的所…

一文掌握 Go 内存对齐

往期精选文章推荐&#xff1a; 深入理解 go map go 常用关键字 深入理解 Go 数组、切片、字符串 深入理解channel 深入理解 go context 深入 go interface 底层原理 深入理解 go reflect 深入理解 go unsafe 前言 在前面的文章 《深入理解 go reflect》和 《深入理解…