【问题标题】:difference between "address in use" with bind() in Windows and on Linux - errno=98Windows 和 Linux 中“使用中的地址”与 bind() 的区别 - errno=98
【发布时间】:2011-06-26 03:37:55
【问题描述】:

我有一个侦听端口的小型 TCP 服务器。在调试时,我通常会按 CTRL-C 来终止服务器进程。

在 Windows 上,我可以快速重启服务,并且可以重新启动套接字。在 Linux 上,我必须等待几分钟才能 bind() 成功返回

当 bind() 失败时,它返回 errno=98, address in use.

我想更好地了解实现中的差异。 Windows 确实对开发人员更友好,但我有点怀疑 Linux 是否在做“错误的事情”。

我最好的猜测是,Linux 会等到所有可能的客户端都检测到旧套接字已损坏,然后才允许创建新套接字。它可以做到这一点的唯一方法是等待它们超时

有没有办法在 Linux 开发过程中改变这种行为?我希望复制 Windows 这样做的方式

【问题讨论】:

    标签: windows linux tcp berkeley-sockets


    【解决方案1】:

    您想在 Linux 上的套接字上使用 SO_REUSEADDR 选项。相关的联机帮助页是socket(7)。这是其用法的exampleThis question 解释发生了什么。

    Here's 此答案的副本。

    在 Linux 上,SO_REUSEADDR 允许您绑定到地址,除非存在活动连接。在 Windows 上,这是默认行为。在 Windows 上,SO_REUSEADDR 允许您另外将多个套接字绑定到相同的地址。请参阅herehere 了解更多信息。

    【讨论】:

    • 嘿,非常感谢,不知道要查找 SO_REUSEADDR。现在我做的资料很丰富。谢谢!
    猜你喜欢
    • 2018-11-30
    • 2011-05-26
    • 1970-01-01
    • 2021-05-14
    • 2015-06-04
    • 2020-05-18
    相关资源
    最近更新 更多