epoll没有及时删除socket导致 Bad file descriptor错误

调用socket的close()接口,返回Bad file descriptor错误,原因是什么呢?
问题现象:
TCP服务器端使用epoll作为IO多路复用,将服务器的socket注册到epoll,用于监听客户端的连接,将新得连接点在注册到epoll,服务器端处理客户端的请求,处理完之后将socket关闭,如果客户端频繁的发送请求,就会出现close关闭socket的时候报Bad file descriptor错误!
问题解决:
通过添加打印信息发现,服务器端处理完一个请求时,会调用close关闭socket,但是close的这个文件描述符,在epoll_wait的时候又监听到了数据,epoll的操作并没有检测到这个文件描述符已经关闭;所以在close前,需要调用epoll-ctl,将监听的文件描述符delete;

epoll_ctl(kdpfd, EPOLL_CTL_DEL, events[n].data.fd,&ev);
具体的原因,还没有详细研究,但是通过这种修改方式,已经把问题解决;
所以回到标题的问题,答案就是要关闭的文件描述符其实是已经被关闭了,再关闭或者在这个socket上执行其他操作就会报错;
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值