epoll模型的et模式和lt模式

http://www.cppblog.com/peakflys/archive/2012/08/26/188344.html    评论区讨论,唐诗!

http://www.cnblogs.com/egametang/archive/2012/07/30/2615808.html

 

楼主没有说到重点,需要注意的是写事件。
a. 对于et来说,应用层向tcp缓冲区写,有可能应用层数据写完了,但是tcp缓冲没有写到EAGAIN事件,那么此时需要在应用层做个标记,表明tcp缓冲区是可写的,否则,由于et是只触发一次,应用层就再也不会被通知缓冲区可写了。
b. 对于lt来说,应用层确实会每次通知可写事件,问题在于,如果应用层没数据需要往Tcp缓冲区写的话,epoll还是会不停的通知你可写,这时候需要把描述符移出epoll,避免多次无效的通知

 

对于epoll 来说,LT模式最好的方式是直接写入,如果产生了EAGAIN再将描述符加入epoll监听,下次写完后再移出来.

 

write_list_是应用层缓冲区,在epoll写事件来的时候,应用层缓冲区为空的话
设置socket 可写。下次往应用层缓冲区写数据时,检查socket是否可写,如果可写则调用HandleWrite即可。缓冲区写满的时候设置socket不可写就行了。

HandleWrite有两个调用途径,一个是写事件触发,一个是应用层触发(socket有is_writable标记)。

void HandleWrite()
while (true) {
// 应用层缓冲区全部写到TCP缓冲区了, 此时TCP缓冲区还是可写
// et模式下不会再通知应用层, 所以设置下socket writable状态
// 下次应用层数据来的时候检查该状态
if (write_list_.TotalSize() == 0) {
socket_.set_is_writable(true);
return;
}
int n = write(fd, write_list_.ReadPoint(), write_list_.readable_size());
const int error_no = errno;
if (n == -1) { // 写异常
if (error_no == EINTR) {
continue;
}
// 缓冲区已写满, 需要等写事件
if (error_no == EAGAIN) {
socket_.set_is_writable(false);
return;
} else {
HandleError(error_no);
return;
}
} else { // 写正常
write_list_.ReadAdvance(n);
}

 

转载于:https://www.cnblogs.com/learningspace/p/4194000.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值