epoll socket编程中的错误处理

epoll socket编程中的错误处理

epoll_wait返回状态中的错误处理

epoll可能返回的状态

根据文档,epoll_wait将在epoll_event结构体中返回如下事件

  • EPOLLIN:可读
  • EPOLLOUT:可写
  • EPOLLRDHUP:对端关闭连接或对端关闭写半端
  • EPOLLPRI:意料之外的事件,包括
    • 最常见:带外数据到达
    • A pseudoterminal master in packet mode has seen a state change on the slave
    • A cgroup.events file has been modified
  • EPOLLERR:发生错误
  • EPOLLHUP:连接关闭
  • 其它错误

muduo网络库的处理方式

核心代码为(经过删改):

if ((revents_ & POLLHUP) && !(revents_ & POLLIN))
  {
    // 没有数据可以读,且连接已关闭
    if (closeCallback_) closeCallback_();
  }
  // 出现错误
  if (revents_ & (POLLERR | POLLNVAL))
  {
    if (errorCallback_) errorCallback_();
  }
  // 可读、或者连接已经半关闭。调用读函数,如果读到了EOF,则对端已关闭写半端;调用写函数,则收到SIGPIP信号或者收EPIPE错误,则连接已完全关闭  
  if (revents_ & (POLLIN | POLLPRI | POLLRDHUP))
  {
    if (readCallback_) readCallback_(receiveTime);
  }
  // 可写,调用可写回调
  if (revents_ & POLLOUT)
  {
    if (writeCallback_) writeCallback_();
  }

libevent的处理方式

// 遇到错误或者连接断开,则标记为可读可写,这样,会在read遇到EOF,会在write遇到EPIPE,进行错误处理
if (what & EPOLLERR) {
    ev = EV_READ | EV_WRITE;
// 遇到连接已经完全关闭,相同处理
} else if ((what & EPOLLHUP) && !(what & EPOLLRDHUP)) {
    ev = EV_READ | EV_WRITE;
} else {
    if (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值