`
cloudtech
  • 浏览: 4578288 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

epoll的LT和ET模式

 
阅读更多

转载自: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

正确的读:

  1. n=0;
  2. while((nread=read(fd,buf+n,BUFSIZ-1))>0){
  3. n+=nread;
  4. }
  5. if(nread==-1&&errno!=EAGAIN){
  6. perror("readerror");
  7. }

正确的写:

  1. intnwrite,data_size=strlen(buf);
  2. n=data_size;
  3. while(n>0){
  4. nwrite=write(fd,buf+data_size-n,n);
  5. if(nwrite<n){
  6. if(nwrite==-1&&errno!=EAGAIN){
  7. perror("writeerror");
  8. }
  9. break;
  10. }
  11. n-=nwrite;
  12. }

延伸阅读:

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之LT和ET模式的区别

    EPOLL的ET和LT模式.doc

    EPOLL的ET和LT模式.doc 网络服务器编程

    epoll demo(LT和ET)

    自己学习并改写的epoll代码,在Linux测试没问题,分别实现了epoll的LT模式和ET模式,初学者可以学一学

    linux epoll ET和LT触发深入分析

    linux epoll ET和LT触发深入分析,深入剖析epoll触发机制。

    epoll 详细介绍

    用户在调用epoll_wait时,ET模式产生的事件只会报告一次。不管epoll管理的连接有多少,epoll_wait都会在常数时间内返回。而使用LT模式时,epoll_wait会去遍历所有连接的状态,只要某个连接的接收缓冲区中还有数据,...

    Epoll模型详解

    Epoll模型详解

    linux C++ webserver

    linux C++实现的webserver 包含tcpserver和tcpclient,线程池,select模式, epoll的LT和ET模式

    Linux网络编程视频视频教程系列四

    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指定回调函数...

    linux网络编程

    17socket编程(十二) select限制 poll 18socket编程(十三) epoll使用 epoll与select、poll区别 epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程...

    TinyWebServer.zip

    使用 线程池 + 非阻塞socket + epoll(ET和LT均实现) + 事件处理(Reactor和模拟Proactor均实现) 的并发模型 使用状态机解析HTTP请求报文,支持解析GET和POST请求 访问服务器数据库实现web端用户注册、登录功能,可以...

    2018年C++教程网的linux网络编程视频共41集百度云下载链接.rar

    epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射...

    libevent v2.0.10源码(跨平台事件触发的网络库)

    结果发现libevent的epoll居然用的EPOLLLT,水平触发的方式用起来比较方便,不容易出错,但是在效率上可能比EPOLLET要低一些。  跟网络无关的,libevent也有一些缓冲区管理的函数,而且是c风格的函数,实用性不是太...

    libevent-2.1.1-alpha.tar.gz

    结果发现libevent的epoll居然用的EPOLLLT,水平触发的方式用起来比较方便,不容易出错,但是在效率上可能比EPOLLET要低一些。 跟网络无关的,libevent也有一些缓冲区管理的函数,而且是c风格的函数,实用性不是太大...

    libevent-0.7c 源码(资料中转)

    结果发现libevent的epoll居然用的EPOLLLT,水平触发的方式用起来比较方便,不容易出错,但是在效率上可能比EPOLLET要低一些。  跟网络无关的,libevent也有一些缓冲区管理的函数,而且是c风格的函数,实用性不是太...

    C++教程网《Linux网络编程》视频百度云地址

    epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域...

    Linux网络编程 视频 教程

    epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域...

    C++教程网视频:linux网络编程

    epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域...

    c++教程网的linux网络编程视频下载

    epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域...

    [免费]2018年C++教程网的linux网络编程视频百度云下载链接.rar

    epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域...

Global site tag (gtag.js) - Google Analytics