细谈select函数(C语言)

细谈select函数(C语言)nbsp nbsp nbsp nbsp nbsp nbsp Select 在 Socket 编程中还是比较重要的 可是对于初学 Socket 的人来说都不太爱用 Select 写程序 他们只是习惯写诸如 connect accept recv 或 recvfrom 这样的阻塞程序 所谓阻塞方式 block 顾名思义 就是进程或是线程执行到这些函数时必须等待某个事件的发生 如果事件没有发生 进程或线程就被阻塞 函数不能立即返回 可是使用 Select 就可以完成非阻塞 所谓非阻塞方式 non block 就是进程或线程执行此函数时不必非要等待事件的发生 一旦执行肯定返回 以返回值的不

      Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。

 

Select的函数格式:

int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval*timeout);

先说明两个结构体:


第一,struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(filedescriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件,socket句柄就是一个文件描述符。fd_set集合可以通过一些宏由人为来操作,比如清空集合FD_ZERO(fd_set *),将一个给定的文件描述符加入集合之中FD_SET(int ,fd_set*),将一个给定的文件描述符从集合中删除FD_CLR(int,fd_set*),检查集合中指定的文件描述符是否可以读写FD_ISSET(int ,fd_set* )。

第二,struct timeval是一个大家常用的结构,用来代表时间值,有两个成员,一个是秒数,另一个是毫秒数。

具体解释select的参数:
int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在Windows中这个参数的值无所谓,可以设置不正确。

fd_set * readfds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的读变化的,即我们关心是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读,如果没有可读的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的读变化。

fd_set * writefds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的写变化的,即我们关心是否可以向这些文件中写入数据了,如果这个集合中有一个文件可写,select就会返回一个大于0的值,表示有文件可写,如果没有可写的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的写变化。

fd_set * errorfds同上面两个参数的意图,用来监视文件错误异常。

struct timeval * timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态,第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;第二,若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;第三,timeout的值大于0,这就是等待的超时时间,即select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。

返回值:返回状态发生变化的描述符总数。
负值:select错误













正值:某些文件可读写或出错

0:等待超时,没有可读写或错误的文件

 

select举例:

①读取键盘输入值,超时间隔2.5秒,输出用户输入的字符个数。

 

 

 

②利用select而不是fork来解决socket中的多客户问题。

 

服务器端:

 

客户端:

  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230624.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 双系统ubuntu20.04安装教程_ubuntu20.04网络配置

    双系统ubuntu20.04安装教程_ubuntu20.04网络配置文章目录1.激活VMware1.2下载ubuntu20.04镜像2.安装虚拟机3.安装ubuntu20.043.1开启此虚拟机3.2安装ubuntu我的网站:https://pythoneers.cn1.激活VMware下载链接:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html安装完成后,选择【帮助】,输入许可证密钥。1.2下载ubuntu20.04镜像htt.

    2022年10月4日
    4
  • arcgis最佳路径分析步骤_基于arcgis的住房选址分析

    arcgis最佳路径分析步骤_基于arcgis的住房选址分析使用ArcGISNetworkAnalyst模块进行最佳路径分析,可以根据不同的需求,进行相关设置,得到不同意义的最佳路径。例如,省汽油;省驾驶时间;省等待时间;交叉路口最少;自驾旅游可以规划沿途风景最好的路径等等。

    2022年8月24日
    13
  • 抓包工具Charles下载安装使用

    抓包工具Charles下载安装使用抓包工具Charles下载安装(破解版)1.下载地址2.安装破解3.使用Charles4.proxy(代理菜单)1.下载地址https://www.charlesproxy.com/latest-release/download.do我的电脑是64位的,所以选择红框中的。2.安装破解按照默认next即可,然后选择路径。Charles破解破解地址:https://www.zzzmode.com/mytools/charles/按照下方文字填好,点击生成,会生成一个jar包,这个jar包是本地

    2022年6月4日
    36
  • ARM的六大类指令集—LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM

    ARM的六大类指令集—LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM汇编指令:LDR、LDRB、LDRH、STR、STRB、STRH

    2022年6月16日
    44
  • YUV 简介及使用

    YUV 简介及使用一、YUV简介YUV:是一种颜色编码方法,常使用在各个视频处理组件中Y’UV,YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠Y表示明亮度(单取此通道即可得灰度图),U和V则是色度、浓度主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0可以根据其采样格式来从码流中还原每个像素点的YUV值,进而通过YUV…

    2022年7月16日
    16
  • Java审计之CMS中的那些反序列化漏洞

    Java审计之CMS中的那些反序列化漏洞0x00前言过年这段时间比较无聊,找了一套源码审计了一下,发现几个有意思的点拿出来给分享一下。0x01XStream反序列化漏洞下载源码下来发现并

    2021年12月12日
    54

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号