天天看点

Linux IO模型漫谈(5)- IO复用模型之selectselect函数fd_set集合操作服务器端代码:客户端1 代码:客户端2代码:调用步骤:

首先需要了解的是select函数:

#include<sys/select.h>

#include<sys/time.h>

int select (int maxfd , fd_set *readset ,fd_set *writeset, fd_set *exceptionset , const struct timeval * timeout);

返回:就绪描述字的正数目,0——超时,-1——出错

参数解释:

maxfd: 最大的文件描述符(其值应该为最大的文件描述符字 + 1)

readset: 内核读操作的描述符字集合

writeset:内核写操作的描述符字集合

exceptionset:内核异常操作的描述符字集合

timeout:等待描述符就绪需要多少时间。null代表永远等下去,一个固定值代表等待固定时间,0代表根本不等待,检查描述字之后立即返回。

注意:readset,writeset,exceptionset都是值-结果参数,意思就是他们传进入指针进去,函数根据指针可以修改对应的fd_set

fd_set和名字一样,是一个描述符的集合。有下面几个操作:

void fd_zero(fd_set *fdset); /* 将所有fd清零 */

void fd_set(int fd, fd_set *fdset); /* 增加一个fd */

void fd_clr(int fd, fd_set *fdset); /* 删除一个fd */

int fd_isset(int fd, fd_set *fdset); /* 判断一个fd是否有设置 */

我们现在要做一个select使用的server,server监听两个端口(7778和7779)的socket。再使用两个cli,一个client连接到7778端口,另一个client连接到7779端口。

1 启动服务器端

2 启动客户端1

3 启动客户端2

4 服务器端表

客户端启动:

Linux IO模型漫谈(5)- IO复用模型之selectselect函数fd_set集合操作服务器端代码:客户端1 代码:客户端2代码:调用步骤:

服务端表现:

Linux IO模型漫谈(5)- IO复用模型之selectselect函数fd_set集合操作服务器端代码:客户端1 代码:客户端2代码:调用步骤:

这里就是使用select函数对多个socket进行读监听