我用 webserver 包编写了一个网络服务器,并且可以在 ghci 中启动它:
:main localhost 8000
如果我Ctrl-C再次运行它,我会得到
*** Exception: bind: resource busy (Address already in use)
所以套接字似乎绑定到我的 ghci 会话。
如何释放该端口绑定,以便在:reload
不退出 ghci 的情况下重新启动它?
如果底层服务器实现未REUSE_ADDR
在套接字上设置选项,通常会发生这种情况。
通常,如果您突然终止服务器,操作系统会将该服务器的旧端口保持在 2MSL 状态几分钟,以防止该端口上的新服务器意外接收到用于先前连接的旧消息。如果您REUSE_ADDR
在尝试绑定端口时设置,则指定您希望在 2MSL 周期结束之前强制重用它。
解决此问题的唯一方法是REUSE_ADDR
在绑定侦听套接字之前修改用于设置选项的底层 Web 服务器的代码。
你在 Linux 上吗?如果是,我认为您必须使用lsof
来找出哪个进程正在使用给定端口,然后只需终止 PID。我在 Python 中使用 Flask 时已经遇到过这样的问题,所以我认为这里是一样的。你让 ghci 保持打开状态,终止进程,然后重新加载 ghci。这不是一个优雅的方法,但如果它有效,那就太好了!