我将如何在linux c编程中使用setsockopt和getsockopt与KEEP_ALIVE来确定断开的tcp / ip连接?

时间:2013-07-19 07:32:35

标签: c linux tcp

我将如何在linux c编程中使用setsockopt和getsockopt来确定断开的tcp / ip连接?

3 个答案:

答案 0 :(得分:3)

使用套接字选项SO_KEEPALIVE可能会有所帮助。来自APUE的代码:

int keepalive = 1;
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive , sizeof(keepalive ));

并参考此:Detecting a broken socket

答案 1 :(得分:2)

来自TCP man page

  

要设置或获取TCP套接字选项,请调用getsockopt(2)以阅读或setsockopt(2)将选项level参数设置为IPPROTO_TCP来编写选项。

以下是相关选项:

TCP_KEEPCNT(自Linux 2.4起)

  

在丢弃连接之前TCP应发送的最大keepalive探测数。此选项不应用于可移植的代码中。

TCP_KEEPIDLE(自Linux 2.4起)

  

如果在此套接字上设置了套接字选项SO_KEEPALIVE,则在TCP开始发送keepalive探测之前,连接需要保持空闲的时间(以秒为单位)。此选项不应用于可移植的代码中。

TCP_KEEPINTVL(自Linux 2.4起)

  

各个keepalive探针之间的时间(以秒为单位)。此选项不应用于可移植的代码中。

示例:

int keepcnt = 5;
int keepidle = 30;
int keepintvl = 120;

setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, &keepcnt, sizeof(int));
setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle, sizeof(int));
setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, &keepintvl, sizeof(int));

答案 2 :(得分:0)

正如@luly和@jxh回答的那样,首先,您需要通过设置SO_KEEPALIVE来启用keep-alive。然后使用TCP_KEEPIN,使用TCP_KEEPINTVL使用TCP_KEEPIDLE,异常(未确认)心跳间隔来控制正常心跳间隔,使用TCP_KEEPCNT控制异常心跳阈值。< / p>

为了检测断开的连接,需要从服务器端设置这些选项。

详细说明可以在here

中找到