2

在 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 新手)。这是什么意思?我做错了什么?

4

1 回答 1

5

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

错误消息指定系统遇到了对CCL:SOCKADDRwith argument的调用NIL,但不存在任何方法。所以原因是需要一个套接字地址,但没有提供。

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

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

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

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

于 2016-12-10T07:39:51.967 回答