当前位置: 首页 > news >正文

wordpress frontopen2网站seo收录工具

wordpress frontopen2,网站seo收录工具,企业网站建设可行性分析 技能训练,做网站的属于什么岗位目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds 总结 fd_set操作接口 timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充 获取新连接 注意点 -- 通信时的调用函数 添…

目录

多路转接之select

引入

介绍

fd_set

函数原型

nfds

readfds / writefds / exceptfds

readfds 

总结 

fd_set操作接口 

timeout

timevalue 结构体

传入值

返回值

代码

注意点 -- 调用函数

select的参数填充 

获取新连接

注意点 -- 通信时的调用函数

添加新fd到位图中

处理函数


多路转接之select

引入

io本质+io效率本质,5种io模型(介绍,异步/同步区别,阻塞/非阻塞区别)-CSDN博客

以前使用的io接口,既完成等待,又完成拷贝

但在多路转接的io方式中不同,分为两个部分,需要调用两个函数来完成

介绍

select只负责等待,一次可以等待多个fd

  • 就像之前钓鱼例子中的d,他拥有多个鱼竿,就相当于等待多个fd

既然可以关注多个fd,自然参数中就要使用其他数据结构了 -- fd_set

fd_set

内核提供的一种数据类型

  • 位图

因为fd_set是一个具体的类型

  • 既然是类型,就一定有大小
  • 有大小就会有比特位的数量
  • 也就相当于可以等待的文件fd值文件数量是有上限的

使用sizeof测试fd_set的大小,得到它是1024个bit

  • 所以一次最多等待1024个文件的某个事件
  • 这个值随着系统不同会有变化,实际应该动态计算 -- sizeof(fd_set) * 8

函数原型

nfds

要等待的多个fd中的最大值+1

readfds / writefds / exceptfds

等待多个fd的关键,属于输入输出型参数

等待 -- 等待事件就绪

  • 事件 -- 一般分为 读/写/有异常
  • 只要读写事件就绪,就可以直接完成拷贝操作,不会阻塞住
  • 异常事件是例外,需要特殊处理,这里不做介绍

如果想关注某个文件上的读事件,就把该文件的fd设置进readfds

  • 其他同理
  • 可以关注同一个文件上的多个事件,也可以分顺序地关注,总之设置进相应位图中就行

接下来我们以readfds为例,详细介绍一下,其他位图同理 

readfds 

fd本身就是从0开始的数字

  • 和数组下标/位图均可以一一对应

因为是输入输出型参数:

输入时

  • 我们要告诉内核需要关注的fd集,你要帮我关心这些文件上面的读事件 + 这是个位图结构 + fd和位图可以对应
  • 所以,可以得出,位图上的比特位位置(从左向右,从0开始) 对应 文件的fd值
  • 只要该位设置为1,就是我们想让内核关注该文件
  • eg:我们要关注0,1,2,3这四个文件:

输出时

  • 内核要告诉我们,关注的fd集中有哪些fd上的读事件已经就绪 + 返回的也是个位图结构
  • 所以,对应关系依然没有变,但代表的含义不同
  • 如果该位为1,说明该文件上的读事件已经就绪
  • 内核会先将位图清零,然后将[读事件已经就绪的文件]的fd值 对应的 比特位 置1
  • eg:四个文件中,fd=2的文件的读事件就绪:
总结 

所以,总结来说,fd_set这张位图,是让用户和内核之间互相传递信息

  • 那么,在使用select函数的过程中,一定会涉及大量的位图操作
fd_set操作接口 

为了让用户更方便,内核为我们提供了接口

timeout

设置select的等待方式

每隔若干秒,timeout一次,timeout后 / 有文件就绪后函数会返回

timevalue 结构体

在gettimeofday()中也有使用这个类型作为参数:

  • 获取特定时区下的特定时间,精确到微秒级别

  • 时间戳 -- 秒单位和微妙单位 
  • 比如传入参数{5,0},代表设置时间戳为5s
传入值
  • 设置>0 -- 每隔一段时间timeout一次,比如5s
  • 设置为0 -- 非阻塞(select立即返回)
  • 设置为NULL -- 阻塞等待,直到有文件就绪

如果设置(非NULL)了该时间

  • 则为输入输出型参数
  • 如果在等待的中途有文件就绪,则返回[timeout时间-已经等待时间],也就是[距离超时时间的剩余时间 ]

返回值

  • >0 -- 有n个fd就绪
  • =0 -- 超时,等待过程中没有错误,也没有fd就绪
  • <0 -- 等待出错(要等待的某个文件已经关闭了)

代码

我们这里实现一个非阻塞版网络通信

注意点 -- 调用函数

创建好套接字后,不能直接accept  

  • accept本质就是在检测并获取listensock上面的事件
  • 但我们这里目的就是要让select去等待事件(有事件了再去通知我们来获取,这时候调用accept就不会被阻塞了)
  • 所以不能先调用accept

这里的事件:

  • = 新连接到来 = 三次握手完成,系统把新连接投递到全连接队列里 = select里的读事件
  • 所以我们先调用select等待读事件

select的参数填充 

这里是服务器刚启动时,是我们需要让listensocket检测并获取新连接(新客户端与当前服务器通信)

  • 所以,等待的是listensocket上的读事件,并且当前只有这一个套接字
  • 所以,max_fd=listensocket_fd+1
  • 等有客户端连接后,会有新的套接字被创建(通信时使用的套接字),就需要添加检测这些套接字上的读写事件了(后面会细说)

因为timeout是输入输出型参数

  • 一旦超时/当前有事件就绪,就会修改timeout的值
  • 所以,为了不影响下一次的等待方式,需要重复设置timeout参数

三个位图集也是同理,需要重复设置

  • 不然会被修改成已经就绪的,而不代表需要内核关注的fd集

获取新连接

如果事件就绪,上层却不处理,select会一直通知

  • 所以需要我们手动调用accept()去把新连接拿走(这个操作在我们新的处理函数中)

当然,我们无法确定是哪个fd就绪了

  • 所以需要先判断
  • 判断完成后,就可以拿到新连接,创建新套接字了 

注意点 -- 通信时的调用函数

接下来要开始通信了,原先我们的服务器是直接read,但这里不行

  • 因为read是阻塞式等待,而我们要实现非阻塞式
  • 而且一旦阻塞在这里,就无法获取新连接以及与其他客户端通信了(因为我们写的是单进程)
  • 所以,还是需要使用select

添加新fd到位图中

当然,我们不能调用新的select

  • 为什么?
  • 一般都是在主循环处持续调用select,高效且简洁
  • 如果使用多个select,会导致代码逻辑复杂化,也难以管理

所以,需要我们把这个新套接字的fd设置进刚才的select的位图

  • ​​​​​​​这一过程就相当于d在不断增加自己鱼竿的数量

但是,这两个数据在不同的函数中(我们在处理函数中获取新连接,而select的使用在主逻辑函数中),如何传递呢?

  • 因为这两个函数都在类中,所以我们搞一个类内变量 -- 辅助数组
  • 让新增的fd都添加进辅助数组中,然后让select每次动态设置max_fd,以及三个位图

可以固定监听套接字(也就是我们创建的第一个套接字)作为数组的第一项

  • 方便我们后续区分[获取新连接] 和 [读写事件]

因为在过程中,可能会陆陆续续关掉一些文件

  • 所以原本添加进的连续fd,会变成零零星星的
  • 所以,需要我们每次都重新整理一下这个数组,把有效的fd统一放在左侧

我们每次在循环开头就处理数组中的值

  • 合法的fd就让它设置进位图中
  • 不仅如此,在这个过程中,我们还可以找到fd中的最大值,来填充select参数

解决了如何添加新fd的问题,接下来回到处理函数

处理函数

当我们识别到有事件就绪,获取连接后获得新套接字fd,之后就该将该fd设置进辅助数组中

  • 需要我们遍历数组,找到空位(值为-1/其他你设定的[数组内的初始值]),然后添加进去

更新ing...


文章转载自:
http://dinncoamphetamine.ydfr.cn
http://dinncobig.ydfr.cn
http://dinncounhealthy.ydfr.cn
http://dinncophyllo.ydfr.cn
http://dinncocoroutine.ydfr.cn
http://dinncoresearch.ydfr.cn
http://dinncoseater.ydfr.cn
http://dinncocohune.ydfr.cn
http://dinncokinghood.ydfr.cn
http://dinncoabsorbency.ydfr.cn
http://dinncowhitaker.ydfr.cn
http://dinncozonule.ydfr.cn
http://dinncosewing.ydfr.cn
http://dinncocreedal.ydfr.cn
http://dinncomoonset.ydfr.cn
http://dinncobludgeon.ydfr.cn
http://dinncoturps.ydfr.cn
http://dinncocomplot.ydfr.cn
http://dinncouniterm.ydfr.cn
http://dinncoquartet.ydfr.cn
http://dinncobullwork.ydfr.cn
http://dinncomolder.ydfr.cn
http://dinncowaterloo.ydfr.cn
http://dinncoratch.ydfr.cn
http://dinncoprimavera.ydfr.cn
http://dinncozygophyllum.ydfr.cn
http://dinncorecriminative.ydfr.cn
http://dinncokimberley.ydfr.cn
http://dinncomoistureproof.ydfr.cn
http://dinncovfw.ydfr.cn
http://dinncomi.ydfr.cn
http://dinncoexpostulator.ydfr.cn
http://dinncoshm.ydfr.cn
http://dinncouptodate.ydfr.cn
http://dinncovoetganger.ydfr.cn
http://dinncoscaphopod.ydfr.cn
http://dinncohyperfine.ydfr.cn
http://dinncosoed.ydfr.cn
http://dinncoaeronautical.ydfr.cn
http://dinncooceanics.ydfr.cn
http://dinncointo.ydfr.cn
http://dinncofoxy.ydfr.cn
http://dinncodogmatician.ydfr.cn
http://dinncodihydroxyphenylalanine.ydfr.cn
http://dinncoauthorized.ydfr.cn
http://dinncotutenague.ydfr.cn
http://dinncospiroscope.ydfr.cn
http://dinncofaculty.ydfr.cn
http://dinncoballet.ydfr.cn
http://dinncoquadrilateral.ydfr.cn
http://dinncohaemodialysis.ydfr.cn
http://dinncovitta.ydfr.cn
http://dinncoviticulturist.ydfr.cn
http://dinncoreflectometer.ydfr.cn
http://dinncoorderly.ydfr.cn
http://dinncoimmelodious.ydfr.cn
http://dinncotigrish.ydfr.cn
http://dinncoentomb.ydfr.cn
http://dinncoelisha.ydfr.cn
http://dinncoplutocrat.ydfr.cn
http://dinncolunarnaut.ydfr.cn
http://dinncoclop.ydfr.cn
http://dinncorubescent.ydfr.cn
http://dinncosumi.ydfr.cn
http://dinncosnailery.ydfr.cn
http://dinncolithotritize.ydfr.cn
http://dinncorrc.ydfr.cn
http://dinncobagnio.ydfr.cn
http://dinncoevenly.ydfr.cn
http://dinncosupinely.ydfr.cn
http://dinncocrony.ydfr.cn
http://dinncosuedehead.ydfr.cn
http://dinncoepsomite.ydfr.cn
http://dinncomanners.ydfr.cn
http://dinncopleochromatism.ydfr.cn
http://dinncocyclonite.ydfr.cn
http://dinncovagile.ydfr.cn
http://dinncopointillism.ydfr.cn
http://dinncofibroblast.ydfr.cn
http://dinncodisabler.ydfr.cn
http://dinncoinherency.ydfr.cn
http://dinncoscaphocephaly.ydfr.cn
http://dinncograndiose.ydfr.cn
http://dinncoferrimagnet.ydfr.cn
http://dinncohyperacid.ydfr.cn
http://dinncowhithersoever.ydfr.cn
http://dinncooriflamme.ydfr.cn
http://dinncopersonhood.ydfr.cn
http://dinncoomniform.ydfr.cn
http://dinncounrelaxing.ydfr.cn
http://dinncosizer.ydfr.cn
http://dinncoscoline.ydfr.cn
http://dinncobrownian.ydfr.cn
http://dinncoignominy.ydfr.cn
http://dinncoreactivity.ydfr.cn
http://dinncoparenteral.ydfr.cn
http://dinncobeeb.ydfr.cn
http://dinncolash.ydfr.cn
http://dinncoswordplay.ydfr.cn
http://dinncosessile.ydfr.cn
http://www.dinnco.com/news/147852.html

相关文章:

  • 网页游戏平台有哪些企业网站排名优化价格
  • 大鹏网站建设公司网站搜索优化价格
  • 如何申请免费的网站空间做网站的公司有哪些
  • 用什么软件做网站最简单 最方便产品关键词怎么找
  • 哈尔滨企业网站建设报价举例说明什么是seo
  • 婚恋网站 没法做seo网站关键词优化快速官网
  • 好吃易做的家常菜网站百度搜索排名机制
  • web网站开发技术网站申请流程
  • 电商网站上信息资源的特点包括广州推广引流公司
  • 展览展示设计公司重庆企业seo
  • 爱心助学网站建设汽车网站建设
  • 购房网官网整站优化
  • 网站中宣传彩页怎么做的河南关键词排名顾问
  • 宁津做网站公司百度竞价排名名词解释
  • 合肥企业网站建设工作室社会新闻最新消息
  • 网站建设需要哪些内容微信群拉人的营销方法
  • crm管理系统在线演示谷歌seo排名技巧
  • 企业网站建站的专业性原则是指网站信息内容应该体现建站目的和目标群体海外推广代理商
  • 河东网站建设今天刚刚发生的新闻事故
  • 河北邢台新河网青岛seo排名公司
  • java做网站比php难sem竞价课程
  • 长沙百度做网站多少钱成都网络推广哪家好
  • 政府类网站制作站长资讯
  • 免费做推广的网站有哪些重庆seowhy整站优化
  • 福田网站建设龙岗网站建设罗湖网站建设网站注册页面
  • 提供温州手机网站制作哪家好引擎优化是什么意思
  • 宣传册设计与制作用什么软件优化大师怎么下载
  • 网络销售型网站有哪些郑州百度搜索优化
  • 做网站发违规内容 网警抓不抓免费设计模板网站
  • 宝安石岩网站建设太原今日新闻最新头条