select服务器

来源:互联网 发布:tensorflow on spark 编辑:程序博客网 时间:2024/05/29 04:34

一、select函数认识


   nfds:是需要监视的最大的文件描述符的值加1。
   readfds:(可选)指针,指向一组等待可读性检查的套接口。
   writefds:(可选)指针,指向一组等待可写性检查的套接口。
   exceptfds:(可选)指针,指向一组等待错误检查的套接口。
   timeout:select()最多等待时间,对阻塞操作则为NULL

   timeout为结构timeval,用来设置select()的等待时间,其结构定义如下
   struct timeval
   {
      long  tv_sec; //second 秒
      long  tv_usec; //microsecond 微妙
   };

   FD_CLR      从集合中删除某个描述字。
   FD_ISSET   判断某个文件描述符是否为真。
   FD_SET      向集合添加描述字。
   FD_ZERO   将集合初始化为空集NULL。

返回值:
   select()调用返回处于就绪状态并且已经包含在fd_set结构中的描述字总数;如果超时则返回0;否则的话,返回SOCKET_ERROR错误。

二、select模型认识

select模型属于网络的I/O复用模型,比纯粹的阻塞I/O模型更具有实用性,因为可以同时等待多个描述字的就绪,它的底层是通过位图来实现的,默认情况下一般可表示1024个文件描述符。

客户端:





服务器端:







运行结果:



select缺点:
(1)每次调⽤用select,都需要把fd集合从⽤用户态拷贝到内核态,这个开销在fd很多时会很⼤大
(2)同时每次调⽤用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很⼤大
(3)select⽀支持的⽂文件描述符数量太⼩小了,默认是1024



原创粉丝点击