“使用中的地址”和“使用中的地址”之间的区别在 Windows 和 Linux 上使用 bind() - errno=98
我有一个监听端口的小型 TCP 服务器。在调试时,我通常会按 CTRL-C 服务器来终止进程。
在 Windows 上,我能够快速重新启动服务,并且套接字可以反弹。在Linux上,我必须等待几分钟,bind()才能成功返回。
当bind()失败时,它返回errno=98,地址正在使用。
我想更好地理解实现上的差异。 Windows 确实对开发人员更友好,但我有点怀疑 Linux 是否做了“错误的事情”。
我最好的猜测是 Linux 正在等待,直到所有可能的客户端检测到旧套接字已损坏,然后才允许创建新套接字。唯一可以做到这一点的方法是等待它们超时,
有没有办法在 Linux 开发过程中改变这种行为?我希望复制 Windows 的做法
I have a small TCP server that listens on a port. While debugging it's common for me to CTRL-C the server in order to kill the process.
On Windows I'm able to restart the service quickly and the socket can be rebound. On Linux I have to wait a few minutes before bind() returns with success
When bind() is failing it returns errno=98, address in use.
I'd like to better understand the differences in implementations. Windows sure is more friendly to the developer, but I kind of doubt Linux is doing the 'wrong thing'.
My best guess is Linux is waiting until all possible clients have detected the old socket is broken before allowing new sockets to be created. The only way it could do this is to wait for them to timeout
is there a way to change this behavior during development in Linux? I'm hoping to duplicate the way Windows does this
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您想要在 Linux 上的套接字上使用
SO_REUSEADDR
选项。相关的联机帮助页是socket(7)
。这是其用法的示例。 这个问题解释了发生的情况。这是此答案的副本。
在 Linux 上,
SO_REUSEADDR
允许您绑定到地址,除非存在活动连接。在 Windows 上,这是默认行为。在 Windows 上,SO_REUSEADDR 允许您另外将多个套接字绑定到相同的地址。请参阅此处和此处了解更多信息。You want to use the
SO_REUSEADDR
option on the socket on Linux. The relevant manpage issocket(7)
. Here's an example of its usage. This question explains what happens.Here's a duplicate of this answer.
On Linux,
SO_REUSEADDR
allows you to bind to an address unless an active connection is present. On Windows this is the default behaviour. On Windows, SO_REUSEADDR allows you to additionally bind multiple sockets to the same addresses. See here and here for more.