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

文章目录

    • 半关闭
    • 端口复用
    • 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.hqwc.cn/news/62851.html

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

相关文章

【EI检索】第九届建筑、土木与水利工程国际学术会议(ICACHE 2023)

第九届建筑、土木与水利工程国际学术会议&#xff08;ICACHE 2023&#xff09; 2023 9th International Conference on Architectural, Civil and Hydraulic Engineering 第九届建筑、土木与水利工程国际学术会议&#xff08;ICACHE 2023&#xff09;将于2023年10月13-15日在中…

leetcode24. 两两交换链表中的节点

题目&#xff1a;leetcode24. 两两交换链表中的节点 描述&#xff1a; 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 思路&…

24.Netty源码之合理管理堆内存

highlight: arduino-light 合理管理 Netty 堆外内存 内存使用目标 •内存占用少(空间) •应用速度快(时间) 即多快好省 对 Java 而言&#xff1a;减少 Full GC 的 STW(Stop the world)时间 内存使用技巧 • 减少对象本身大小 md 例 1&#xff1a;用基本类型就不要用包装类。 例…

Qt 7. 在自定义类TcpClient类中使用信号槽功能

1. 因为只有QObject类及其子类派生的类才能使用信号和槽机制。 使用信号和槽还必须在类声明的最开始处添加Q_OBJECT宏&#xff0c;在这个程序中&#xff0c;类的声明是自动生成的&#xff0c;已经添加了这个宏。UI类继承自QDialog&#xff0c;QDialog类又继承自QWidget类&…

Golang struct 结构体指针类型 / 结构体值类型

struct类型的内存分配机制 结构体变量之间的赋值是值拷贝。 type stu struct {Name stringSlice []stringMap1 map[string]string }func main() {s : stu{}s.Slice make([]string, 6)s.Slice[1] "ssss"s.Slice[2] "xxxx"s.Map1 make(map[string]stri…

Golang函数以及函数和方法的区别

在接触到go之前&#xff0c;我认为函数和方法只是同一个东西的两个名字而已&#xff08;在我熟悉的c/c&#xff0c;python&#xff0c;java中没有明显的区别&#xff09;&#xff0c;但是在golang中者完全是两个不同的东西。官方的解释是&#xff0c;方法是包含了接收者的函数。…

qiankun-微前端--vue2

项目结构 主应用技术&#xff1a; vue2 子应用技术&#xff1a;vue2 项目目录 这里是特意将主子项目分开来的&#xff0c;方便管理 主应用 安装 qiankun npm install qiankun重新定义一个启动端口&#xff0c;防止和其它子应用共用同一个端口&#xff08;vue.config.js&…

哨兵2号在SNAP中去云处理

1.Fmask软件对1C级产品进行处理&#xff0c;识别像素类别 不知道Fmask是什么可以先去百度一下 软件下载,链接到github地址 我下载的是4.5版本&#xff0c;无脑安装即可。 双击打开软件&#xff08;需要等一会&#xff09;&#xff0c;长这样 路径选择E:\S2\S2A_MSIL1C_20220…

SAP MM学习笔记17-在库品目评价中的标准原价 S 和移动平均价格 V

SAP中有2种价格&#xff0c;标准原价 S 和 移动平均价格 V。 1&#xff0c;标准原价 S 2&#xff0c;移动平均价格 V 在MM03 会计1 Tab中&#xff0c;现行评价区域中&#xff0c;有原价管理区分。 比如下面这个物料 100-100&#xff0c; 它的原价管理区分是 S。 它的合计额…

怎么用PS的魔术棒抠图?PS魔术棒抠图的操作方法

使用PS的魔术棒抠图教程&#xff1a; 1、首先&#xff0c;在ps界面上方点击“文件”选项&#xff0c;再在其弹出的选项栏中选择“打开”选项。然后&#xff0c;打开你所需要的图片。 2、然后&#xff0c;单击左侧的“魔术棒”工具。 3、然后&#xff0c;用鼠标点击图片的背景&…

C++初阶语法——类型指示符auto和空指针nullptr

前言&#xff1a;本篇文章的重点 1.C中的类型指示符auto 2.借由auto实现的范围for 3.C为什么要创建nullptr而不是用原本的NULL。 目录 一.auto1.auto的含义及使用2.auto使用注意事项3.范围for&#xff08;重头戏&#xff09;范围for注意事项 二.nullptr 一.auto 1.auto的含义及…

C语言学习系列-->看淡指针(1)

文章目录 一、概述二、指针变量和地址2.1 取地址操作符2.2 指针变量和解引用操作符2.2.1 指针变量2.2.2 拆解指针类型2.2.4 解引用操作符 2.3 指针变量的大小 三、指针变量的意义3.1 指针的解引用指针-整数 四、 const修饰指针五、指针运算5.1 指针- 整数5.2 指针-指针5.3 指针…