当前位置: 技术问答>linux和unix
关于epoll的一个怪问题,求救
来源: 互联网 发布时间:2015-11-08
本文导语: 使用linux2。6内核的通讯程序,epoll机制,一般情况下还算正常,但是当压力增大的时候出现了一个奇怪的问题:连接建立后,服务器收到一个客户端的包,然后给客户端一个应答,部分连接出现服务器端突然收到一个...
使用linux2。6内核的通讯程序,epoll机制,一般情况下还算正常,但是当压力增大的时候出现了一个奇怪的问题:连接建立后,服务器收到一个客户端的包,然后给客户端一个应答,部分连接出现服务器端突然收到一个EPOLLHUP|EPOLLERR|EPOLLIN信号,查看网络连接(netstate)还存在,客户端也没有收到这个应答,不得不把这个信号当作连接断开处理。这个时候抓包也没有发觉网络上有任何网络事件发生,客户端(windows)也不能探测到连接异常,所以怀疑这个信号是误报,或是epoll使用不当造成,请各位高手加以指点,不胜感激!!!
|
描述符是阻塞还是非阻塞的?
去掉EPOLLET试试。
去掉EPOLLET试试。
|
信号?事件吧。
如何用的?按理说这时不需要中断连接的。
如何用的?按理说这时不需要中断连接的。
|
不行?
我能想到的:
1、发生错误时,取socket的SO_ERROR看看?
2、描述符的使用,有没有竞争问题?
3、连接还在?是ESTABLISHED状态吗?
4、客户端是否已经发送了FIN?也就是说连接是否处于单向了?不知道你是什么应用,什么协议,会不会出现这种情况?
5、是随机发生的吗?与client有没有关联关系?
6、发生问题时报EPOLLIN,能读出数据吗?
我能想到的:
1、发生错误时,取socket的SO_ERROR看看?
2、描述符的使用,有没有竞争问题?
3、连接还在?是ESTABLISHED状态吗?
4、客户端是否已经发送了FIN?也就是说连接是否处于单向了?不知道你是什么应用,什么协议,会不会出现这种情况?
5、是随机发生的吗?与client有没有关联关系?
6、发生问题时报EPOLLIN,能读出数据吗?
|
:)
给客户端应答时有没有检测返回值?也是用的非阻塞方式?
给客户端应答时有没有检测返回值?也是用的非阻塞方式?
|
这个时候系统的errno=4, EINTR,意思是被系统中断
===
哪个时候?epoll_wait返回-1了?如果不是,epoll_wait返回值是什么?这时的errno没有意义。
===
哪个时候?epoll_wait返回-1了?如果不是,epoll_wait返回值是什么?这时的errno没有意义。