Lisp IOLib的被动插座在使用时会抛出

Lisp IOLib的被动插座在使用时会抛出,lisp,common-lisp,slime,Lisp,Common Lisp,Slime,IOLib允许创建一个被动套接字来监听客户端的连接,在调用listen之前,我们需要调用(bind address)将套接字绑定到指定的地址/端口 问题是,我第一次将套接字绑定到端口时,它运行良好,然后我在slime中使用C-C-C终止线程,然后再次运行程序,这次它抛出了EADDRINUSE的异常: <SOCKET-ADDRESS-IN-USE-ERROR 98 :EADDRINUSE "address already in use", FD: 10> 但我不认为这是问题所在,因

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

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

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

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

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


但是,并非所有内容都会丢失。如果以展开保护形式将函数包装在线程中,则可以安排在函数退出时关闭套接字。

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


但是,并不是所有的都丢失了。如果您以展开保护的形式将函数包装在线程中,您可以安排在函数退出时关闭套接字。

我怀疑
C-C-C
没有做您认为它做的事情。在您认为终止了线程之后,您是否查看了线程列表?如何显示线程列表,以及如何选择一个线程终止?我使用slime选择器
t
来显示线程。您可以在该窗口中使用
k
杀死一个线程。slime附带了一个手册。但实际上我只有一个用户线程在运行,C-C-C所做的就是杀死这个线程,同时杀死侦听套接字。我怀疑
C-C-C
的作用与您想象的不同。您是否在认为已终止线程后查看了线程列表?如何显示线程列表,以及如何选择一个线程终止?我使用slime选择器
t
来显示线程。您可以在该窗口中使用
k
杀死一个线程。slime come但是实际上我只有一个用户线程在运行,C-C-C所做的就是杀死这个线程,同时杀死监听套接字。
   (bind-address socket
                 +ipv4-unspecified+
                 :port 1080
                 :reuse-addr t)