2013-02-19 26 views
0

我正在编写一个TCP并发服务器,它将派生一个子进程来处理每个新连接。假设客户端A正与ChildA互动,而服务器仍在同一端口上侦听。如果我们用说SIGINT信号杀死服务器ClientAChildA继续相互作用。如何解决已在使用中的TCP服务器地址错误

所以,在这种情况下,如果我重新启动我的服务器,它显然抛出Address already in usebind函数调用。

什么是所有可能的解决方案,这个问题和通常遵循哪一个?

回答

1

在绑定它之前,在侦听套接字上设置套接字选项SO_REUSEADDR

+0

SO_REUSEADDR在这里没有帮助,因为客户端和服务器端子都在进行交互。 SO_REUSEADDR仅对TIME_WAIT状态有用。 – useratuniv 2013-02-19 03:22:40

+0

嗨rakesh,这个评论看起来像我不明白的问题。你的客户端没有断开连接?当使用reuseraddr时,所有新的连接都可以连接。 – Tectrendz 2013-02-19 03:31:51

+0

SO_REUSEADDR是必需的,但不能解决上述问题。当我明确杀死服务器和子时,SO_REUSEADDR是必不可少的。客户端将处于TIME_WAIT状态,因此连接仍处于绑定状态并正在使用中。我已经尝试过这种情况,但我试了一下。 – useratuniv 2013-02-19 03:48:12

2

2个选项。

  1. killChildA过程时服务器被杀害。

  2. closefd只要fork完成用于listen/bindChildA

+0

这些都不能解决问题。这里的问题是'TIME_WAIT'状态下的端口,你的答案没有解决这个问题。 – EJP 2013-02-19 03:17:27

+0

我同意* SO_REUSEADDR *,但是在我最初阅读的问题中,我将其解读为“孩子继续活着一次*服务器*被杀死”,这意味着当* server *重新启动时端口仍在被监听。 * SO_REUSEADDR *在这种情况下不起作用。 – mmlb 2013-02-19 03:21:18

+0

我杀死服务器的孩子进入TIME_WAIT状态后怀疑。他们都相互影响很好。 – useratuniv 2013-02-19 03:21:41

相关问题