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,它真的不方便,所以我怎么能解决这个问题,谢谢。
答案 0 :(得分:1)
退出进程时,任何打开的文件描述符(包括网络套接字)都会关闭,这就是为什么它似乎在C中工作但在CL中不工作的原因。但是,当线程终止时,不会发生这种情况。您会发现在SLIME中使用restart-inferior-lisp命令可以获得所需的行为。
然而,并非所有人都失去了。如果以UNWIND-PROTECT形式将函数包装在线程中,则可以在退出函数时安排套接字关闭。