select函数的使用

来源:互联网 发布:python能做成包吗 编辑:程序博客网 时间:2024/06/06 01:22

I/O 多路复用

阻塞函数在完成其指定的任务以前不允许程序继续向下执行。如:当服务器运行到accept语句时而没有客户端请求连接,服务器就会停止在accept语句上等待连接请求的到来,这种情况称为堵塞,而非堵塞操作则可以立即完成。如:如果你希望服务器仅仅检查是否有客户在等待连接,有就接受连接,否则就继续做其他的事情,则可以通过使用select系统调用来实现,除此之外,select还可以同时监听多个程序。

 又以上我们可以知道,并发式服务器除了利用线程、进程实现, 还可以调用select实现。

一般来说,如果当连接的客户端很多时,服务器的主线程会创建相应多的子线程去和客户端进行交互,这时,当某一个客户端发来信息、或者没有发信息时,服务器会不停的去切换线程去判断是否发没发消息,这很浪费CPU资源,容易造成额外的开销。

 

setsockopt()

   函数作用:可以重复绑定地址

   函数原型:int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)

   如:setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

       opt = 1;


 

select()

函数原型:int select(int maxfd, fd_set * readfds, fe_set *writefds, fe_set *exceptfds, const struct timeval *timeout)

函数各参数作用:

         Maxfd: 文件描述符的范围,比待检的最大文件描述符大1

         Readfds:被读监控的文件描述符集

         Writefds:被写监控的文件描述符集

         Exceptfds:被异常监控的文件描述符集

         Timeout:定时器

系统提供了4个宏读描述符集进行操作:

#include <sys/select.h>

Void FD_SET(int fd, fd_set *fdset)

Void FD_CLR(int fd, fd_set *fdset)

Void FD_ZERO(fd_set *fdset)

Void FD_ISSET(int fd, fd_set *fdset)

FD_SET将文件描述符fd添加到文件描述符集fdset

FD_CLR从文件描述符集fdset中清除文件描述符fd

FD_ZERO清空文件描述集fdset

    在调用select后使用FD_ISSET来检测文件描述符集fdset中的文件fd发生了变化

0 0
原创粉丝点击