gpt4 book ai didi

lisp - IOLib 的被动套接字抛出 EADDRINUSE

转载 作者:太空宇宙 更新时间:2023-11-03 18:54:57 25 4
gpt4 key购买 nike

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

嗯,问题是我第一次把socket绑定(bind)到一个端口,运行的很好,然后在slime中用C-c C-c结束线程,再次运行程序,这次抛出了EADDRINUSE的异常:

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

我已经像这样将 reuse_addr 选项设置为绑定(bind)地址:

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

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

最佳答案

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

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

关于lisp - IOLib 的被动套接字抛出 EADDRINUSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8655840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com