select函数的使用


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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值