如何在应用程序中处理TCP keepalive

时间:2015-05-21 10:41:45

标签: sockets tcp vxworks

我在VxWorks上运行了一个TCP应用程序。我为TCP连接设置了SO_KEEPALIVE选项。我的应用程序跟踪所有TCP连接并将其放入链接列表中。

如果客户端长时间闲置,我们会看到该连接正在关闭。 netstat输出中未列出连接。

由于TCP堆栈关闭了连接,因此不会清除为该连接分配的资源。你可以帮我弄清楚如果由于保持活动失败而关闭连接,应用程序会如何得到通知。

3 个答案:

答案 0 :(得分:2)

TCP keepalive主要用于防止网络路由器在长时间不活动期间关闭TCP连接,而不是在您认为合适时阻止您的操作系统或应用程序关闭连接。

在大多数TCP / IP实现中,您可以通过尝试从中读取连接来确定连接是否已关闭。

答案 1 :(得分:1)

从此参考文献:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

我引用:

  

此过程很有用,因为如果其他对等方失去连接(例如通过重新启动),即使您没有流量,也会注意到连接已断开。如果您的对等方未回复keepalive探针,您可以断言连接不能被视为有效,然后采取正确的操作。

如果您有一台服务器,并且很多客户端可以连接到它,而不经常发送,您可能最终会遇到不再存在客户端的情况。客户端可能已重新启动,但未检测到,因为在这种情况下永远不会发送FIN。

对于这样的情况,存在keepalive。

从TCP的角度来看,保持活着没有什么特别之处。因此,如果对等方未能使用keepalive,您将在套接字上收到0个字节,并且您必须关闭套接字的末尾。这是你当时唯一可以做的纠正措施。

答案 2 :(得分:0)

  

当TCP堆栈关闭连接时,不会清除为该连接分配的资源。

仅当您再也不使用连接时。

  

如果客户端长时间闲置,我们会看到该连接正在关闭。 netstat输出中未列出连接。

下定决心。要么你看到它,要么你没看到它。您将看到的是netstat中CLOSE_WAIT中的端口。

  

是否可以帮助我弄清楚如果由于保持活动失败而关闭连接,应用程序会如何得到通知。

下次使用连接进行读取或写入时,您将获得ECONNRESET。

相关问题