linux网络编程之多路I/o转接服务器select

  (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服务器实现程序

                

        

  

发布了72 篇原创文章 · 获赞 32 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/xx18030637774/article/details/82656985