您的位置:首页 > 理论基础 > 计算机网络

socket网络编程之select模型

2014-03-09 13:53 253 查看
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句柄就是一个文件描述符。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: