2012-01-12 91 views
0

我有一个众所周知的TCP端口上的服务器连接到一群客户端。客户端使用非阻塞选项连接到服务器。TCP CLOSE_WAIT状态..&新连接

当我杀死服务器进程时,客户端套接字进入CLOSE_WAIT状态。现在,如果我重新启动服务器进程并尝试再次连接客户端,connect()调用似乎会阻止,即使它应该是非阻塞的。

实际的修复可能实际上是关闭套接字时服务器死亡。但我试图了解当前的行为..

  • 当一个现有的连接在CLOSE_WAIT什么是阻止建立新的连接?
  • 为什么连接阻塞即使是非阻塞选项设置?

这被认为是在Linux内核2.6.3x ..

+0

2.6.3x内核没有多大意义。 2.6.30和2.6.38之间有相当大的差异。将内核升级到3.0.0或3.1.0可能会有所帮助。 – 2012-01-12 01:42:50

+0

你在使用'SO_REUSEADDR'吗?请参阅http://stackoverflow.com/questions/775638/using-so-reuseaddr-what-happens-to-previously-open-socket – 2012-01-12 01:46:12

+0

@BasileStarynkevitch 2.6.3x是足够的信息为这个问题。这似乎是一个基本的TCP/IP行为,不可能经常改变。实际版本是2.6.32。不,我不打算尝试3.0.0的假设,行为可能会在3.0.0 – Manohar 2012-01-12 01:47:47

回答

1

这听起来像客户端中的错误。如果您将套接字设置为非阻塞状态,然后调用connect,则不应阻止connect调用。您可以粘贴创建套接字的客户端代码,将其设置为非阻塞,并调用connect?此外,你是积极的,它被阻止在connect调用本身?

+0

它有可能是我在客户端有一个错误..客户端有一个inotify fd它监视使用libevent追踪服务器的死亡。看起来像读取inotify fd被阻止。我的坏...并且谢谢。 – Manohar 2012-01-12 09:38:47

0

我相信你的问题是相当准确回答here和相关SO_REUSEADDR。关于Using SO_REUSEADDR - What happens to previously open socket?的其他answer也是相关的。

+0

我担心你错了,SO_REUSEADDR允许你的服务器绑定到处于TIME_WAIT状态的地址。正如我所说我的问题是在客户端。 – Manohar 2012-01-12 02:10:02

+0

我对SO_REUSEADDR的不完全理解是,它改变了连接本身,而不仅仅是服务器端。 – 2012-01-12 02:13:05

+0

'SO_REUSEADDR'只影响服务器是否被允许绑定。 – 2012-01-12 02:33:29