半关闭、端口复用与IO多路复用

news2024/10/3 4:40:37

文章目录

    • 半关闭
    • 端口复用
    • IO多路复用(IO多路转接)
      • 模型
      • 解决措施
    • sellect
      • 缺点
    • poll
      • 应用
      • 缺点
    • epoll
      • 应用
      • 工作模式

半关闭

使用close(fd);所对应的文件描述符写和读都关闭了。
在这里插入图片描述
在这里插入图片描述

端口复用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以解决绑定失败的问题。

IO多路复用(IO多路转接)

在这里插入图片描述
socket通信
io多路复用就是操作缓冲区
IO多路复用 是的程序能够同时监听多个文件描述符,能够提高程序的性能。
Linux下实现IO多路复用的系统调用主要有select、poll和epoll。

在这里插入图片描述

模型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
每次循环遍历一遍,浪费资源。

解决措施

在这里插入图片描述
遍历标志位,检查
在这里插入图片描述

sellect

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

fd_set:为1024bit的标志位寄存器,是一个传入传出参数,将需要检测的文件描述符位置1传入,内核负责判断需要检测的文件描述符是否有IO操作,若有标志位依然为1,若没有则标志位置0,检测完成传出。
readfds:检测读缓冲区有数据了,可以读了,置1
writefds:检测写缓冲区还有空余空间可以写,置1
timeout:如果为NULL,表示永久阻塞,直到检测到了文件描述符变化;如果都=0, 不阻塞;如果时间>0,阻塞对应的时间。
返回值:
-1表示调用失败
>0:表示有几个文件描述符发生了变化

在这里插入图片描述

在这里插入图片描述

socket监听之后,进行文件描述符集合设置;
设置完成进行select,有文件描述符发生变化会有返回值,否则阻塞
判断哪个文件描述符发生了变换,进行相应的处理;
socket文件描述符发生变化,获取客户端连接文件描述符,并添加到集合
客户端连接文件描述符发生变化,对数据进行处理。

在这里插入图片描述
在这里插入图片描述
判断socket文件描述符,是否有新连接:
在这里插入图片描述
判断其他描述符,是否有数据来:
在这里插入图片描述
注意 : 上面的代码的问题是,设置rdset后传入传出后被修改了,下次传入不是想要的了,可以定义一个传入传出的集合tmp,一个设置的集合rdset,每次需要select时将设置集合赋值给tmp,进行操作。

缺点

在这里插入图片描述

poll

在这里插入图片描述
在这里插入图片描述
timeout:阻塞时间,单位为ms。
返回值:
-1:失败
>0(n):n个检测到集合中有n个文件描述符发生变化。
事件设置举例(通过|实现多个事件值):
在这里插入图片描述

应用

在这里插入图片描述
在这里插入图片描述

判断返回值,判断事件:
在这里插入图片描述
增加文件描述符:
从最开始向后遍历,找到最前面没有使用的文件描述符。
在这里插入图片描述
遍历搜索是哪个文件描述符发生事件,要从lfd开始,到最大文件描述符,索引下标则从0开始,到最大有文件描述符的下标。

缺点

在这里插入图片描述
改善了3.4条缺点,但其他依然存在。

epoll

创建,在内核就存在一个eventpoll实例,并返回内核缓冲区中的文件描述符
操作
检测
在这里插入图片描述
在这里插入图片描述
返回值:
-1:调用失败
>0:文件描述符,操作epoll的实例
在这里插入图片描述
三个事件分别是读、写、错误。
在这里插入图片描述
在这里插入图片描述

应用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意 :这个地方对epoll监听的事件如果有多种,就要对事件进行判断,防止出现错误判断应用;对其判断就是通过epevs[i].enents & EPOLL…进行判断(返回值与事件与)。

工作模式

LT模式和ET模式
在这里插入图片描述
上边缺省的工作方式就是默认工作方式。
读一次也算操作了,即使缓冲区里有数据也不重复通知,直到有新数据进来才会再进行新的通知。

两者区别:LT模式:
在这里插入图片描述
ET模式:
在这里插入图片描述
设置ET模式(在设置事件时或上EPOLLET):

在这里插入图片描述
在这里插入图片描述
再ET模式下数据读取可采用循环读取方式:
可以通过循环读取数据,直到读取结束,
read阻塞控制是由于文件描述符属性控制,所以可以通过设置文件描述符属性,改变为非阻塞:
需要头文件:
#include <fcntl.h>
#include <errno.h>

//设置cfd属性非阻塞
int flag = fcntl(cfd, F_GETFL);
flag |= O_NONBLOCK;
fcntl(cfd, F_SETFL, flag);

在这里插入图片描述
非阻塞情况,没有数据read会返回-1,错误号为EAGAIN,可通过判断处理
在这里插入图片描述

打印到终端的方式
write(STDOUT_FILENO, buf, len);
printf(“%s\n”, buf);

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

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

相关文章

网工内推 | 云计算工程师专场,六险一金,IE认证优先

01 铠源科技 招聘岗位&#xff1a;云计算工程师 职责描述&#xff1a; 1.具备虚拟化、桌面云、存储、服务器、数据中心、大数据、相关产品的工程项目交付或协助项目交付能力&#xff1b; 2.具备与客户有效沟通技术方案、项目计划和进度等&#xff0c;获得客户支持和认可&#…

开启想象翅膀:轻松实现文本生成模型的创作应用,支持LLaMA、ChatGLM、UDA、GPT2、Seq2Seq、BART、T5、SongNet等模型,开箱即用

开启想象翅膀&#xff1a;轻松实现文本生成模型的创作应用&#xff0c;支持LLaMA、ChatGLM、UDA、GPT2、Seq2Seq、BART、T5、SongNet等模型&#xff0c;开箱即用 TextGen: Implementation of Text Generation models 1.介绍 TextGen实现了多种文本生成模型&#xff0c;包括&a…

深度解析:使用Postman调试微信支付接口的完美指南

前期准备 在使用 Postman 调试微信支付接口之前&#xff0c;你需要做好以下准备&#xff1a; 安装 Postman 客户端应用&#xff0c;或使用网页版&#xff1b;成为 微信支付商户&#xff1b;已申请 商户API私钥。 当你已经具备这三个条件&#xff0c;就可以进入微信支付接口调…

【视频】使用OBS将MP4推流至腾讯云直播

1、下载OBS OBS官网:https://obsproject.com/ OBS支持Win、Mac、Linux,如果下载速度很慢,建议使用迅雷下载 2、OBS推流设置 2.1 添加场景 默认会有一个“场景”,如果想继续添加可以点击“+”按钮 2.2 添加媒体源 1)点击“来源”窗口中“+”按钮 2)支持的媒体源如…

mysql高级(尚硅谷-夏磊)

目录 内容介绍 Linux下MySQL的安装与使用 Mysql逻辑架构 Mysql存储引擎 Sql预热 索引简介 内容介绍 1、Linux下MySQL的安装与使用 2、逻辑架构 3、sql预热 Linux下MySQL的安装与使用 1、docker安装docker run -d \-p 3309:3306 \-v /atguigu/mysql/mysql8/conf:/etc/my…

IP网络广播系统草坪音箱景区系统防水石头,草坪音箱的应用

IP网络广播系统草坪音箱景区系统防水石头,草坪音箱的应用 SV-7045V是深圳锐科达电子有限公司的一款防水网络草坪音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到功率20W。常用场景&#xff1a;公园ip草坪音箱&…

2009年上半年 软件设计师 下午试卷

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

PHP最简单自定义自己的框架数据库封装调用(五)

1、实现效果调用实现数据增删改查封装 2、index.php 入口定义数据库账号密码 <?php//定义当前请求模块 define("MODULE",index);//定义数据库 define(DB_HOST,localhost);//数据库地址 define(DB_DATABASE,aaa);//数据库 define(DB_USER,root);//数据库账号 def…

解读百威亚太2023上半年财报:啤酒大年百威如何重塑高端化之路?

随着消费者的需求提升&#xff0c;啤酒行业向高端化发展&#xff0c;其中知名度较高的百威亚太、华润啤酒、青岛啤酒、燕京啤酒、嘉士伯等品牌在高端市场持续鏖战&#xff0c;实际成果如何也可以从业绩一探究竟。 以百威亚太为例。8月3日&#xff0c;百威亚太发布2023年上半年…

腾讯云服务器购买流程_三种方法图文指南

腾讯云服务器购买流程直接在活动上成本更低&#xff0c;在云服务器CVM或轻量应用服务器页面自定义选择比较gui&#xff0c;但是自定义云服务器CPU内存带宽配置选择范围广&#xff0c;活动上只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是云服务器成本低。腾讯云服…

【python技巧】文本文件的读写操作

【python技巧】文本文件的读写操作 0. 背景1. file库的文件操作1.1 打开文件---file.open()1.2 读取文件---file.read()1.3 写入文件---file.write()1.4 查找内容---file.seek() 2. re库的文本处理参考资料 0. 背景 最近在写后端接口的时候&#xff0c;需要对.c、.conf等类型的…

腾讯云服务器配置升级方法_CPU内存带宽存储扩大流程

腾讯云服务器CPU、内存、硬盘和公网带宽都可以升级或降低配置&#xff0c;在云服务器控制台的“资源调整”中即可操作&#xff0c;调整配置用于升级或降级CPU内存&#xff0c;调整网络可用于更改公网带宽大小&#xff0c;云硬盘扩容可用于调整硬盘大小&#xff0c;腾讯云服务器…

技术中台之困:业务需求开发背后的拖累

技术中台作为企业数字化转型的重要支撑&#xff0c;曾一度备受瞩目。然而&#xff0c;近年来&#xff0c;技术中台的声势逐渐式微&#xff0c;曾经的辉煌渐渐褪去。本文将深入探讨技术中台为何没落的原因&#xff0c;并从中汲取教训。 技术中台起源于企业数字化转型的需求&…

由于找不到msvcp100.dll无法继续执行代码怎么解决

当遇到程序无法正常运行&#xff0c;提示缺少msvcp100.dll文件时&#xff0c;最初的反应可能是困惑和不知所措。然而&#xff0c;通过修复msvcp100.dll文件&#xff0c;我发现这个问题实际上并不复杂&#xff0c;并且可以通过一些简单的步骤解决。 在修复msvcp100.dll文件的时候…

谱包络之pysptk和pyworld

谱包络之pysptk和pyworld 谱包络可以直接用于语音的合成&#xff0c;常用的两个计算谱包络的库pysptk和pyword。 先看看代码&#xff1a; 一段语音x&#xff0c;采样率16000Hz pysptk import pysptkframe_length 1024 hop_length 80 order 25 alpha 0.41 frames libro…

JavaWeb学习|JSTL表达式

1.什么是JSTL表达式&#xff1f; JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签&#xff0c;可以供我们使用&#xff0c;标签的功能和Java代码一样 在JSP页面文件中使用JSTL表达式&#xff0c;首先需要引入核心标签库 同时&#xff0c;也要把JSTL的jar包在to…

家电维修小程序开发指南:从零搭建到上线

随着科技的发展和人们生活水平的提高&#xff0c;家电已经成为人们生活中不可或缺的一部分。然而&#xff0c;随之而来的是家电维修门店业务的繁忙和效率的考验。为了提高家电维修门店的效率和服务质量&#xff0c;建立一个便捷高效的小程序已成为必要的选择。 本文将介绍一个简…

轻松上手流体分析

SOLIDWORKS FloXpress 是一个流体力学应用程序&#xff0c;可计算流体是如何穿过零件或装配体模型的。 根据算出的速度场&#xff0c;可以找到设计中有问题的区域&#xff0c;以及在制造任何零件之前对零件进行改进。 SOLIDWORKS FloXpress 向导会引导您完成以下步骤&#xff1…

C#类型转换

&#x1f35f;数据类型 大体分为三个大类型&#xff1a;整型&#xff08;其中又分为有符号整型、无符号整型&#xff09;、浮点型、特殊类型 注意&#xff1a;浮点数在初始化时要在值后加上后缀&#xff0c;双精度浮点数decimal的后缀为“M”、单精度浮点数double和float的后…

配置docker,案例复现

配置docker(系统为centos) 1.检查操作系统环境: docker要求CentOS系统的内核版本高于 3.10 &#xff0c;通过 uname -r 命令查看你当前的内核版本是否支持安装docker 2.查看你是否拥有旧的版本&#xff0c;有的话卸载&#xff0c;没有的话直接略过该步骤 sudo yum remove d…