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

C++ 网络编程

一、Reactor 网络编程模型

  • reactor 是一个事件处理模型。
  • 网络处理:因为用户层并不知道 IO 什么时候就绪,所以将对 IO 的处理转化为对事件的处理
  • 网络模型构成:
    • 非阻塞 IO操作 IO,如果 IO 未就绪,IO 函数会立刻返回
    • IO 多路复用:检测多路 IO 是否就绪
  • 工作流程:
    • 注册事件:
      • acceptlistenfd 注册读事件,如果读事件被触发了,说明 IO 就绪了,有新的客户端跟我们建立连接,那么处理事件的时候就可以直接调用 accept()
      • connect:服务器作为客户端去连接 MySQLconnectfd 注册写事件,如果写事件被触发了,说明连接建立成功了。
      • readclientfd 注册读事件,如果读事件被触发了,说明读缓冲区中有数据了(客户端发送数据了),我们再调用 read() 去读缓冲区中读数据。accept 返回 clientfd
      • writeclientfd 注册写事件,如果写事件被触发了,说明写缓冲区中有空间可以写数据,我们再调用 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 的区别:
    • 同步 IOIO 函数调用后,立刻能获知 IO 操作的结果在这里插入图片描述
    • 异步 IO异步 IO 函数调用后,不能获知 IO 操作的结果,此时 IO 操作都由内核完成
  • 阻塞 IO非阻塞 IO 的区别:
    • IO 未就绪时,IO 函数是否立刻返回:立刻返回是非阻塞 IO;阻塞等待是阻塞 IO
    • IO 函数的第一个参数,也就是具体的 fd 来决定,默认情况下,fd 是阻塞的,可修改为非阻塞。
  • IOCP
    • CreateIoCompletionPort:创建一个完成端口。
    • 创建 socketbindlisten,将该 socket 绑定到完成端口上。
    • 根据 CPU 核心数创建工作线程,将完成端口传递到工作线程。
      • 工作线程调用 GetQueuedCompletionStatus 等待 IO 完成。
      • 处理业务逻辑(界定数据包)。
    • 投递 IO 请求 AcceptExRecvExSendEx 到完成端口上。

三、连接断开有几种判定方式

  • 服务器主动断开:主动调用 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 = -1errnoEWOULDBLOCK
    • 尝试一次接收连接。
    int clientfd = accept(socket, &addr, sizeof(addr));
    
  • reactor 网络模型:
    • 需要把 listenfd 注册它的读事件。
    • 如果在事件循环中检测到 listenfd 的读事件,说明连接建立的 IO 已经就绪。
    • 此时调用非阻塞 IO accept 函数,将得到连接的 clientfdIP 地址。
    • 把接收连接抽象成一个事件。
  • 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响应头&#xff1a; 前言 在实际开发中浏览器的缓存问题一直是一个很让人头疼的问题&#xff0c;尤其是我们打包时…...

【Umi】umi-max 中使用 Dva

前置介绍 Umi 是一个基于 React 的可插拔企业级前端应用框架&#xff0c;Umi 提供了一系列的插件和约定&#xff0c;使得开发者能够以约定大于配置的方式进行开发&#xff0c;同时还支持丰富的功能扩展和插件机制。 Dva 是一个基于 Redux、Redux-Saga 和 React-Router 的数据…...

Inno Setup 深入浅出-文件的显示

【1】在需要打包的文件中&#xff0c;新建一个文本文件&#xff0c;如License.txt 注意&#xff1a;中文的编码格式需要GB2312&#xff0c;否则显示乱码 【2】读取、显示文本 [Code] procedure Init_ShowLicense(); var tmpFont:TFont; begin editLicense : TMemo.C…...

数据链路层协议——以太网协议

目录 一、认识以太网 二、以太网帧格式 三、MTU 四、ARP协议 ARP协议 ARP协议格式 ARP缓存表 一、认识以太网 前面&#xff0c;我们讲到了网络层的IP协议&#xff0c;它通过目的IP&#xff0c;子网划分&#xff0c;路由表查找及其算法等方式让IP报文能够从一个主机到另一…...

一篇讲透数据结构之链式队列

目录 一.队列的定义 二.队列的分类 三.队列的功能 四.链式队列的声明 五.链式队列功能的实现 5.1 初始化队列 5.2 判断队列是否为空 5.3 获取队头元素 5.4 获取队尾元素 5.5获取队列长度 5.6 入队 5.7出队 5.8 打印队列元素 5.9 销毁队列 一.队列的定义 队列&…...

【408真题】2009-24

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…...

6年IT找工作想法

由于我学历比较低&#xff0c;当时没好好学&#xff0c;后面参加了大数据培训&#xff0c;现在也已经有6年了。 我是计算机专业的&#xff0c;我的培训同学有些不是计算机的&#xff0c;但是是本科&#xff0c;双非一本的这种&#xff0c;在6年后和我的差距不是一点点了&#x…...

TOPSIS综合评价

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

修改vuetify3的开关组件v-switch在inset模式下的大小

<v-switchv-model"model":label"Switch: ${model.toString()}"hide-detailsinset></v-switch>使用方式1&#xff1a;本页面使用 本页面中使用&#xff0c;必须要含有lang“scss” scoped&#xff0c;才会生效 <style lang"scss"…...

m1系列芯片aarch64架构使用docker-compose安装nacos

之前看到 DockerHub 上发布了 m1 芯片 aarch64 架构的 nacos 镜像, 所以就尝试的安装了下, 亲测可用: 一. docker-compose.yml 编写 请确保自己的 mysql 服务已经启动了, 并且允许远程连接 volumes 挂载目录需要换成自己的目录 二. 容器运行和网络组 2.1 查看容器运行情况 …...

优化耗时业务:异步线程在微服务中的应用

大家好&#xff0c;我是程序员大猩猩。 大家都知道&#xff0c;在我们实际开发过程中&#xff0c;我们经常会遇到一些耗时的业务和逻辑&#xff0c;比如说要上传什么大文件&#xff0c;又或者是大文件的数据处理。我们不能一个接口上等着这些耗时任务完成之后了&#xff0c;再…...

torch.scatter看图理解

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

适合学生党的蓝牙耳机有哪些?盘点四大性价比蓝牙耳机品牌

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

【ORB_SLAM系列3】—— 如何在Ubuntu18.04中使用自己的单目摄像头运行ORB_SLAM3(亲测有效,踩坑记录)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、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”的论文。论文内容如下: 一、 摘要 共轭聚合物具有良好的光电特性,但其脆性和机械特性差,…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...