我有一个客户端通过 C Berkeley 套接字连接到服务器。我(尝试)通过使用 MSG_DONTWAIT 和 MSG_PEEK 在套接字上调用 recv() 定期检查连接是否仍然有效。但是,我发现在某些情况下连接断开(例如,在连接的接口关闭之后)和根本没有数据可读取时,此调用都会返回 EAGAIN。因此,我无法使用此方法区分连接是否仍然有效。
这是我的功能:
/* return 1 if still connected, 0 otherwise */
int still_connected()
{
int nbytes_recvd = 0;
char buf[2];
int err;
nbytes_recvd = recv(fd,buf,sizeof(buf),MSG_PEEK|MSG_DONTWAIT);
err = errno;
if ( nbytes_recvd == 0 )
{
return 0;
}
else if ( nbytes_recvd < 0 )
{
if ( (err == ENOTSOCK) ||
(err == ENOTCONN) ||
(err == EINVAL) ||
(err == ECONNREFUSED) ||
(err == EBADF) ||
(err == EOPNOTSUPP) )
{
return -1;
}
}
/* nbytes_recvd > 0 or EAGAIN or EWOULDBLOCK */
/* but I get EAGAIN even if the connection is down because I shut down the interface */
return 1;
}
如何准确检查连接是否仍然有效?