当前位置: 首页 > 面试题库 >

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

危文乐
2023-03-14
问题内容

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

我创建了一个服务器套接字,并使用浏览器连接到它。它成功完成了,我能够读取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。



 类似资料:
  • 我目前正在玩我的球衣Rest服务。为了更好地概述给定的服务(描述、类型等),我大量使用了swagger(swagger-jersey2-jaxrs)。因此,我能够生成我的服务描述(swagger.json),我可以通过swagger ui查看和探索它们。 现在我需要创建一些客户机来使用这些服务。我遇到了swagger codegen cli,它是一个很好的工具,可以生成您的客户端和许多不同的语言(

  • 很多客户使用E立方管理平台时,需要使用FTP方式完成附件或图片的传输,如何对客户端进行FTP检测呢? 下边介绍检测方法: 1、首先,客户端电脑的防火墙要开放 21号 端口 2、点击 E立方管理平台-->选项 这里有测试 3、FTP采用被动模式 选中和不选中,分别 检测 一下(检测完一种后,关闭窗体重新打开再测试另外一种) 看见如下提示就表示可以使用这种方式了 >

  • 问题内容: 所有,我都试图编写一个在Axis2.1.5中调用Web Service客户端的Junit测试,而对于如何准确地将其设置为使用WS- Addressing感到困惑。 我已经使用wsdl2java生成了一个客户端存根,并且正在使用axis2二进制发行版中的axis2.xml和模块存储库。 我知道我需要使用WS-Addressing的MemberSubmission版本,并且我 认为 我已经

  • 我有两个项目,一个是由reactjs开发的,另一个是由laravel开发的。我想从laravel项目中获取一些数据,因此,我通过api调用访问laravel项目控制器文件夹中的一个方法。如果我使用reactjs项目中的方法,如何调试laravel项目?

  • 我知道这是不好的做法和特征识别应该是建设网站的方式。然而,这不是我的用例。 我有我的浏览器扩展的不同发行版,我想根据他们当前的浏览器更改下载按钮。 我试过使用,事实证明这是非常没用的,因为大多数浏览器都设置了所有流行的用户代理。例如chrome就有这个。 我见过很多网站的下载按钮上都有这个功能。如何做到这一点呢? 编辑:我现在了解了为什么“mozzila/x.x”位于userAgent字符串开头的

  • 我希望在代码中实现一个处理程序,如果连接到客户端的服务器在10秒后没有响应,则允许客户端自动连接到同一网络上的服务器的第二个实例。我做错了什么?? 当我运行服务器,然后是客户端时,一切都很好。然后我在同一网络上的另一台机器上启动第二个服务器,并尝试从同一客户端发送文本,客户端应该自动检测到第一个服务器断开连接,连接到服务器的第二个实例并发送文本消息。下面是我得到的例外: 线程“main”java.