C++ 网络编程
一、Reactor 网络编程模型
reactor
是一个事件处理模型。- 网络处理:因为用户层并不知道
IO
什么时候就绪,所以将对IO
的处理转化为对事件的处理。 - 网络模型构成:
- 非阻塞
IO
:操作IO
,如果IO
未就绪,IO
函数会立刻返回。 IO
多路复用:检测多路IO
是否就绪。
- 非阻塞
- 工作流程:
- 注册事件:
accept
:listenfd
注册读事件,如果读事件被触发了,说明IO
就绪了,有新的客户端跟我们建立连接,那么处理事件的时候就可以直接调用accept()
。connect
:服务器作为客户端去连接MySQL
,connectfd
注册写事件,如果写事件被触发了,说明连接建立成功了。read
:clientfd
注册读事件,如果读事件被触发了,说明读缓冲区中有数据了(客户端发送数据了),我们再调用read()
去读缓冲区中读数据。accept
返回clientfd
。write
:clientfd
注册写事件,如果写事件被触发了,说明写缓冲区中有空间可以写数据,我们再调用write()
往写缓冲区中写数据。- 被动断开连接:
clientfd
注册读 / 写事件,read = 0
可以判断连接已经断开了,write = -1 && errno = EPIPE
也可以判断连接已经断开了。
- 处理事件:事件触发后,说明
IO
就绪了,处理相对应的IO
。
- 注册事件:
- 封装流程:
- 事件对象:
http_conn
连接、listenfd
、不同事件的回调函数。 - 事件控制接口:注册事件接口、注销事件接口。
- 事件循环:不断检测并发就绪的事件。
- 事件对象:
二、Reactor 和 Proactor 的区别
- 本质区别:
IO
操作不同,reactor
中先检测IO
是否就绪,然后再操作IO
;proactor 只需要投递请求,所有IO
操作由内核完成。 reactor
是同步IO
网络模型。- 具体
IO
操作通过非阻塞IO
来完成。 - 具体
IO
是否就绪,由IO
多路复用来完成。
- 具体
proactor
是异步IO
网络模型。- 具体
IO
检测和IO
操作都由内核完成。
- 具体
- 同步
IO
和 异步IO
的区别:- 同步
IO
:IO
函数调用后,立刻能获知IO
操作的结果。 - 异步
IO
:异步IO
函数调用后,不能获知IO
操作的结果,此时IO
操作都由内核完成。
- 同步
- 阻塞
IO
和 非阻塞IO
的区别:- 当
IO
未就绪时,IO
函数是否立刻返回:立刻返回是非阻塞IO
;阻塞等待是阻塞IO
。 - 由
IO
函数的第一个参数,也就是具体的fd
来决定,默认情况下,fd
是阻塞的,可修改为非阻塞。
- 当
IOCP
:CreateIoCompletionPort
:创建一个完成端口。- 创建
socket
、bind
、listen
,将该socket
绑定到完成端口上。 - 根据
CPU
核心数创建工作线程,将完成端口传递到工作线程。- 工作线程调用
GetQueuedCompletionStatus
等待IO
完成。 - 处理业务逻辑(界定数据包)。
- 工作线程调用
- 投递
IO
请求AcceptEx
、RecvEx
、SendEx
到完成端口上。
三、连接断开有几种判定方式
- 服务器主动断开:主动调用
close()
。 - 服务器被动断开:
- 客户端主动调用
close()
:关闭读端和写端。shutdown()
:关闭读端或写端,或都关闭。
- 客户端直接退出。
- 客户端主动调用
IO
网络模型:read = 0
:读端关闭。(recv
第四个参数为0
的时候和read
等价)write = -1 && errno = EPIPE
:写端关闭。
IO
多路复用模型:EPOLLRDHUP
:读端关闭。EPOLLHUP
:读写端都关闭。
reactor
网络模型:- 非阻塞
IO
可以用IO
网络模型来判断连接是否断开。 - 也可以通过
IO
多路复用模型来判断连接是否断开。
- 非阻塞
proactor
网络模型:
四、接收客户端连接有几种方式
- 前提:服务端已经创建了
socket
,且该socket
绑定在某个地址上(bind
),且该socket
已经监听(listen
)。 - 阻塞的
IO
网络模型:- 获知连接的唯一文件描述符。
- 获知连接的
IP
地址。 - 以阻塞线程的方式实现接收连接。
int clientfd = accept(socket, &addr, sizeof(addr));
- 非阻塞的
IO
网络模型:- 如果接收到,就跟阻塞的
IO
表现一样。 - 如果没有接收到,
clientfd = -1
,errno
为EWOULDBLOCK
。 - 尝试一次接收连接。
int clientfd = accept(socket, &addr, sizeof(addr));
- 如果接收到,就跟阻塞的
reactor
网络模型:- 需要把
listenfd
注册它的读事件。 - 如果在事件循环中检测到
listenfd
的读事件,说明连接建立的IO
已经就绪。 - 此时调用非阻塞
IO
accept
函数,将得到连接的clientfd
和IP
地址。 - 把接收连接抽象成一个事件。
- 需要把
proactor
网络模型:- 投递
accept
请求:调用AcceptEx
函数,传递一个重叠结构。 - 在工作线程中调用
GetQueueCompletionStatus
获取IO
完成的结果。 - 如果有
IO
完成的事件,通过上面的函数可以获取重叠结构,从而知道具体是什么请求。 proactor
是异步IO
处理ÿ
- 投递
相关文章:

C++ 网络编程
一、Reactor 网络编程模型 reactor 是一个事件处理模型。网络处理:因为用户层并不知道 IO 什么时候就绪,所以将对 IO 的处理转化为对事件的处理。网络模型构成: 非阻塞 IO:操作 IO,如果 IO 未就绪,IO 函数会立刻返回。IO 多路复用:检测多路 IO 是否就绪。工作流程: 注册…...

服务案例|网络攻击事件的排查与修复
LinkSLA智能运维管家V6.0版支持通过SNMP Trap对设备进行监控告警,Trap是一种主动推送网络设备事件或告警消息的方式,与SNMP轮询(polling)不同,具有以下几点优势: 1. 实时监控与快速响应 SNMP Trap能够实时…...

如何使用宝塔面板搭建Tipask问答社区网站并发布公网远程访问
文章目录 前言1.Tipask网站搭建1.1 Tipask网站下载和安装1.2 Tipask网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3 Cpolar稳定隧道(本地设置) 3. 公网访问测试4.结语 前…...
Git学习和使用指南简单篇
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

HTTPS单双向认证流程详解与联想
HTTPS单向认证 HTTPS在单向认证传输的过程中会涉及到三个密钥: 服务端的公钥和私钥,用来进行非对称加密交换密钥 客户端生成的随机密钥,用来进行对称加密传输数据 认证过程 1.客户端向服务器发起HTTPS请求,连接到服务器的443端…...

防止浏览器缓存了静态的配置等文件(例如外部的config.js 等文件)
防止浏览器缓存了静态的配置文件 前言1、在script引入的时候添加随机数1.1、引入js文件1.2、引入css文件 2、通过html文件的<meta>设置防止缓存3、使用HTTP响应头: 前言 在实际开发中浏览器的缓存问题一直是一个很让人头疼的问题,尤其是我们打包时…...
【Umi】umi-max 中使用 Dva
前置介绍 Umi 是一个基于 React 的可插拔企业级前端应用框架,Umi 提供了一系列的插件和约定,使得开发者能够以约定大于配置的方式进行开发,同时还支持丰富的功能扩展和插件机制。 Dva 是一个基于 Redux、Redux-Saga 和 React-Router 的数据…...
Inno Setup 深入浅出-文件的显示
【1】在需要打包的文件中,新建一个文本文件,如License.txt 注意:中文的编码格式需要GB2312,否则显示乱码 【2】读取、显示文本 [Code] procedure Init_ShowLicense(); var tmpFont:TFont; begin editLicense : TMemo.C…...

数据链路层协议——以太网协议
目录 一、认识以太网 二、以太网帧格式 三、MTU 四、ARP协议 ARP协议 ARP协议格式 ARP缓存表 一、认识以太网 前面,我们讲到了网络层的IP协议,它通过目的IP,子网划分,路由表查找及其算法等方式让IP报文能够从一个主机到另一…...
一篇讲透数据结构之链式队列
目录 一.队列的定义 二.队列的分类 三.队列的功能 四.链式队列的声明 五.链式队列功能的实现 5.1 初始化队列 5.2 判断队列是否为空 5.3 获取队头元素 5.4 获取队尾元素 5.5获取队列长度 5.6 入队 5.7出队 5.8 打印队列元素 5.9 销毁队列 一.队列的定义 队列&…...

【408真题】2009-24
“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…...
6年IT找工作想法
由于我学历比较低,当时没好好学,后面参加了大数据培训,现在也已经有6年了。 我是计算机专业的,我的培训同学有些不是计算机的,但是是本科,双非一本的这种,在6年后和我的差距不是一点点了&#x…...

TOPSIS综合评价
TOPSIS法(Technique for Order Preference by Similarity to an Ideal Solution)是一种常用的综合评价方法,该方法根据有限个评价对象与理想化目标的接近程度进行排序,是在现有的对象中进行相对优劣的评价。 TOPSIS法的原理是通过…...

修改vuetify3的开关组件v-switch在inset模式下的大小
<v-switchv-model"model":label"Switch: ${model.toString()}"hide-detailsinset></v-switch>使用方式1:本页面使用 本页面中使用,必须要含有lang“scss” scoped,才会生效 <style lang"scss"…...

m1系列芯片aarch64架构使用docker-compose安装nacos
之前看到 DockerHub 上发布了 m1 芯片 aarch64 架构的 nacos 镜像, 所以就尝试的安装了下, 亲测可用: 一. docker-compose.yml 编写 请确保自己的 mysql 服务已经启动了, 并且允许远程连接 volumes 挂载目录需要换成自己的目录 二. 容器运行和网络组 2.1 查看容器运行情况 …...
优化耗时业务:异步线程在微服务中的应用
大家好,我是程序员大猩猩。 大家都知道,在我们实际开发过程中,我们经常会遇到一些耗时的业务和逻辑,比如说要上传什么大文件,又或者是大文件的数据处理。我们不能一个接口上等着这些耗时任务完成之后了,再…...

torch.scatter看图理解
torch.Tensor.scatter 有 4 个参数: scatter(dim, index, src, reduceNone) 先忽略 Reduce,最后再解释。先从最简单的开始。我们有一个 (2,4) 形状的张量,里面填充了 1: 粉红色的符号表示张量结构 并且我们传入相应的参数并得到…...

适合学生党的蓝牙耳机有哪些?盘点四大性价比蓝牙耳机品牌
对于追求高品质音乐体验而又预算有限的学生党来说,一款性价比高的蓝牙耳机无疑是最佳选择,在众多品牌和型号中,如何挑选到既适合自己需求又价格亲民的蓝牙耳机,确实是一个值得思考的问题,作为一个蓝牙耳机大户…...

【ORB_SLAM系列3】—— 如何在Ubuntu18.04中使用自己的单目摄像头运行ORB_SLAM3(亲测有效,踩坑记录)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、ORB_SLAM3源码编译二、ORB_SLAM3实时单目相机测试1. 查看摄像头的话题2. 运行测试 三. 运行测试可能的报错1. 报错一(1) 问题描述(2) 原因分析(3) 解决 2. …...

Science Advances|柔性超韧半导体纤维的大规模制备(柔性半导体器件/可穿戴电子/纤维器件/柔性电子)
北京大学 雷霆(Ting Lei)团队,在《Science Advances》上发布了一篇题为“Continuous production of ultratough semiconducting polymer fibers with high electronic performance”的论文。论文内容如下: 一、 摘要 共轭聚合物具有良好的光电特性,但其脆性和机械特性差,…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...