EPOLLRDHUP
问题:
客户端关闭链接时
原来的操作是代码层操作,即 触发EPOLLIN,recv返回0,关闭套接字即可。
现在,使用EPOLLRDHUP状态,当客户端发送数据后立马关闭,(调用close(sockfd)),服务器无法接受数据,直接关闭。
代码如下:
if(events[i].events & EPOLLRDHUP
|| events[i].events & EPOLLHUP
|| events[i].events & EPOLLERR)
{
epoll(epollFd, EPOLL_CTL_DEL, clientFd, NULL);
close(clientFd);
}
对代码进行修改:
if( !(events[i].events & EPOLLIN)
&&( events[i].events & EPOLLRDHUP
|| events[i].events & EPOLLHUP
|| events[i].events & EPOLLERR))
{
epoll(epollFd, EPOLL_CTL_DEL, clientFd, NULL);
close(clientFd);
}
会导致一直recv返回0,还是无法接受数据。
参考该篇博文:https://blog.youkuaiyun.com/c1520006273/article/details/50439019
结论:
EPOLLIN = 0x0001
EPOLLRDHUP = 0x2000