我正在编写一个TCP并发服务器,它将派生一个子进程来处理每个新连接。假设客户端A正与ChildA互动,而服务器仍在同一端口上侦听。如果我们用说SIGINT信号杀死服务器,ClientA和ChildA继续相互作用。如何解决已在使用中的TCP服务器地址错误
所以,在这种情况下,如果我重新启动我的服务器,它显然抛出Address already in use
上bind
函数调用。
什么是所有可能的解决方案,这个问题和通常遵循哪一个?
我正在编写一个TCP并发服务器,它将派生一个子进程来处理每个新连接。假设客户端A正与ChildA互动,而服务器仍在同一端口上侦听。如果我们用说SIGINT信号杀死服务器,ClientA和ChildA继续相互作用。如何解决已在使用中的TCP服务器地址错误
所以,在这种情况下,如果我重新启动我的服务器,它显然抛出Address already in use
上bind
函数调用。
什么是所有可能的解决方案,这个问题和通常遵循哪一个?
在绑定它之前,在侦听套接字上设置套接字选项SO_REUSEADDR
。
2个选项。
kill
ChildA过程时服务器被杀害。
close
的fd
只要fork
完成用于listen
/bind
在ChildA。
这些都不能解决问题。这里的问题是'TIME_WAIT'状态下的端口,你的答案没有解决这个问题。 – EJP 2013-02-19 03:17:27
我同意* SO_REUSEADDR *,但是在我最初阅读的问题中,我将其解读为“孩子继续活着一次*服务器*被杀死”,这意味着当* server *重新启动时端口仍在被监听。 * SO_REUSEADDR *在这种情况下不起作用。 – mmlb 2013-02-19 03:21:18
我杀死服务器的孩子进入TIME_WAIT状态后怀疑。他们都相互影响很好。 – useratuniv 2013-02-19 03:21:41
SO_REUSEADDR在这里没有帮助,因为客户端和服务器端子都在进行交互。 SO_REUSEADDR仅对TIME_WAIT状态有用。 – useratuniv 2013-02-19 03:22:40
嗨rakesh,这个评论看起来像我不明白的问题。你的客户端没有断开连接?当使用reuseraddr时,所有新的连接都可以连接。 – Tectrendz 2013-02-19 03:31:51
SO_REUSEADDR是必需的,但不能解决上述问题。当我明确杀死服务器和子时,SO_REUSEADDR是必不可少的。客户端将处于TIME_WAIT状态,因此连接仍处于绑定状态并正在使用中。我已经尝试过这种情况,但我试了一下。 – useratuniv 2013-02-19 03:48:12