一尘不染

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

linux

所以我试图学习选项SO_KEEPALIVE在Linux环境下用C语言进行套接字编程中的用法。

我创建了一个服务器套接字,并使用浏览器连接到它。它成功完成了,我能够读取GET请求,但是我对SO_KEEPALIVE的使用感到困惑。

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

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

我的意思是我将如何获得客户端关闭的信号(无需在客户端进行读写操作…我以为当未从客户端回复探针时我会得到一些信号),设置选项后应如何编程SO_KEEPALIVE。

另外,如果假设每3秒发送一次探针并且客户端在两次之间关闭,我将不会知道客户端已关闭,并且我可能会收到SIGPIPE。

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

提前感谢一吨!!!


阅读 1061

收藏
2020-06-03

共1个答案

一尘不染

要修改探测次数或探测间隔,可将值写入/ 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。

2020-06-03