10.10 I/O复用方法 select
http协议 应用层 80
tcp协议 传输层
io复用方法:select poll epoll
在不使用多线程多进程的情况下同时处理多个文件描述符
需要使用I/O复用技术:
1 客户端程序需要同时处理多个socket
2 客户端程序需要同时处理用户输入和网络连接
3 TCP服务器要同时处理监听socket和连接socket
4 服务器要同时处理TCP请求和UDP请求
5 服务器要同时监听多个端口,或者处理多种服务
select系统调用:
#include<sys/select.h>
int select(int nfds,fd_set* readfds,fd_set* writefds,fd_stexcepdfds,struct tineval* timeout);
nfd:被监听文件描述符总数
readfds、writefds、exceptfds:指向可读、可写、异常等事件
只处理有数据的
n = select()阻塞 -1 失败 0 超时 n>0
FD_IsSET(fd,set_set);
sockfd-> c = accept();
c->recv()
(main.c)
#include <stdio.h>
#include <string.h>
#include <unisted.h>
#include <sys/select.h>
#include <sys/time.h>
int main()
{
int fd = 0; //stdin 0,stdout 1,stderr 2
fd_set fdset; //集合,收集描述符,被select检测
while(1)
{
struct timeval tv = {5,0}; //超时时间 5秒
FD_ZERO(&fdset); 清空集合中的每个位0
FD_SET(fd,&fdset);
int n = select(fd+1,&fdset,NULL,NULL,&tv);
if(n == -1)
{
printf("select err\n");
break;
}
else if (n == 0)
{
printf("time out\n");
}
else
{
if(FD_ISSET(fd,&fdset))
{
char buff[128] = {0};
read(fd,buff,127);
printf("read:%s\n",buff);
}
}
}
}