gpt4 book ai didi

linux - SO_KEEPALIVE 行为在 Linux 上默认启用?

转载 作者:可可西里 更新时间:2023-11-01 02:33:59 25 4
gpt4 key购买 nike

我有一个使用 TCP 套接字用 C 语言编写的客户端/服务器应用程序。我想知道使用客户端套接字上启用的 SO_KEEPALIVE 选项的死服务器进程。我正在使用 Linux。

我将默认时间从 2 小时修改为 10 分钟。

echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time

我使用 setsockopt() 在客户端套接字上启用了 SO_KEEPALIVE。我故意杀死(kill -9)服务器进程,同时它正在向客户端发送数据。

正如预期的那样,在 10 分钟超时(加上额外的探测时间)后,客户端套接字收到通知(read(scoket,...) 返回零)。

然而,令我惊讶的是,即使我在客户端套接字上禁用此选项,它仍然会在指定的超时后收到通知(read() 返回零)。

在 Linux 中是否默认启用此行为?

另外,我觉得 read() 返回零是不合适的,当对等方死亡时,read() 不应该返回一些错误吗?

最佳答案

Keepalive 会导致连接重置。唯一导致 read() 返回零的是收到 FIN。因此,您收到了 FIN,而不是 keepalive 终止,因此这并不表明在 Linux 中默认启用 keepalive。这将违反 RFC 1122。

关于linux - SO_KEEPALIVE 行为在 Linux 上默认启用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21704587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com