如何在LINUX上的C(Ubuntu)中实现TCP SO_KEEPALIVE

时间:2013-01-29 15:08:04

标签: c linux ubuntu tcp

我正在尝试实现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);

    }

2 个答案:

答案 0 :(得分:3)

您的代码仅显示您设置套接字选项,然后立即关闭并重新打开它。设置套接字选项不会告诉您keepalive已失败。你可以通过检查套接字(带有读,写,轮询/选择等)得到它。设置选项只是打开保持活动发送&amp;检查。寻找ETIMEDOUT作为错误。

答案 1 :(得分:1)

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