2009-09-29 90 views
0

在与服务器建立tcp连接后,我关闭了我的应用程序并调用了Socket.close()。TIME_WAIT中的tcp连接将不允许重新连接,java

检查netstat -pant,我看到连接处于TIME_WAIT状态。

这可以防止我立即连接回服务器,因为我使用相同的端口进行连接。相反,我必须等待连接到TIME_WAIT状态超时才能重新连接。我使用了套接字方法:set_so_timeout(),set_keepalive(),set_so_linger()和set_reuseaddr() - 在这篇文章中,方法的精确拼写可能并不正确。

我的问题是如何从TIME_WAIT状态中获取连接,以便我可以立即重新建立连接?

请让我知道。

感谢, JBU

回答

5

获取连接了TIME_WAIT的最好的方法是(奇怪)等待:-)

那怎么TCP/IP的作品。会话由元组(sourceIP, sourcePort, destIP, destPort, protocol)标识,您无法重新使用它的原因是因为可能有数据包在网络中某处仍然存在。

TIME_WAIT状态通常是最大数据包lifetme两次,你应该与它摆弄,因为这可能会导致数据包与前一交易日(这会搞砸了你的当前会话)显示出来。

理想情况下,您应该从不同的源端口连接,然后您将能够立即打开会话。

你应该注意的另一件事是非常封闭的会议。我一直订阅客户端关闭会话的指导方针(并将其彻底关闭)。这最大限度地减少了长期半封闭会议的可能性。

+0

是的,不同的端口解决了这个问题,我现在就会使用它。 但是,如果我想使用相同的源端口,so_linger方法描述看起来像是要工作。我只是不确定它为什么没有。 – jbu 2009-09-29 02:03:10

+1

SO_LINGER绝对不推荐。充其量,支持在非BSD平台上是零星的。 – paxdiablo 2009-09-29 02:08:32

+0

我不认为使用另一个连接字符串是一个很好的解决方案,应该有一些方法来强制TCP/IP刷新套接字中的所有内容并关闭连接。 – 2010-09-01 09:07:10