我在VxWorks上运行了一个TCP应用程序。我为TCP连接设置了SO_KEEPALIVE选项。我的应用程序跟踪所有TCP连接并将其放入链接列表中。
如果客户端长时间闲置,我们会看到该连接正在关闭。 netstat输出中未列出连接。
由于TCP堆栈关闭了连接,因此不会清除为该连接分配的资源。你可以帮我弄清楚如果由于保持活动失败而关闭连接,应用程序会如何得到通知。
答案 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。