1

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

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

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

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

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

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

4

1 回答 1

4

您想SO_REUSEADDR在 Linux 上的套接字上使用该选项。相关的联机帮助页是socket(7). 这是它的用法示例这个问题解释了会发生什么。

是此答案的副本。

在 Linux 上,SO_REUSEADDR除非存在活动连接,否则允许您绑定到地址。在 Windows 上,这是默认行为。在 Windows 上,SO_REUSEADDR 允许您另外将多个套接字绑定到相同的地址。有关更多信息,请参见此处此处

于 2011-02-12T17:27:57.953 回答