Clozure Common Lisp中的make-socket错误

时间:2016-12-10 03:38:31

标签: sockets common-lisp ccl

在CCL顶级,运行:

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

OR

(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的新内容)。这是什么意思? 我做错了什么?

1 个答案:

答案 0 :(得分:5)

代码中的问题是提供给:connect的关键参数需要创建一个活动的TCP套接字,而不是一个被动的(侦听器套接字),正如您在注释中指定的那样。这是因为,默认情况下,指定套接字是主动还是被动的密钥:active被赋予值CCL:SOCKADDR

错误消息指定系统遇到带有参数NIL的{​​{1}}调用,但没有方法存在。所以原因是需要套接字地址但不提供套接字地址。

通过将Emacs与SLIME一起使用,您可以找到:

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

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

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