我正在尝试实现TCP SO_KEEPALIVE以在保持活动消息未收到响应时关闭并重新连接我的连接。我的问题是我没有任何运气,我认为(希望)是因为我没有正确实施。下面是我如何实现这个的一个例子。
//var to re-set socket's timeout value
struct timeval timeout;
//creates a variable for KEEPALIVE's optval parm
int optval;
//creates a variable for KEEPALIVE's optlen parm
socklen_t optlen = sizeof(optval);
// sets KEEPALIVE parms
optval = 1;
optlen = sizeof(optval);
// turns on KEEPALIVE property on socket
if (setsockopt (Socket, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0)
{
CloseSocket(Socket, 0);
connect(Socket);
}
答案 0 :(得分:3)
您的代码仅显示您设置套接字选项,然后立即关闭并重新打开它。设置套接字选项不会告诉您keepalive已失败。你可以通过检查套接字(带有读,写,轮询/选择等)得到它。设置选项只是打开保持活动发送&amp;检查。寻找ETIMEDOUT作为错误。
答案 1 :(得分:1)
如果TCP KEEPALIVE失败,则在检测到下一次读取或写入套接字时会出现错误,通常是ECONNRESET。它没有特别区分为KEEPALIVE故障,只是一般的I / O错误,实际上就是这样。