演进式c++网络库

发布时间:2026/9/11 22:03:41

演进式c++网络库 阶段 1实现阻塞式 TCP Echo Server一、学习目标从最基础的 Socket 编程开始理解 TCP 服务器建立连接、接收数据、发送数据的完整过程并独立实现一个简单的 Echo Server。二、TCP 服务器基本流程• socket()创建 Socket• bind()绑定服务器 IP 和端口• listen()让 Socket 进入监听状态• accept()接受客户端连接获得 client_fd• recv()接收客户端数据• send()向客户端返回数据• close()关闭 Socket三、核心理解服务器中主要有两个 Socketserver_fd监听 Socket主要负责接受客户端连接。client_fd通信 Socket负责与具体客户端进行数据传输。数据通信过程客户端发送数据↓服务器通过 recv() 接收↓数据保存到 buffer↓服务器通过 send() 返回↓客户端收到原数据需要注意recv() 返回的是实际接收到的字节数因此 send() 应该根据实际数据长度进行发送。四、实验结果使用 nc 作为客户端进行测试nc 127.0.0.1 8888客户端发送hello服务器成功接收recv bytes 6recv data hello服务器通过 send() 返回数据send bytes 6客户端成功收到hello说明基本 TCP 通信流程已经成功跑通。五、遇到的问题当前服务器采用的是阻塞 I/O。当服务器执行 recv() 时如果客户端没有发送数据服务器会一直等待。例如客户端1连接↓服务器执行 recv()↓客户端1一直不发送数据↓服务器阻塞等待↓其他客户端无法被及时处理因此目前的服务器只能进行简单的单客户端通信无法很好地处理多个客户端。六、阶段总结本阶段主要掌握了 TCP Socket 最基本的通信流程socket → bind → listen → accept → recv → send → close同时理解了 server_fd 和 client_fd 的区别以及阻塞 I/O 在多客户端场景下存在的问题。这个问题也成为下一阶段继续学习 I/O 多路复用的原因。阶段 2select() 多路 I/O主要目标解决单个客户端阻塞导致其他客户端无法及时处理的问题实现一个线程同时处理多个客户端连接。┌──────────────────────────┐ │ 第一阶段 │ │ TCP Server │ │ socket/bind/listen │ │ accept/recv/send │ └────────────┬─────────────┘ ↓ ┌──────────────────────────┐ │ ① 引入 select │ │ 多客户端 I/O 复用 │ └────────────┬─────────────┘ ↓ ┌──────────────────────────┐ │ ② 超时机制 │ │ 避免异常连接影响事件循环 │ └────────────┬─────────────┘ ↓ ┌──────────────────────────┐ │ ③ Buffer │ │ 处理 TCP 字节流 │ └────────────┬─────────────┘ ↓ ┌──────────────────────────┐ │ ④ SocketListener │ │ 封装监听 Socket │ └────────────┬─────────────┘ ↓ ┌──────────────────────────┐ │ ⑤ Connection │ │ fd Buffer 回调 │ └────────────┬─────────────┘ ↓ ┌──────────────────────────┐ │ ⑥ ConnectionManager │ │ 管理所有连接 │ └────────────┬─────────────┘ ↓ ┌──────────────────────────┐ │ ⑦ SelectPoller │ │ 封装 select │ └────────────┬─────────────┘ ↓ ┌──────────────────────────┐ │ ⑧ EventLoop │ │ 统一事件循环 │ └────────────┬─────────────┘ ↓ ┌──────────────────────────┐ │ ⑨ Callback │ │ 网络层 ↔ 业务层解耦 │ └────────────┬─────────────┘ ↓ ┌──────────────────────────┐ │ ⑩ 性能测试与优化 │ │ QPS / P99 / TIME_WAIT │ └────────────┬─────────────┘ ↓ ┌──────────────────────────┐ │ 第二阶段完成 │ │ 初步形成网络库架构 │ └──────────────────────────┘目前问题1.为什么第一阶段的accept() recv()只能比较简单地处理客户端select()到底解决了什么问题答因为第一阶段是阻塞I/O当有一个客户端连接时其他后面加入客户端会阻塞等待第一个客户端结束如果不结束就一直阻塞 而select是先将要监控的fd加入集合当有fd准备好读写就可以操作而且select可以同时监控server_fd和client_fd2.为什么一个线程使用select()就可以同时管理多个客户端3.如果某个客户端一直连接但迟迟不发送数据会发生什么为什么需要超时机制4.TCP 为什么不能简单认为“一次recv()就是一条完整消息”Buffer 应该解决什么问题5.为什么不能直接用fd管理客户端为什么要设计Connection类6.如果服务器同时有 1000 个客户端谁来管理这些Connection为什么需要单独的ConnectionManager7.为什么要把select()单独封装成SelectPoller直接把select()写在EventLoop里有什么问题8.EventLoop和SelectPoller分别负责什么两者为什么不能简单看成一个东西9.为什么网络库不应该直接写死“收到数据以后要做什么”Callback 解决了什么问题10.为什么第二阶段最终要把第一阶段的TCPServer拆成多个组件这种拆分带来了什么好处11.从第一阶段的 TCP Server到第二阶段的网络库究竟发生了什么变化
延伸阅读

更多相关文章

2026/9/11 22:03:41

SSM电影院订票系统:选座并发控制与微信支付闭环实现

简介:本资源是一套完整的计算机专业毕业设计项目,聚焦微信小程序端电影院订票与选座功能实现,采用SSM(SpringSpringMVCMyBatis)后端架构与微信原生小程序前端技术栈,适用于本科毕设、课程设计及工程实训场景…

2026/9/11 22:03:41

【计算机毕业设计项目】基于深度学习的花卉识别系统

一、项目简介 本系统是一个基于深度学习的花卉识别应用,通过 PyQt5 图形界面完成花卉图像识别、结果分析和数据管理。 二、项目功能 用户账户管理:注册、登录和密码修改单张图像识别:上传单张花卉图像进行识别批量图像识别:按文…

2026/9/11 22:53:46

3 条命令起服务:OpenProject 开源项目管理部署指南

3 条命令起服务:OpenProject 开源项目管理部署指南 【免费下载链接】openproject OpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue …

2026/9/11 22:53:46

DeepLabv3+图像分割实战:空洞卷积、ASPP与训练细节全解析

简介:一套基于 PyTorch 在 VOC 与 Cityscapes 数据集上训练 DeepLabv3 图像分割算法的完整实战项目,面向深度学习、计算机视觉方向的学习者与开发者,可帮助解决从数据准备、模型训练到预测推理的全流程落地问题。压缩包共 55 个文件&#xff…

2026/9/11 22:53:46

基于YOLOv8的游泳动作识别系统:从数据准备到部署的完整实践

简介:一套基于YOLOv8的游泳动作识别系统完整工程包,面向计算机视觉、人工智能等专业的毕业设计与课程设计场景,解决动作识别从模型训练、指标评估到可视化界面展示的全流程需求。压缩包共97个文件,以70个Python脚本(覆…

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码