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 处理ÿ

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】JAVA Design Patterns——Bridge(桥接模式)

🔍目的 将抽象与其实现分离,以便二者可以独立变化。 🔍解释 真实世界例子 考虑一下你拥有一种具有不同附魔的武器,并且应该允许将具有不同附魔的不同武器混合使用。 你会怎么做? 为每个附魔创建每种武器的多个副本&…

每周刷题第三期

个人主页:星纭-CSDN博客 系列文章专栏:Python 踏上取经路,比抵达灵山更重要!一起努力一起进步! 目录 题目一:环形链表 题目二:删除有序数组中的重复项 题目三:有效的括号 题…

【C语言】程序员自我修养之文件操作

【C语言】程序员自我修养之文件操作 🔥个人主页:大白的编程日记 🔥专栏:C语言学习之路 文章目录 【C语言】程序员自我修养之文件操作前言一.文件介绍1.1为什么使用文件1.2文件分类1.3二进制文件和文本文件 二.文件的打开和关闭2.…

docker-compose Install homer

homer前言 一个非常简单的静态主页,为您的服务器保持您的服务在手,从一个简单的yaml配置文件。 前提要求 安装 docker docker-compose 参考创建一键安装homer 脚本 homer安装位置/homerhomer 脚本位置/homer/assetshomer logo 图标/home/assets/iconshomer 端口80homer 颜色…

连续三次拒绝饭局的邀请,不会在有人请你吃饭!

人们对于饭局的态度各有不同,有的认为饭局纯属浪费时间,还有各种套路,应该尽量少参加。也有的人认为饭局是沟通感情的平台,有这样的机会应该尽量去参与。不管是否喜欢饭局,但总要时不时去参加的。如果你连续三次拒绝饭…

文心智能体应用示例:职场反PUA专家的诞生

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

JAVA开发 基于最长公共子序列来计算两个字符串之间的重复率

计算两个字符串之间的重复率 最长公共子序列实现代码 最长公共子序列 基于最长公共子序列(Longest Common Subsequence, LCS)的重复率的中心逻辑是首先找到两个或多个序列中同时出现的、不一定连续但保持相对顺序的最长子序列,然后计算这个最…

知识获取概述

文章目录 知识获取研究现状技术发展趋势 知识图谱主要技术包括知识获取、知识表示、知识存储、知识建模、 知识融合、知识理解、知识运维等七个方面,通过面向结构化、半结构化和非结构化数据构建知识图谱为不同领域的应用提供支持,具体的技术架构图如下图…

全栈安全 为云而生 | 亚信安全信舱ForCloud全新品牌重磅发布

5月18日,亚信安全云安全全新品牌ForCloud正式发布。基于“全栈安全 为云而生”的创新理念,亚信安全云安全完成全新、全面、全栈升级。ForCloud的发布仪式在C3安全大会“云领未来:全栈一体化”云安全论坛上隆重举办,同时亚信安全还…

许冉直播不治本,京东需要刘强东

图片|影视剧《纸牌屋》剧照 ©自象限原创 作者丨艾AA 编辑丨薛黎 这届618,消费者的热情还未显现,商家的怒火先爆发了。 5月21日京东618开幕次日,多家图书社抵制618图书大促登上了热搜。此次争议与去年双十一京东采销与电…

执行sql脚本——kettle开发03

一、转换对象的优先级 kettle中转换和作业的执行顺序: 1、一个作业内的转换,是顺序执行的。 2、一个转换内的步骤是并行执行的。 3、作业内不支持事务,转换内支持事务。 根据业务需要,通常需要在转换内顺序执行,小技巧…

Java进阶-SpringCloud使用BeanUtil工具类简化对象之间的属性复制和操作

在Java编程中,BeanUtil工具类是一种强大且便捷的工具,用于简化对象之间的属性复制和操作。本文将介绍BeanUtil的基本功能,通过详细的代码示例展示其应用,并与其他类似工具进行对比。本文还将探讨BeanUtil在实际开发中的优势和使用…

Go微服务开发框架DMicro的设计思路

DMicro是一个基于Go语言开发的微服务开发框架,旨在简化微服务架构的开发、部署和运维过程。DMicro的设计思路主要围绕以下几个方面展开: 简化微服务开发流程 DMicro通过提供一套简洁的API和工具,使得开发者可以快速搭建微服务应用。它支持服…

景源畅信电商:抖店需要的成本高吗?

在数字化时代的浪潮中,短视频平台迅速崛起,成为连接用户与商家的新桥梁。抖音作为其中的佼佼者,不仅改变了人们的娱乐方式,也催生了新型的电商模式——抖店。许多人好奇,入驻这样一个充满活力的平台,需要承…

jwtcracker下载安装出现错误

1.jwtcracker 用于爆破jwt秘钥 2.下载 ubuntu/kali安装c-jwt-cracker及使用方法-CSDN博客 参考这个大佬写的 但是我在这里出现了这个问题 显示Cannot initialize the default message digest sha256, aborting 我实在找不出来哪里有问题,所以直接换成docker …

C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

C进阶:C11(列表初始化、右值引用与移动构造移动赋值、可变参数模版…Args、lambda表达式、function包装器) 今天接着进行语法方面知识点的讲解 文章目录 1.统一的列表初始化1.1{}初始化1.2 initializer_listpair的补充 2.声明相关关键字2.1a…

springboot+vue2+elementui实现时间段查询

1.前端代码 使用elementui的时间段选择器&#xff1a; <el-date-picker v-model"queryPage.itemTime" type"daterange"value-format"yyyy-MM-dd" class"filter-item" range-separator"至" start-placeholder"创建…

Python筑基之旅-MySQL数据库(三)

目录 一、数据库操作 1、创建 1-1、用mysql-connector-python库 1-2、用PyMySQL库 1-3、用PeeWee库 1-4、用SQLAlchemy库 2、删除 2-1、用mysql-connector-python库 2-2、用PyMySQL库 2-3、用PeeWee库 2-4、用SQLAlchemy库 二、数据表操作 1、创建 1-1、用mysql-…

Kubernetes常用命令

目录 一.资源管理办法 1.陈述式资源管理方法 &#xff08;1&#xff09;kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 &#xff08;2&#xff09;kubectl 是官方的CLI命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在…

python+pytest+pytest-html+allure集成测试案例

pythonpytestpytest-htmlallure集成测试案例 下面是pythonpytestpytest-htmlallure四个组件同时集成使用的简单案例。 1. 项目结构 project/│├── src/│ ├── __init__.py│ ├── main.py│├── tests/│ ├── __init__.py│ ├── conftest.py│ └──…