在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的新内容)。这是什么意思? 我做错了什么?
答案 0 :(得分:5)
代码中的问题是提供给:connect
的关键参数需要创建一个活动的TCP套接字,而不是一个被动的(侦听器套接字),正如您在注释中指定的那样。这是因为,默认情况下,指定套接字是主动还是被动的密钥:active
被赋予值CCL:SOCKADDR
。
错误消息指定系统遇到带有参数NIL
的{{1}}调用,但没有方法存在。所以原因是需要套接字地址但不提供套接字地址。
通过将Emacs与SLIME一起使用,您可以找到:
堆栈上最后一次调用的跟踪:MAKE-SOCKET,调用MAKE-TCP-SOCKET,调用%SOCKET-CONNECT(产生错误);
每个调用中的变量值,例如,在调用%SOCKET-CONNECT时,参数SOCKET-ADDRESS为NIL;
所有这三个函数的代码,通过检查它你可能发现MAKE-TCP-SOCKET
需要一个套接字地址,如果这不是作为key参数的值提供的:remote-address,使用远程主机和远程端口进行解析地址调用。