socket网络编程之select模型

select函数原型:
int select (int maxfdp1,fd_set *readset,fd_set *writeset, fd_set *exceptset,const struct timeval * timeout);
参数解释:
参数1:最大的文件描述符加1。
参数2:用于检查可读性,
参数3:用于检查可写性,
参数4:用于检测带外数据
参数五:一个指向timeval结构的指针,用于决定select等待I/o的最长时间。如果为空将一直等待。如果值设置为{0,0},表明select会立即返回。   timeval结构的定义:
struct timeval {
long tv_sec; // seconds
long tv_usec; // microseconds
}
返回值解释:
>0:就绪描述字的正数目
-1:出错
0 :超时
select相关宏:
● FD_CLR(s, *set):从set中删除套接字s。
       ● FD_ISSET(s, *set):检查s是否set集合的一名成员;如答案是肯定的是,则返回TRUE。
       ● FD_SET(s, *set):将套接字s加入集合set。
       ● FD_ZERO( * set):将set初始化成空集合。         
使用步骤:
假定我们想知道是否可从一个套接字中安全地读取数据,同时不会陷于无休止的
“锁定”状态,便可使用 FDSET 宏,将自己的套接字分配给 fdread 集合,再来调用 select。要
想检测自己的套接字是否仍属 fdread 集合的一部分,可使用 FD_ISSET 宏。采用下述步骤,便
可完成用 select 操作一个或多个套接字句柄的全过程:
1) 使用FDZERO宏,初始化一个fdset对象;
2) 使用FDSET宏,将套接字句柄加入到fdset集合中;
3) 调用 select 函数,等待其返回……select 完成后,会返回在所有 fdset 集合中设置的套接字句柄总数,
并对每个集合进行相应的更新。
4) 根据 select的返回值和 FDISSET宏,对 fdset 集合进行检查。
5) 知道了每个集合中“待决”的 I/O操作之后,对 I/O进行处理,
然后返回步骤1 ),继续进行 select 处理。
select 函数返回后,会修改 fdset 结构,删除那些不存在待决 I/O 操作的套接字句柄。
这正是我们在上述的步骤 ( 4 ) 中,为何要使用 FDISSET 宏来判断一个特定的套接字是否仍在集合中的原因。

fd_set结构体解释:
struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(filedescriptor),即文件句柄,这可以是我们所说的普通意义的文件, 当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件,socket句柄就是一个文件描述符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值