在Windows和Linux上,使用地址与bind()之间的区别 – errno = 98

我有一个小的TCP服务器,监听一个端口。 在debugging的时候,我通常会selectCTRL-C服务器来终止进程。

Windows上,我可以快速重启服务,套接字可以被反弹。 在Linux上,我必须等待bind()返回成功之前的几分钟

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

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

我最好的猜测是,Linux正在等待,直到所有可能的客户端都检测到旧的套接字被破坏,然后才允许创build新的套接字。 要做到这一点的唯一方法就是等待他们超时

有没有办法改变这种行为在Linux的发展? 我希望能够复制Windows的方式

Solutions Collecting From Web of "在Windows和Linux上,使用地址与bind()之间的区别 – errno = 98"

你想在Linux的套接字上使用SO_REUSEADDR选项。 相关的手册页是socket(7) 。 这是一个使用的例子 。 这个问题解释发生了什么。

这是这个答案的重复。

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