我写了一个Web服务器有,比方说,Web服务器程序包,可以在ghci中启动它:如何在ghci中终止套接字服务器?
:main localhost 8000
如果我按Ctrl-C它和运行一遍,我得到
*** Exception: bind: resource busy (Address already in use)
所以套接字似乎绑定到我的ghci会话。
如何释放该端口绑定,以便我可以:reload
并在不退出ghci的情况下重新启动它?
我写了一个Web服务器有,比方说,Web服务器程序包,可以在ghci中启动它:如何在ghci中终止套接字服务器?
:main localhost 8000
如果我按Ctrl-C它和运行一遍,我得到
*** Exception: bind: resource busy (Address already in use)
所以套接字似乎绑定到我的ghci会话。
如何释放该端口绑定,以便我可以:reload
并在不退出ghci的情况下重新启动它?
你在Linux上吗?如果是的话,我认为你必须使用lsof
来找出哪个进程正在使用给定的端口,然后杀死PID。我已经在Python中使用Flask这样的问题了,所以我认为它在这里是一样的。你离开ghci打开,杀死进程,然后重新加载ghci。这不是一个优雅的方法,但如果它工作,它是好的!
如果底层服务器实现不在套接字上设置REUSE_ADDR
选项,通常会发生这种情况。
通常,如果突然终止服务器,操作系统会将该服务器的旧端口保持在2MSL状态几分钟,以防止该端口上的新服务器意外接收用于以前连接的旧消息。如果在尝试绑定端口时设置REUSE_ADDR
,则指定您希望在2MSL周期结束之前强制重用它。
解决此问题的唯一方法是在绑定侦听套接字之前修改用于设置REUSE_ADDR
选项的基础Web服务器的代码。
我不认为'REUSE_ADDR'是问题 - 一旦我退出ghci,套接字立即变为空闲状态。我的问题是我需要在终止main的'Ctrl-C'上发生这种情况。 – nh2 2013-04-09 03:11:41
@ nh2在这种情况下,我不确定。我认为':reload'将是重置'ghci'并释放所有资源的方式,但您已经说过这样做不起作用。 – 2013-04-09 03:29:30
'ghci'无法知道套接字是否打开。您的服务器需要捕获信号,捕获SIGINT(等等),并在获得该信号时关闭套接字。是的,你仍然需要'REUSE_ADDR'选项,尽管听起来像是在设置。 – MtnViewMark 2013-04-09 06:32:31
不错的想法,但是杀死了我的整个ghci。 – nh2 2013-04-09 03:14:03