2

当保持活动消息未收到响应时,我正在尝试实现 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);

    }
4

2 回答 2

3

您的代码仅显示您设置套接字选项,然后立即关闭并重新打开它。设置 socket 选项不会告诉你 keepalive 失败了。您将通过检查套接字(通过读取、写入、轮询/选择等)得到它。设置选项仅打开保持活动发送和检查。查找 ETIMEDOUT 作为 errno。

于 2013-01-29T15:10:37.053 回答
1

如果 TCP KEEPALIVE 失败,您会在检测后的下一次读取或写入套接字时收到错误,通常是 ECONNRESET。它无法区分为 KEEPALIVE 故障,只是一般的 I/O 错误,实际上就是这样。

于 2013-01-29T15:45:34.840 回答