赞
踩
从前面的知识学习了如何通过socket ,多进程,多线程创建一个高并发服务器,但是在实际工作中,我们并不会用到前面的方法 去弄一个高并发服务器,有更加好用的方法,就是多路I/O转接器
多路IO转接服务器也叫做多任务IO服务器。该类服务器实现的主旨思想是,不再由应用程序自己监视客户端连接,取而代之由内核替应用程序监视文件。
主要使用的方法有三种 select , poll , epoll
其中select 可以跨平台
poll 和 epoll不能跨平台,只能在linux上使用。
重点是epoll
次重点是 select
poll知道就行了,再学习后我们会知道原因。
本章主要学习 select。
select 函数借助内核监听两件事,:客户端连接,数据通信事件。
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
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
- #include <sys/select.h>
- /* According to earlier standards */
- #include <sys/time.h>
- #include <sys/types.h>
- #include <unistd.h>
- int select(int nfds, fd_set *readfds, fd_set *writefds,
- fd_set *exceptfds, struct timeval *timeout);
-
- nfds: 监控的文件描述符集里最大文件描述符加1,因为此参数会告诉内核检测前多少个文件描述符的状态
- readfds: 监控有读数据到达文件描述符集合,传入传出参数
- writefds: 监控写数据到达文件描述符集合,传入传出参数
- exceptfds: 监控异常发生达文件描述符集合,如带外数据到达异常,传入传出参数
- timeout: 定时阻塞监控时间,3种情况
- 1.NULL,永远等下去
- 2.设置timeval,等待固定时间
- 3.设置timeval里时间均为0,检查描述字后立即返回,轮询
- struct timeval {
- long tv_sec; /* seconds */
- long tv_usec; /* microseconds */
- };
- 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。