为套接字实现自己的心跳和设置“keepalive”有何优缺点?
我在某处读到,保活有时可能会失败,连接无论如何都会关闭(取决于网络结构)。另一件事是,自己的心跳可以检测应用程序是否响应(不仅仅是套接字)。
我的主要目标是确保所有这些:即使没有发送数据(除了可能的心跳),保持连接处于活动状态,双方快速连接丢失检测,应用程序响应检测。
我已经在两端实现了一个简单的心跳,并且效果很好,但是我想知道是否可以用开箱即用的 keepalive 功能来替换它。
TCP 内置的 keepalive 功能的一个问题是它并不总是易于配置。例如,在 Linux 上,setsockopt() 有多种选项(例如 TCP_KEEPIDLE、TCP_KEEPCNT 和 TCP_KEEPINTVL),您可以使用它们将 keepalive 的行为设置为您想要的,但是在其他操作系统中,这些行为不容易调整,至少不能以编程方式调整。因此,如果您希望程序的保活行为能够移植到各种操作系统并在所有操作系统上表现一致,那么滚动您自己的心跳通常是最佳选择。
另一方面,可能有一些程序或网络协议不容易支持心跳/无操作消息的概念(或者您可能希望您的程序能够使用许多协议,而不必为每个受支持的协议提供单独的 keepalive 逻辑),在这种情况下,您可能需要使用内置的 keepalive,因为它能够发送和接收“透明”keepalive 数据包,而不会影响 TCP 数据流的内容。在这种情况下,内置的 keepalive 可能会很有用(特别是如果您确实只需要 keepalive 代码在 Linux 下工作)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)