如何在ghci中终止套接字服务器?

时间:2013-04-08 23:39:39

标签: haskell ghci

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

:main localhost 8000

如果我 Ctrl-C 并再次运行,我会

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

你在Linux上吗?如果是,我认为您必须使用lsof来找出使用给定端口的进程,然后才能终止PID。我已经在Python中使用Flask这样的问题,所以我认为这是同样的事情。你将ghci打开,杀死进程然后重新加载ghci。它不是一种优雅的方法,但如果它有效,那就太好了!