C++ 网络编程

news2024/11/24 15:30:20

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文了解 FileBeat:诞生背景、发展历程与定义

🐇明明跟你说过:个人主页 🏅个人专栏:《洞察之眼:ELK监控与可视化》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是ELK 2、FileBeat在ELK中的角色 3、File…

C++的数据结构(十八):并查集

并查集(Union-Find)是一种用于处理一些不交集(Disjoint Sets)问题的数据结构。它主要支持两种操作:合并集合(Union)和查找元素所属集合(Find)。在解决诸如连通性问题、网…

在XP/Vista系统下使用Node.js的babel-cli命令行工具转码ES6语法的js文件,让IE8浏览器也能运行

在XP系统下IE浏览器最高只能装到IE8,在Vista系统下最高只能装到IE9。 2015年以后,JavaScript新增了很多语法,比如class、extends,还有let和const等等,这些语法都是XP下的终端浏览器IE8所不支持的。要想让使用了这些新式…

[集群聊天服务器]----(五)User类、UserModel类

接着上文[集群聊天服务器]----(四)MySQL数据库模块,接下来我们对User类、UserModel类进行剖析,User表和UserModel类是项目最基本也是最重要的部分,通过它我们对用户的id,用户名,密码,状态相关信息进行存储&…

VSCode运行CMake教程

参考视频: https://www.youtube.com/watch?vm9HBM1m_EMU 首先下载&安装opencv包以及cmake包 接着配置环境变量 点击环境变量 ---下面系统变量的path 找对应路径 添加后三个: 确定即可 接着创建空目录 右击vscode打开 扩展中安装 c tools、cmake、cmake too…

华为芯片与系统详细梳理--Kirin麒麟 Ascend昇腾 Kunpeng鲲鹏 HarmonyOS鸿蒙 Euler欧拉

华为芯片与系统详细梳理--Kirin麒麟 & Ascend昇腾 & Kunpeng鲲鹏 & HarmonyOS鸿蒙 & Euler欧拉 1 概述2 芯片2.1 整体描述麒麟芯片(To C)【面向智能终端】昇腾芯片【面向AI计算】鲲鹏芯片【面向通用计算】 2.2 细分系列麒麟芯片&#xf…

基于UDP的tftp的文件传输

#define SER_PORT 69 #define SER_IP "192.168.125.71" #define CLT_PORT 6666 #define CLT_IP "192.168.125.158" int main(int argc, const char *argv[]) {//创建套接字文件描述符int cfd socket(AF_INET,SOCK_DGRAM,0);if(cfd -1){perror("sock…

Hadoop3:HDFS的Fsimage和Edits文件介绍

一、概念 Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目 录和文件inode的序列化信息。 Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先 会被记录到Ed…

掌握RESTful API:从入门到精通,全面解析Web开发的基石!

在现代Web开发中,API(应用程序编程接口)已经成为不同系统之间通信的重要手段。其中,RESTful API是一种基于HTTP协议的设计风格,它简洁、易用且高效。作为一个资深的技术人员,本文将全面详细地介绍RESTful A…

VM逆向,一篇就够了(下)

实战三 d3sky 这一题需要了解一些TLS相关知识 TLS回调函数 TLS(Thread Local Storage,线程局部存储)是各线程的独立的存储空间,TLS回调函数是指,每当创建或终止进程的线程时会自动调用执行的函数,且调用…

蓝桥杯Web开发【国赛】2022年真题

1.水果拼盘 目前 CSS3 中新增的 Flex 弹性布局已经成为前端页面布局的首选方案,本题可以使用 Flex 属性快速完成布局。 1.1 题目问题 建议使用 flex 相关属性完成 css/style.css 中的 TODO 部分。 禁止修改圆盘的位置和图片的大小。相同颜色的水果放在相同颜色的…

[Unity报错] The type or namespace name ‘Newtonsoft‘ could not be found

简介 Unity在跑别人的代码时,控制台报了以下错误 The type or namespace name Newtonsoft could not be found 鉴于这块资料较少,写一下教程帮助后来者。 报错的原因主要是因为缺少Newtonsoft.json这个包,导致Unity在using该库时出现错误。…

振动盘配上智能相机后实现全自动化

#智能相机 #振动盘 振动盘配上智能相机后的全自动化技术正在各个行业蓬勃发展。振动盘是一种利用震动作用将物料快速分离和输送的装置,而智能相机的高精度图像识别技术能够准确探测和捕捉物料。将两者结合起来,不仅能提高生产效率,还能降低人…

AI爆文写作:标题需要什么?情绪炸裂,态度要激烈,行为要夸张!

现在这个传播环境下,在公域中,轻声细语,慢慢的说,无法吸引到注意,没有人搭理。 标题要需要情绪张扬,态度激烈,行为夸张,大声喧闹。 唐韧的用户群是互联网产品经理,阅读量…

开源实用!猫抓媒体嗅探浏览器插件

CatCatch:网络资源,一触即发 - 精选真开源,释放新价值。 概览 CatCatch是一个专为浏览器设计的资源嗅探扩展,旨在帮助用户轻松捕获和分析网页中的各种资源。无论是视频、音频还是其他类型的文件,猫爪都能提供直观的界…

了解K8s集群kubectl命令进行陈述式资源管理

前言 在 Kubernetes 集群中,通过陈述式和声明式资源管理是确保应用程序高效运行的关键。认识这两种管理方法,能够更好地掌握 Kubernetes 集群的运维和管理。 目录 一、K8s 资源管理操作分类 1. 陈述式 2. 声明式 3. K8s 集群管理常用命令概览 二…

五分钟”手撕“图书管理系统

前言: 图书馆管理系统需要结合JavaSE的绝大部分知识,是一个很好的训练项目。 为了让大家更加方便的查阅与学习,我把代码放开头,供大家查询。 还有对代码的分析,我将以类为单位分开讲解。 目录 全部代码 Main类 Us…

【NumPy】NumPy实战入门:线性代数(dot、linalg)与随机数(numpy.random)详解

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

redis--redis Cluster

简介 解决了redis单机写入的瓶颈问题,即单机的redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素无中心架构的redis cluster机制,在无中心的redis集群当中,其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连…

高阶路由过渡处理方案 —— 浏览器堆栈主动介入

目录 01: 前言 02: VueRouter 过渡动效可行性分析 03: 主动介入浏览器堆栈管理,分析可行性方案 04: 主动介入浏览器堆栈管理 05: 基于 GSAP 实现高阶路由过渡动画分析 06: 基于 GSAP 实现高阶路由过渡动画处理 07: 通用组件:navbar 构建方案分析…