如何检查客户端连接是否仍然存在

时间:2011-06-22 02:39:27

标签: networking tcp epoll

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

我不认为epoll提供了处理这个问题的好方法。所以我想我应该自己处理这个问题。如果您能为我提供与此问题相关的示例或参考资料,我将非常感激。

2 个答案:

答案 0 :(得分:5)

如果另一方断开连接,epoll_wait将为套接字返回EPOLLHUP或EPOLLERR。 EPOLLHUP和EPOLLERR是自动设置的,但您也可以设置较新的EPOLLRDHUP,它明确报告对等关闭。

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

  

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

     

if(resp == -1&& errno == EPIPE){/ *另一方消失* /}

比收到信号要好得多。

答案 1 :(得分:0)

TCP Keepalive:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html。请参阅“检查死对等”。同一网站上的后续部分包含示例代码:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/programming.html