gpt4 book ai didi

c - 如何正确使用 SO_KEEPALIVE 选项来检测另一端的客户端是否已关闭?

转载 作者:IT王子 更新时间:2023-10-29 00:22:28 24 4
gpt4 key购买 nike

我正在尝试学习 Linux 环境下 C 语言套接字编程中选项 SO_KEEPALIVE 的用法。

我创建了一个服务器套接字并使用我的浏览器连接到它。它成功了,我能够读取 GET 请求,但我卡在了 SO_KEEPALIVE 的用法上。

我检查了这个链接 keepalive_description@tldg.org 但我找不到任何说明如何使用它的示例。

一旦我检测到客户端对accept() 函数的请求,我就会在客户端套接字上设置SO_KEEPALIVE 选项值1。现在我不知道,如何检查客户端是否已关闭,如何更改发送的探测之间的时间间隔等。

我的意思是,我将如何获得客户端已关闭的信号? (无需在客户端读取或写入 - 我认为当客户端未回复探测器时我会收到一些信号),我应该如何在设置选项 SO_KEEPALIVE 后对其进行编程。

此外,如果假设每 3 秒发送一次探测,并且客户端在这期间发生故障,我将不知道客户端已关闭,并且我可能会收到 SIGPIPE。

无论如何重要的是我想知道如何在代码中使用 SO_KEEPALIVE。

最佳答案

要修改探测次数或探测间隔,您可以将值写入/proc 文件系统,如

 echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes

请注意,这些值对于系统上所有启用 keepalive 的套接字都是全局的,您还可以在设置 setsockopt 时基于每个套接字覆盖这些设置,请参阅您链接的文档的第 4.2 节。

您不能使用 keepalive 从用户空间“检查”套接字的状态。相反,内核只是更积极地强制远程端确认数据包,并确定套接字是否已损坏。当您尝试写入套接字时,如果 keepalive 确定远程端已关闭,您将收到一个 SIGPIPE。

关于c - 如何正确使用 SO_KEEPALIVE 选项来检测另一端的客户端是否已关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5435098/

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