【epoll问题】EPOLLRDHUP使用导致无法接受数据

在引入EPOLLRDHUP状态处理客户端关闭时,服务器端遇到问题,无法在接受数据前检测到EPOLLIN事件。尝试了先recv再关闭、设置SO_LINGER选项以及调整事件检测顺序等方法,但仍然无法正常接收数据。参考文章和StackOverflow讨论揭示了EPOLLRDHUP事件处理的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

EPOLLRDHUPepoll事件中的一种标志,表示对端正常断开连接。在使用epoll时,当对端调用close()关闭连接时,服务器端会触发一个epoll事件,这个事件被表示为EPOLLRDHUP。在低于2.6.17版本的内核中,这个epoll事件一般被表示为EPOLLIN,即连接可读。因此,在早期的内核版本中,无法直接使用EPOLLRDHUP事件。当我们想要在早期内核版本中使用EPOLLRDHUP事件时,可以通过在本端调用shutdown(SHUT_RDWR)来模拟对端正常断开连接的情况。例如,在使用epoll的代码中,我们可以使用如下方式注册事件:epoll_fd.register(client, select.EPOLLIN | select.EPOLLRDHUP)。然后,当我们调用client.shutdown(socket.SHUT_RDWR)关闭连接时,epoll_fd.poll(5)将会返回一个包含EPOLLRDHUP事件的结果,它被表示为0x2011。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [EPOLL事件之EPOLLRDHUP](https://blog.csdn.net/c1520006273/article/details/50439019)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [EPOLLRDHUP vs EPOLLHUP](https://blog.csdn.net/zhouguoqionghai/article/details/94591475)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值