Clozure Common Lisp 中的 make-socket 错误

make-socket error in Clozure Common Lisp

在 CCL 顶层,运行:

(make-socket :LOCAL-PORT 6666 :LOCAL-HOST "127.0.0.1")

(make-socket :LOCAL-PORT 6666 :LOCAL-HOST (lookup-hostname "localhost"))

输出如下:

> Error: There is no applicable method for the generic function:
>          #<STANDARD-GENERIC-FUNCTION CCL::SOCKADDR #x30200043F91F>
>        when called with arguments:
>          (NIL)
> While executing: #<CCL::STANDARD-KERNEL-METHOD NO-APPLICABLE-METHOD (T)>, in process listener(1).
> Type :GO to continue, :POP to abort, :R for a list of available restarts.
> If continued: Try calling it again
> Type :? for other options.

我无法理解错误(CL 的新手)。这是什么意思? 我做错了什么?

您的代码中的问题是提供给 MAKE-SOCKET 的关键参数需要创建主动 TCP 套接字,而不是被动套接字(侦听器套接字),正如您在评论中指定的那样。这是因为,默认情况下,指定套接字是主动还是被动的键 :connect 被分配值 :active.

错误消息指定系统遇到了对 CCL:SOCKADDR 的调用,参数为 NIL,不存在任何方法。所以原因是需要套接字地址,但提供了 none。

通过将 Emacs 与 SLIME 结合使用,您可能会发现:

  1. 堆栈上最后调用的跟踪:MAKE-SOCKET,调用 MAKE-TCP-SOCKET,调用 %SOCKET-CONNECT(产生错误);

  2. 每次调用中变量的值,例如在对 %SOCKET-CONNECT 的调用中,参数 SOCKET-ADDRESS 为 NIL;

  3. 所有三个函数的代码,通过检查它你会发现 MAKE-TCP-SOCKET 需要一个套接字地址,如果它没有作为关键参数的值提供:远程地址,使用远程主机和远程端口调用解析地址。