UDP:单循环服务器,服务器同一时刻只能响应一个客户端的请求
TCP:并发服务器,服务器同一时刻只能响应多个客户端的请求
一、构建TCP并发服务器
让TCP服务端具备同时响应多个客户端的能力。
1.多进程
资源消耗大,同资源平台下,并发量小。
2.多线程
创建线程、进程,比较耗时
3.线程池
提前预创建大量线程,避免任务执行过程中创建线程的耗时
4.IO多路复用
多线程创建线程、进程,比较耗时线程池提前预创建大量线程,避免任务执行过程中创建线程的耗时
优势:节省资源
劣势:不利于处理比较耗时、延时比较长的任务
1.创建文件描述符集合
2.将关注的文件描述符加入到集合
3.等待IO事件到达
4.根据不同的I0事件处理不同的任务
阻塞IO:
read、recv、fgets、recvfrom
IO多路复用(转接):
在不创建新的进程和线程的前提下,可以在一个进程
中同时监测多个IO(fd/sockfd/connfd)
1.select
- select使用位图管理文件描述符,最多允许同时检测1024个文件描述符(有上限)
- 文件描述符集合在应用层创建,需要实现应用层和内核层的反复拷贝
- 需要应用层对集合表进行遍历,寻找到达事件
- 只能工作在水平触发模式(低速模式),不能工作在边沿触发模式
int select(int nfds,fd set *readfds,fd set *writefds.fd set *exceptfds,stuct timeval *tine out); |
select:实现IO多路复用 |
功能:阻塞等待IO事件,返回事件结果参数: readfds:文件描述符读事件集合表 wiitefils:写事件集合表 exceptfds:其他事件集合表 tineout:超时时间 |
返回值: 成功:返回到达的事件个数 失败:-1 0:超时事件到达但没有返回文件 |
void FD_CLR(int fd, fd_set *set);//指定fd清零
int FD_ISSET(int fd, fd_set *set);//判断集合里是否有fd文件描述符
void FD_SET(int fd, fd_set *set);//将fd号描述符置给set
void FD_ZERO(fd_set *set);//清零