我有一个侦听端口的小型TCP服务器。在调试时,我通常会CTRL-C服务器以终止进程。
在Windows上,我可以快速重新启动服务,并且套接字可以重新启动。在Linux上,我必须等待几分钟,然后bind()成功返回
当bind()失败时,它返回errno = 98,正在使用的地址。
我想更好地了解实现之间的差异。Windows肯定对开发人员更友好,但是我有点怀疑Linux在做“错误的事情”。
我最好的猜测是Linux等待所有可能的客户端检测到旧套接字已损坏,然后再允许创建新套接字。唯一的方法就是等待他们超时
有没有办法在Linux开发过程中更改此行为?我希望复制Windows执行此操作的方式
您要SO_REUSEADDR在Linux上的套接字上使用该选项。相关的联机帮助页是socket(7)。这是一个用法示例。解释了会发生什么。
SO_REUSEADDR
socket(7)
在Linux上,SO_REUSEADDR除非存在活动连接,否则允许您绑定到地址。在Windows上,这是默认行为。在Windows上,SO_REUSEADDR允许您另外将多个套接字绑定到相同的地址。看到这里和这里了解更多。