【问题标题】:How to solve TCP server address already in use error如何解决 TCP 服务器地址已在使用错误
【发布时间】:2013-02-19 11:27:10
【问题描述】:

我正在编写一个 TCP 并发服务器,它将派生一个子进程来处理每个新连接。假设 ClientA 正在与 ChildA 交互,而 server 仍在侦听同一端口。如果我们用 SIGINT 信号杀死 serverClientAChildA 会继续交互。

所以,在那种情况下,如果我重新启动我的服务器,它显然会在bind 函数调用上抛出Address already in use

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

【问题讨论】:

    标签: c networking tcp network-programming


    【解决方案1】:

    2 个选项。

    1. kill ChildAserver 被杀死时处理。

    2. close fdfork 完成后立即在ChildA 中使用listen/bind

    【讨论】:

    • 这些都不能解决问题。这里的问题是TIME_WAIT 状态的端口,您的回答没有解决。
    • 我同意 SO_REUSEADDR,但在我最初阅读该问题时,我将其解读为“一旦 server 被杀死,孩子们将继续生活”,这意味着当 server 重新启动时,端口仍在被监听。 SO_REUSEADDR 在这种情况下无济于事。
    • 我怀疑杀死服务器孩子后进入 TIME_WAIT 状态。他们都互动良好。
    • 正如我在@EJP SO_REUSEADDR 的回答中评论的那样,bind 仍然需要TIME_WAIT
    • 更正。他当然需要关闭分叉子进程中的侦听套接字,或者确保它没有被继承。
    【解决方案2】:

    在绑定之前在监听套接字上设置套接字选项SO_REUSEADDR

    【讨论】:

    • SO_REUSEADDR 在这里没有帮助,因为客户端和服务器子级都在交互。 SO_REUSEADDR 仅对 TIME_WAIT 状态有用。
    • 嗨 rakesh,这个 cmets 看起来我不明白问题。您的客户没有断开连接吗?当使用reuseraddr时,所有新连接都将能够连接
    • SO_REUSEADDR 是必不可少的,但不能解决上述问题。当我明确杀死服务器和孩子时,SO_REUSEADDR 是必不可少的。客户端将处于 TIME_WAIT 状态,因此连接仍然被绑定并被使用。我已经尝试过这种情况,但正在尝试。
    • @raskesh.pandit 您需要 SO_REUSEADDR 并关闭或不继承子(分叉)进程中的侦听套接字。
    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2021-06-03
    • 2016-10-16
    相关资源
    最近更新 更多