IOLib的被动套接字抛出EADDRINUSE

时间:2011-12-28 12:19:06

标签: lisp common-lisp slime

IOLib允许创建一个被动套接字来监听客户端的连接,在调用listen之前,我们需要调用(bind-address)将套接字绑定到指定的地址/端口。

好吧,问题是我第一次将套接字绑定到一个端口,它运行良好,然后我在slime中使用Cc Cc来终止线程,并再次运行程序,这次它抛出了EADDRINUSE的异常:

 <SOCKET-ADDRESS-IN-USE-ERROR 98 :EADDRINUSE "address already in use", FD: 10>

我已经将reuse_addr选项设置为bind-address,如下所示:

   (bind-address socket
                 +ipv4-unspecified+
                 :port 1080
                 :reuse-addr t)

但是我不认为这是问题,因为当我在C中做同样的事情时,我使用Ctrl + C来终止进程,我可以重新绑定端口,但是在slime中,唯一的解决方案就是重启emacs,它真的不方便,所以我怎么能解决这个问题,谢谢。

1 个答案:

答案 0 :(得分:1)

退出进程时,任何打开的文件描述符(包括网络套接字)都会关闭,这就是为什么它似乎在C中工作但在CL中不工作的原因。但是,当线程终止时,不会发生这种情况。您会发现在SLIME中使用restart-inferior-lisp命令可以获得所需的行为。

然而,并非所有人都失去了。如果以UNWIND-PROTECT形式将函数包装在线程中,则可以在退出函数时安排套接字关闭。