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

cod*_*ons 3 networking epoll tcp

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

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

Mar*_*ond 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){/*另一边走了*/}

比收到信号要好得多.