4

我用 webserver 包编写了一个网络服务器,并且可以在 ghci 中启动它:

:main localhost 8000

如果我Ctrl-C再次运行它,我会得到

*** Exception: bind: resource busy (Address already in use)

所以套接字似乎绑定到我的 ghci 会话。

如何释放该端口绑定,以便在:reload不退出 ghci 的情况下重新启动它?

4

2 回答 2

3

如果底层服务器实现未REUSE_ADDR在套接字上设置选项,通常会发生这种情况。

通常,如果您突然终止服务器,操作系统会将该服务器的旧端口保持在 2MSL 状态几分钟,以防止该端口上的新服务器意外接收到用于先前连接的旧消息。如果您REUSE_ADDR在尝试绑定端口时设置,则指定您希望在 2MSL 周期结束之前强制重用它。

解决此问题的唯一方法是REUSE_ADDR在绑定侦听套接字之前修改用于设置选项的底层 Web 服务器的代码。

于 2013-04-09T02:13:14.360 回答
0

你在 Linux 上吗?如果是,我认为您必须使用lsof来找出哪个进程正在使用给定端口,然后只需终止 PID。我在 Python 中使用 Flask 时已经遇到过这样的问题,所以我认为这里是一样的。你让 ghci 保持打开状态,终止进程,然后重新加载 ghci。这不是一个优雅的方法,但如果它有效,那就太好了!

于 2013-04-09T01:38:59.150 回答