2013-04-08 41 views
4

我写了一个Web服务器有,比方说,Web服务器程序包,可以在ghci中启动它:如何在ghci中终止套接字服务器?

:main localhost 8000 

如果我按Ctrl-C它和运行一遍,我得到

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

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

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

回答

0

你在Linux上吗?如果是的话,我认为你必须使用lsof来找出哪个进程正在使用给定的端口,然后杀死PID。我已经在Python中使用Flask这样的问题了,所以我认为它在这里是一样的。你离开ghci打开,杀死进程,然后重新加载ghci。这不是一个优雅的方法,但如果它工作,它是好的!

+0

不错的想法,但是杀死了我的整个ghci。 – nh2 2013-04-09 03:14:03

3

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

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

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

+0

我不认为'REUSE_ADDR'是问题 - 一旦我退出ghci,套接字立即变为空闲状态。我的问题是我需要在终止main的'Ctrl-C'上发生这种情况。 – nh2 2013-04-09 03:11:41

+0

@ nh2在这种情况下,我不确定。我认为':reload'将是重置'ghci'并释放所有资源的方式,但您已经说过这样做不起作用。 – 2013-04-09 03:29:30

+2

'ghci'无法知道套接字是否打开。您的服务器需要捕获信号,捕获SIGINT(等等),并在获得该信号时关闭套接字。是的,你仍然需要'REUSE_ADDR'选项,尽管听起来像是在设置。 – MtnViewMark 2013-04-09 06:32:31

相关问题