ˆᵛˆ*_*ˆᵛˆ 2 sockets common-lisp ccl
在CCL顶级,运行:
(make-socket :LOCAL-PORT 6666 :LOCAL-HOST "127.0.0.1")
Run Code Online (Sandbox Code Playgroud)
要么
(make-socket :LOCAL-PORT 6666 :LOCAL-HOST (lookup-hostname "localhost"))
Run Code Online (Sandbox Code Playgroud)
输出以下内容:
> 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.
Run Code Online (Sandbox Code Playgroud)
我无法理解错误(CL的新内容).这是什么意思?我做错了什么?
代码中的问题是提供的关键参数MAKE-SOCKET
需要创建活动TCP套接字,而不是像注释中指定的被动套接字(侦听器套接字).这是因为,默认情况下,:connect
指定了套接字是活动还是被动的密钥被赋值:active
.
错误消息指定系统遇到对CCL:SOCKADDR
带参数的调用NIL
,对于该调用,不存在任何方法.所以原因是需要套接字地址但不提供套接字地址.
通过将Emacs与SLIME一起使用,您可以找到:
堆栈上最后一次调用的跟踪:MAKE-SOCKET,调用MAKE-TCP-SOCKET,调用%SOCKET-CONNECT(产生错误);
每个调用中的变量值,例如,在调用%SOCKET-CONNECT时,参数SOCKET-ADDRESS为NIL;
所有三个函数的代码,通过检查它你可能已经发现MAKE-TCP-SOCKET
需要一个套接字地址,如果这不是作为key参数的值提供:remote-address,则使用远程主机调用解析地址和远程端口.