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 (