转载自:http://kenby.iteye.com/blog/1162853
epoll的两种模式 LT 和 ET
二者的差异在于 level-trigger 模式下只要某个 socket 处于 readable/writable 状态,无论什么时候
进行 epoll_wait 都会返回该 socket;而 edge-trigger 模式下只有某个 socket 从 unreadable 变为 readable 或从
unwritable 变为 writable 时,epoll_wait 才会返回该 socket。如下两个示意图:
从socket读数据:
往socket写数据
所以, 在epoll的ET模式下, 正确的读写方式为:
读: 只要可读, 就一直读, 直到返回0, 或者 errno = EAGAIN
写: 只要可写, 就一直写, 直到数据发送完, 或者 errno = EAGAIN
正确的读:
-
n=0;
-
while((nread=read(fd,buf+n,BUFSIZ-1))>0){
-
n+=nread;
-
}
-
if(nread==-1&&errno!=EAGAIN){
-
perror("readerror");
-
}
正确的写:
-
intnwrite,data_size=strlen(buf);
-
n=data_size;
-
while(n>0){
-
nwrite=write(fd,buf+data_size-n,n);
-
if(nwrite<n){
-
if(nwrite==-1&&errno!=EAGAIN){
-
perror("writeerror");
-
}
-
break;
-
}
-
n-=nwrite;
-
}
延伸阅读:
1.http://www.cnblogs.com/napoleon_liu/archive/2010/07/20/1781578.html
2.http://blog.linezing.com/2011/01/%E5%89%96%E6%9E%90-epoll-etlt-%E8%A7%A6%E5%8F%91%E6%96%B9%E5%BC%8F%E7%9A%84%E6%80%A7%E8%83%BD%E5%B7%AE%E5%BC%82%E8%AF%AF%E8%A7%A3%EF%BC%88%E5%AE%9A%E6%80%A7%E5%88%86%E6%9E%90%EF%BC%89
3.http://kovyrin.net/2006/04/13/epoll-asynchronous-network-programming/
分享到:
相关推荐
举源码实例来说明epoll之LT和ET模式的区别
EPOLL的ET和LT模式.doc 网络服务器编程
自己学习并改写的epoll代码,在Linux测试没问题,分别实现了epoll的LT模式和ET模式,初学者可以学一学
linux epoll ET和LT触发深入分析,深入剖析epoll触发机制。
用户在调用epoll_wait时,ET模式产生的事件只会报告一次。不管epoll管理的连接有多少,epoll_wait都会在常数时间内返回。而使用LT模式时,epoll_wait会去遍历所有连接的状态,只要某个连接的接收缓冲区中还有数据,...
Epoll模型详解
linux C++实现的webserver 包含tcpserver和tcpclient,线程池,select模式, epoll的LT和ET模式
11-网络中ET和LT模式avi AVi 12-epoll的ET非阻塞模式avi Avi 13-epoll优缺点总结avi Avi 14-补充对比ET和LT.aviAvi 15-epoll反应堆模型总述avi 16-epoll反应堆main逻辑aviAvi 17-epoll反应堆-给lfd和cfd指定回调函数...
17socket编程(十二) select限制 poll 18socket编程(十三) epoll使用 epoll与select、poll区别 epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程...
使用 线程池 + 非阻塞socket + epoll(ET和LT均实现) + 事件处理(Reactor和模拟Proactor均实现) 的并发模型 使用状态机解析HTTP请求报文,支持解析GET和POST请求 访问服务器数据库实现web端用户注册、登录功能,可以...
epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射...
结果发现libevent的epoll居然用的EPOLLLT,水平触发的方式用起来比较方便,不容易出错,但是在效率上可能比EPOLLET要低一些。 跟网络无关的,libevent也有一些缓冲区管理的函数,而且是c风格的函数,实用性不是太...
结果发现libevent的epoll居然用的EPOLLLT,水平触发的方式用起来比较方便,不容易出错,但是在效率上可能比EPOLLET要低一些。 跟网络无关的,libevent也有一些缓冲区管理的函数,而且是c风格的函数,实用性不是太大...
结果发现libevent的epoll居然用的EPOLLLT,水平触发的方式用起来比较方便,不容易出错,但是在效率上可能比EPOLLET要低一些。 跟网络无关的,libevent也有一些缓冲区管理的函数,而且是c风格的函数,实用性不是太...
epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域...
epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域...
epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域...
epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域...
epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域...