muduo库chat server对TCP粘包问题的处理

C++高并发聊天服务器实战:从环境搭建到集群架构设计 网络编程与高并发处理是构建现代互联网服务的核心技术基础。其核心原理在于通过高效的I/O模型(如Reactor模式)和非阻塞机制,管理海量连接与数据交换,以支撑实时通信等高并发场景。这项技术的核心价值在于能够构建高性能、低延迟、可扩展的后端服务,是即时通讯、在线游戏、金融交易等系统的基石。在工程实践中,C++因其对系统资源的精细控制和卓越性能,常被用于此类服务的核心开发。开发者需要掌握如Boost.Asio、Muduo等核心网络库,并理解从单机服务到分布式集群的演进路径。本文聚焦于一个综合性实战项目,详细阐述 阅读详情


粘包问题的最本质原因在与接收对等方无法分辨消息与消息之间的边界在哪。我们通过使用某种方案给出边界,例如:

  • 发送定长包。如果每个消息的大小都是一样的,那么在接收对等方只要累计接收数据,直到数据等于一个定长的数值就将它作为一个消息。
  • 包尾加上\r\n标记。FTP协议正是这么做的。但问题在于如果数据正文中也含有\r\n,则会误判为消息的边界。
  • 包头加上包体长度。包头是定长的4个字节,说明了包体的长度。接收对等方先接收包体长度,依据包体长度来接收包体。
  • 使用更加复杂的应用层协议。
muduo库采用的是第三种方案,包头存放包体长度。

实现比较简单,直接上代码:
//在该函数中解析消息,是ChatServer首先调用的函数,通过定长包的形式解决了TCP的粘包问题
  void onMessage(const muduo::net::TcpConnectionPtr& conn,
                 muduo::net::Buffer* buf,
                 muduo::Timestamp receiveTime)
  {
    while (buf->readableBytes() >= kHeaderLen) // kHeaderLen == 4 //判断是否超过包头,如果包头都超不过,那半个消息都算不上
    {
      // FIXME: use Buffer::peekInt32()
      const void* data = buf->peek();  //偷看一下readable的当前首地址
      int32_t be32 = *static_cast<const int32_t*>(data); // 
C++ Socket编程实战:从零构建多人聊天室,掌握网络与并发核心 网络编程是现代软件开发的基础,其核心在于实现不同主机间的进程通信。其基本原理是通过套接字(Socket)建立连接,在TCP/IP协议栈上传输数据。这项技术的价值在于支撑了从即时通讯到分布式系统的一切网络应用。在工程实践中,一个经典的练手项目是构建一个C/S架构的聊天室,它能直观地串联起**Socket编程**、**多线程同步**等核心概念。通过实现服务器对多个客户端连接的管理、消息的接收与广播,开发者可以深入理解**I/O模型**、线程安全以及TCP粘包等实际问题。本项目以C++11/14为基础,采用清晰的 阅读详情

相关推荐

socket网络库设计——muduo观后感

文章目录对《muduo》封面提出疑问的一些解答网络库设计思路代码复用事件处理模型Reator vs. Proactor连接模型并发模型多线程安全主流语言网络库实现思路C/C++C#/JavaGolang/JavaScript/Lua/python... 对《muduo》封面提出疑问的一些解答 TCP协议真的有所谓的“粘包问题”吗?该如何设计消息帧的协议?又该如何编码实现分包才不会掉到陷阱里? TCP本身不存在“粘包问题”,因为TCP是基于字节流的协议,没有所谓的“包”。实际上“粘包问题”是上层协议消息

...博客 1101

muduo应用层缓冲区buffer设计

一:     muduo的I/O模型采用非阻塞模式,避免阻塞在read()或write()或其他系统调用上。          TcpConnection必须要有output buffer 考虑一个常见场景:程序想通过TCP连接返送100k字节的数据,但在write()调用中,操作系统只接受了80k字节(受TCP advertised window的控制,细节见TCPv1),你肯定不想在原地

FreeeLinux's blog 2354

《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕).[PDF]@ckook

《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕).[PDF]@ckook 《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕).[PDF]@ckook

FOC项目知识点总结三 | 完全搞懂 Clarke 与 Park 变换(附动图,仿真文件以及详细讲解数学推导过程)

本文目的,最终可以完整推算两种变换 Clarke 变换 首先先看我们需要用到的两种坐标系 1. 自然坐标系 abcabcabc 我们知道,通过三相逆变电路,我们可以画出一个自然坐标系 abcabcabc ,即三相电压的坐标系,通入的电流在这三轴坐标系中变化: 将三个矢量相加合并在一起就如下图所展现: 使用三个坐标轴来表示十分的麻烦与不直观,因为其是非正交的,于是乎我们想要将其转化成使用两个正交的坐标轴来表示,于是乎便有了 Clarke变换。 Clarke 变换的作用: 将基于三轴二维的定子静止坐标系的各

Wilson Huang的博客 3万+

Mplus实战:随机截距交叉滞后模型(RI-CLPM)在心理学纵向研究中的进阶应用

本文深入探讨了随机截距交叉滞后模型(RI-CLPM)在心理学纵向研究中的进阶应用,通过Mplus实战演示了模型设定、结果解读及进阶建模策略。RI-CLPM能有效区分个体间差异和个体内变化,适用于追踪青少年手机使用与抑郁症状等研究。文章还提供了样本量规划、模型比较和结果可视化等实用技巧,助力研究者避免常见陷阱。

weixin_29220405的博客 369

打造你自己的小程序容器 —— 一套能装得下整个未来的跨端技术!

摘要: 本文介绍了一种基于Capacitor框架开发的轻量级“小程序容器”解决方案——LapDrop。通过模拟微信小程序的运行逻辑(动态加载、原生能力调用、沙盒环境),LapDrop允许开发者自主构建跨平台(iOS/Android/Web)的小程序生态。其核心利用Capacitor的插件桥接机制,实现JS与原生功能的无缝调用,并支持浏览器调试与原生环境一致化。优势包括插件化架构、状态隔离、热更新及开放权限控制,适用于企业级模块化应用或开发者工具。未来计划扩展生命周期管理、远程加载等功能,目标成为开源的小程序

CangYuChenAi的博客 976

工业质检新利器:手把手教你用AD-DINOv3实现零样本缺陷检测(附MVTec AD实战)

本文详细介绍了AD-DINOv3框架在工业质检中的应用,通过零样本异常检测技术解决传统方法的标注成本高和泛化能力弱问题。文章包含技术原理解析、MVTec AD数据集实战部署、模型训练流程及工业部署优化技巧,帮助读者快速掌握这一创新技术。

seed的博客 764

AIoT 在线工程实训平台案例——智能家居

AIoT 在线工程实训平台案例——智能家居的操作步骤

m0_53608652的博客 1431

【教程4>第4章>第22节】FFT频偏估计方法,导频+cordic频偏估计方法,costas环的性能对比

频偏范围适应性:Costas 环频偏锁定和基于 PN 导频和 CORDIC 算法的频偏估计都可以通过调整参数来适应一定范围的频偏,但 Costas 环的频率捕获范围相对较窄,而基于 PN 导频和 CORDIC 算法的频偏估计,基于 FFT 变换频偏估计对频偏范围较大。在高信噪比条件下,三种方法都可以获得较高的估计精度,但在低信噪比环境中,基于 PN 导频和 CORDIC 算法的频偏估计,基于 FFT 变换频偏估计这两个开环方案相对更具优势,而Costas 环频偏锁定的精度可能会受到较大影响.

FPGA/MATLAB学习教程/源码/项目合作开发 610

点云最小二乘法拟合曲线

文章目录一、引言 一、引言

dayuhaitang1的博客 2735

Playwright爬虫实战:破解动态网页懒加载与无限滚动

本文介绍了使用Playwright处理懒加载和无限滚动页面的完整解决方案。摘要如下: 问题分析:传统爬虫无法获取JS动态渲染内容,Playwright能模拟真实浏览器行为解决此类问题。 核心原理: 懒加载:资源延迟加载,滚动触发 无限滚动:滚动到底部异步加载新内容 技术方案: 分段滚动页面并等待加载 动态监测页面高度变化 合理设置等待和终止条件 代码实现: 提供图片懒加载和无限滚动列表的完整可运行代码 包含异常处理和性能优化建议 关键优势: 比传统爬虫更可靠 支持复杂交互场景 完善的错误处理机制 该方法已在

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 523

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: C++对象模型和虚函数表分析以及重载、重写、隐藏的区别
下一篇: muduo库chat server的shared_ptr和TLS实现分析
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值