【发布时间】:2013-04-19 21:10:07
【问题描述】:
我有一个客户端通过 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;
}
如何准确检查连接是否仍然有效?
【问题讨论】:
标签: c sockets tcp network-programming