Select模型是WinSocket中最常见的I/O模型。select模型的核心便是select函数,select函数可对多个socket组成的集合的所有操作进行管理。Select函数所原型如下:
int select(int nfds,fd_set FAR *readfds,fd_set FAR * writefds,
fd_set FAR *exceptfds,const struct timeval FAR * timeout);
其中最关键的便是三个fd_set参数,readfds用于检查socket的可读性,包含如下条件的socket集合:
1)有数据可以读入
2)连接已经关闭、重设或中止
3)有新的连接请求到来,可以调用accept函数
writefds用于检查socket的可写性,包含以下条件的socket集合:
1)如果socket跟远程目标刚连接上后(connect()或connectEx())
2)上次发送数据时缓冲区已满,当缓冲区有空闲时,socket会包含到可写集
exceptfds包含错误异常的socket集。
一般情况下,我们只用读集readfds。
使用select模型还会用到以下几个函数:
FD_CLR(s,*set):从set中删除套接字s
FD_ISSET(s,*set):检查s是否set集合的一名成员,
FD_SET(s,*set):将套接字s加入到set集
FD_ZERO(*set):清空set集合。
下面是一个基于select模型的服务器例子,可管理多个客户