1

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

4

3 回答 3

4

TCP 手册页

要设置或获取 TCP 套接字选项,请调用getsockopt(2)以读取或setsockopt(2)写入选项级别参数设置为的选项IPPROTO_TCP

以下是相关选项:

TCP_KEEPCNT(自 Linux 2.4 起)

TCP 在断开连接之前应发送的最大保活探测数。此选项不应在旨在可移植的代码中使用。

TCP_KEEPIDLE(自 Linux 2.4 起)

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

TCP_KEEPINTVL(自 Linux 2.4 起)

各个保活探测之​​间的时间(以秒为单位)。此选项不应在旨在可移植的代码中使用。

例子:

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));
于 2013-07-19T07:55:59.593 回答
3

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

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

并参考:Detecting a broken socket

于 2013-07-19T07:40:39.627 回答
1

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

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

可以从这里找到详细的解释

于 2018-06-02T21:35:01.597 回答