一尘不染

Windows和Linux上带有bind()的“使用中的地址”之间的区别-errno = 98

linux

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

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

当bind()失败时,它返回errno = 98,正在使用的地址。

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

我最好的猜测是Linux等待所有可能的客户端检测到旧套接字已损坏,然后再允许创建新套接字。唯一的方法就是等待他们超时

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


阅读 426

收藏
2020-06-07

共1个答案

一尘不染

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

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

2020-06-07