2011-06-22 75 views
3

我正在使用epoll进行网络编程。我有一个连接列表并将每个客户端放入列表中。如果用户正常断开连接,则可以通过读取0来检测用户断开连接。但是,如果用户以某种方式意外断开连接,则在尝试将数据发送给用户之前,无法知道这一点。如何检查客户端连接是否还活着

我不认为epoll提供了一个很好的方式来处理这个..所以我认为我应该自己处理这个问题。如果你们能向我提供任何有关此问题的例子或参考资料,我将非常感激。

回答

5

如果对方断开连接,epoll_wait将为套接字返回EPOLLHUP或EPOLLERR。 EPOLLHUP和EPOLLERR会自动设置,但您也可以设置显式报告对等关机的较新的EPOLLRDHUP。

此外,如果您使用带标志MSG_NOSIGNAL的发送,它将在关闭的连接上设置EPIPE。

int resp = send(sock,buf,buflen,MSG_NOSIGNAL);

如果(分别== -1 & &错误号== EPIPE){/ *另一侧消失* /}

比得到的信号的效果好很多。

+1

它实际上是'EPOLLRDHUP',见http://www.kernel.org/doc/man-pages/online/pages/man2/epoll_ctl.2.html –

+0

是的,EPOLLRDHUP是更好的选择。 –

+0

@MartinRedmond我读到了有关使用EPOLLRDHUP的类似解决方案,但这在我的系统中不起作用。它是未定义的,但是在我定义它之后它仍然不起作用。我的内核版本是3.2.0-38-通用的。 – polerto