epoll 事件模型:
ET模式:
边沿触发:
缓冲区剩余未读尽的数据不会导致epoll_wait返回。新的事件满足,才会触发。
struct epoll_event svent;
event.events=EPOLLIN | EPOLLET;
LT模式:
水平触发 -- 默认采用模式。
缓冲区剩余未读尽的数据会导致epoll_wait返回。
结论:epoll的ET模式,高效模式,但是只支持 非阻塞模式。 ---忙轮询。
struct epoll_event event;
event.events=EPOLLIN | EPOLLET;
epoll_ctl(epfd,EPOLL_CTL_ADD,cfd,&event);
int flg=fcntl(cfd,F_GETFL);
flg |=O_NONBLOCK;
fcntl(cfd,F_SETFL,flg);
优点:
高效。突破1024文件描述符。
缺点
:
不能跨平台。Linux。
epoll反应堆模型:
epoll ET模式+非阻塞、轮询+void *ptr
原来:socket、bind、listen -- epoll_create 创建监听 红黑树 -- 返回 epfd --epoll_ctl()向树上添加一个监听fd -- while(1)--
--epoll_wait 监听 --对应监听fd有事件产生 -- 返回 监听满足数组。-- 判断返回数组元素 -- lfd 满足 --Accept --cfd满足
--read() ---小—》大--write回去。
反应堆:不但监听cfd的读事件、还要监听cfd的写事件、还要监听cfd的写事件。
socket、bind、listen--epoll_create创建监听 红黑树 -- 返回epfd--epoll_ctl()向树上添加一个监听fd--while(1)--
--epoll_wait监听 -- 对应监听fd有事件产生 -- 返回 监听满足数组。 -- 判断返回数组元素 -- lfd满足 --Accept--cfd满足
--read()-- 小—》大--cfd从监听红黑树上摘下--EPOLLOUT--回调函数 -- epoll_ctl() -- EPOLL_CTL_ADD重新放到红黑树上监听写事件
--等到epoll_wait返回 -- 说明 cfd可写--write回去--cfd从监听红黑树上摘下 -- EPOLLIN
--epoll——ctl() -- EPOLL_CTL_ADD重新放到红黑树上监听读事件 --epoll_wait监听
eventse函数:
设置回调函数。 lfd——》acceptconn();
cfd——》recvdata();
cfd——》sendata();
eventadd函数:
将一个fd,添加到 监听红黑树。 设置监听 read事件,还是监听写事件。
网络编程:
read——recv();
wite——send();