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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈路由器转发数据包

当路由器转发数据包时,它会经历一系列步骤,包括接收数据包、路由表查询、以及转发数据包。以下是详细的步骤描述: 1. 接收数据包 以太网帧到达端口:当一个以太网帧到达路由器的某个网络接口(端口)时&#…

Django 做migrations时出错,解决方案

在做migrations的时候,偶尔会出现出错。 在已有数据的表中新增字段时,会弹出下面的信息 运行这个命令时 python manage.py makemigrationsTracking file by folder pattern: migrations It is impossible to add a non-nullable field ‘example’ to …

旧手机翻身成为办公利器——PalmDock的介绍也使用

旧手机有吧!!! 破电脑有吧!!! 那恭喜你,这篇文章可能对你有点用了。 介绍 这是一个旧手机废物利用变成工作利器的软件。可以在 Android 手机上快捷打开 windows 上的文件夹、文件、程序、命…

鸿蒙时间滑动选择器弹窗

例子: Button(打开弹窗).fontSize(14).width(106).height(32).padding({ left: 0, right: 0 }).fontColor(#999).onClick(()>{DatePickerDialog.show({selected:new Date(),onDateAccept:(value)>{AlertDialog.show({ message:JSON.stringify(value) })}})}) …

“Excel+中文编程”衍生新型软件,WPS用户:自家孩子

你知道吗,我们中国人有时候真的挺有创新精神的。 你可能熟悉Excel表格,也可能听说过中文编程,但你有没有脑洞大开,想过如果把这两者结合起来,会碰撞出什么样的火花呢? 别不信,跟着我来看看吧&a…

实时通信的方式——WebRTC

文章目录 基于WebRTC实现音视频通话P2P通信原理如何发现对方? 不同的音视频编解码能力如何沟通?(媒体协商SDP)如何联系上对方?(网络协商) 常用的API音视频采集getUserMedia核心对象RTCPeerConne…

raid配置与实战10

一、raid理论 1、raid概述 raid(磁盘阵列):是用不同的硬盘分区,组成一个逻辑上的硬盘,高可用(冗余)。 2、raid级别 2.1、raid0条带化存储 数据分散在多个物理磁盘上的存储方式,…

vue3学习(四)

前言 接上篇学习笔记&#xff0c;分享3个内置组件&#xff1a;动态组件、缓存组件、分发组件基本用法。大家一起通过code的示例&#xff0c;从现象理解,注意再次理解生命周期。 一、code示例 组件A&#xff1a;CompA <script setup> import {onMounted, onUnmounted} f…

linux Inodes满导致数据库宕机

项目经理反馈集群环境中有个节点无法使用了需要支援下&#xff0c;同时发过来截图说明磁盘还是有空的。 登录系统后直接发现问题 orcl2:/home/oracledb2> sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed May 29 13:59:21 2024 Copyright (c) 1982,…

民国漫画杂志《时代漫画》第32期.PDF

时代漫画32.PDF: https://url03.ctfile.com/f/1779803-1248635561-0ae98a?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

类的内存对齐位段位图布隆过滤器哈希切割一致性哈希

文章目录 一、类的内存对齐1.1规则1.2原因 二、位段2.1介绍2.2内存分配问题2.3跨平台问题2.4使用的注意事项 三、位图的应用3.1 给40亿个不重复的无符号整数&#xff0c;找给定的一个数。&#xff08;int的范围可以到达42亿多&#xff09;3.2 给定100亿个整数&#xff0c;设计算…

记录github小程序短视频系统的搭建过程

GitHub - lkmc2/AwesomeVideoWxApp: 《倾心短视频》微信小程序 这个项目按readme中的来可以部署成功&#xff0c;但是会发现图片、视频全是空的&#xff0c;如下图&#xff1a; 修改源代码&#xff0c;更换图片上传与保存地址 大概涉及到这些代码块&#xff0c;进行更改即可。…

Codeforces Round 948 (Div. 2) E. Tensor(思维题-交互)

题目 n(3<n<100)个点的有向图&#xff0c; 图的边的关系未知&#xff0c;但保证以下两点&#xff1a; 1. 只存在j->i&#xff08;i<j&#xff09;的边 2. 对于任意三个点i、j、k&#xff08;i<j<k&#xff09;&#xff0c;要么k可以到达i&#xff0c;要么…

开源数据库同步工具DBSyncer

前言&#xff1a; 这么实用的工具&#xff0c;竟然今天才发现&#xff0c;相见恨晚呀&#xff01;&#xff01;&#xff01;&#xff01; DBSyncer&#xff08;英[dbsɪŋkɜː]&#xff0c;美[dbsɪŋkɜː 简称dbs&#xff09;是一款开源的数据同步中间件&#xff0c;提供M…

如何使用 ArcGIS Pro 计算水库库容量

计算水库库容量可以在前期规划的时候协助水库的选址和预估水库的规模&#xff0c;这里为大家介绍一下在 ArcGIS Pro 中如何计算水库的库容量&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&#xff0c;常见…

opencascade AIS_Circle AIS_ColoredDrawer AIS_CameraFrustum 源码学习 圆

类AIS_Circle 构造圆形基准面&#xff0c;用于构建复合形状。 AIS_Circle() [1/2] AIS_Circle::AIS_Circle ( const Handle< Geom_Circle > & aCircle ) 初始化用于构造 AIS 圆形基准面的算法&#xff0c;并初始化圆形 aCircle。 AIS_Circle() [2/2] AIS_Circ…

Java设计模式:享元模式实现高效对象共享与内存优化(十一)

码到三十五 &#xff1a; 个人主页 目录 一、引言二、享元设计模式的概念1. 对象状态的划分2. 共享机制 三、享元设计模式的组成四、享元设计模式的工作原理五、享元模式的使用六、享元设计模式的优点和适用场景结语 [参见]&#xff1a; Java设计模式&#xff1a;核心概述&…

算法的时间复杂度(详解)

前言&#xff1a; 算法(Algorithm):就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&#xff0c;并产生出一个或一组值作为 输出。简单来说算法就是一系列的计算步骤&#xff0c;用来将输入数据转化成输出结果 一、算法效率 1.1 如何衡量一个算法的好坏 如何衡…

轻量级 C Logger

目录 一、描述 二、实现效果 三、使用案例 四、内存检测 一、描述 最近实现一个 WS 服务器&#xff0c;内部需要一个日志打印记录服务器程序的运行过程&#xff0c;故自己实现了一个轻量级的 logger&#xff0c;主要包含如下特征&#xff1a; 可输出 debug、info、warn、er…

支付功能、支付平台、支持渠道如何测试?

有学员提问&#xff1a;作为一个支付平台&#xff0c;接入了快钱、易宝或直连银行等多家的渠道&#xff0c;内在的产品流程是自己的。业内有什么比较好的测试办法&#xff0c;来测试各渠道及其支持的银行通道呢&#xff1f; 作为产品&#xff0c;我自己办了十几张银行卡方便测…