(1)多路IO转接服务器也叫做多任务IO服务器,其主要思想是不再由程序自己监听客户端连接,取而代之的是由内核替应用程序监视文件,具体实现模型如图所示:
当客户端请求和服务器连接时,内核接收到连接指令,告诉给服务器,服务器和客户端建立连接即可(不需要执行accept等待阻塞的时间)。当客户端请求读命令时,内核接收到到命令,服务器直接读取客户端的数据(不需要执行read等待阻塞读取数据的时间)。当客户端请求写数据时,内核接收到写命令,服务器直接把数据写给客户端。将等待时间缩短,内核帮助服务器执行等待工作,解放了服务器。
(2)select函数
1)select能监听的文件描述符个数受限与FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符的个数并不能改变select监听文件个数。
2)解决1024一下的客户端时使用select是很合适的,但如果链接客户端过多,select采用的是轮询模型,会大大降低服务器响应效率。
3)select函数结构
#include<sys/select.h>
#include<sys/times.h>
#include<sys/types.h>
#include<unistd.h>
int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *tineout);
参数nfds:监控的文件描述符集里最大文件描述符加1,通过这个参数会告诉内核检测前多少个文件描述符的状态。
readfds:监控有读数据到达文件描述符集合,传入传出参数
writefds:监控有写数据到达文件描述符集合,传入传出参数
exceptfds:监控有异常数据到达文件描述符集合,传入传出参数
timeout:定时阻塞监控时间
1.NULL,永远等下去
2.设置timeval,等待固定时间
3.设置timeval里时间均为0,检查描述字后立即返回,轮询
struct timeval{
long tv_sec;
long tv_usec;
};
void FD_CLR(int fd,fd_set *set); //把文件描述符集合里fd清0;
int FD_ISSET(int fd,fd_set *set); //测试文件描述符里fd是否置1
void FD_SET(int fd,fd_set *set); //文件描述符集合里fd置1
void FD_ZERO(fd_set *set); //文件描述符集合里所有位清0;
4)server服务器实现程序