epoll的EPOLLLT模式和EPOLLET模式比较

来源:互联网 发布:js substr函数 编辑:程序博客网 时间:2024/06/13 00:20

epoll的EPOLLLT模式和EPOLLET模式比较

分类: 网络编程 epoll 105人阅读 评论(0) 收藏 举报

epoll是linux系统最新的处理多连接的高效率模型, 工作在两种方式下, EPOLLLT方式和EPOLLET方式。

EPOLLLT是系统默认, 工作在这种方式下, 程序员不易出问题, 在接收数据时,只要socket输入缓存有数据,

都能够获得EPOLLIN的持续通知, 同样在发送数据时, 只要发送缓存够用, 都会有持续不间断的EPOLLOUT

通知。而对于EPOLLET是另外一种触发方式, 比EPOLLLT要高效很多, 对程序员的要求也多些, 程序员必须

小心使用,因为工作在此种方式下时, 在接收数据时, 如果有数据只会通知一次, 假如read时未读完数据,

那么不会再有EPOLLIN的通知了, 直到下次有新的数据到达时为止; 当发送数据时, 如果发送缓存未满也只有

一次EPOLLOUT的通知, 除非你把发送缓存塞满了, 才会有第二次EPOLLOUT通知的机会, 所以在此方式下

read和write时都要处理好。 暂时写到这里, 留作备忘。

        附加: 如果将一个socket描述符添加到两个epoll中, 那么即使在EPOLLET模式下, 只要前一个epoll_wait时,未读完, 那么后一个epoll_wait事件时, 也会得到读的通知, 但前一个读完的情况下, 后一个epoll就不会得到读事件的通知了。。。。

epoll_event lev;

//epollin表示有数据包过来,epollout表示现在可以发送数据,socket空闲,连接成功后就有这个事件

lev.events = EPOLLIN | EPOLLOUT | EPOLLET;
lev.data.ptr = this
nRetCode = epoll_ctl(hEpoll, EPOLL_CTL_ADD, m_hSocket, &lev);