【发布时间】:2017-04-25 14:39:45
【问题描述】:
在 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 新手)。这是什么意思? 我做错了什么?
【问题讨论】:
-
您指定的参数太少。默认情况下,您的调用通过 TCP 连接创建流,并且需要指定远程地址。查看documenation中不同参数的含义。
-
它还说默认是活动套接字。使用
:CONNECT :PASSIVE创建监听器。 -
要创建侦听器套接字,:connect 参数必须是:passive,但由于您没有指定它,它:默认情况下是活动的。它在文档链接中指定。
-
这个错误非常糟糕,因为它实际上不是
MAKE-SOCKET函数故意发出的错误信号,而是他们没有正确处理的情况。错误消息说它正在尝试使用参数NIL调用通用函数CCL::SOCKADDR。这是一个很好的提示,表明您缺少您的情况所需的关键字/可选参数。检查文档是最好的方法。您还可以尝试查看MAKE-SOCKET的源代码(如果您有可用的源代码,M-.应该可以在 Emacs 中使用)以查看它调用SOCKADDR的位置以及使用什么参数。 -
您可以使用更高级、更便携的 API,例如 usocket:common-lisp.net/project/usocket
标签: sockets common-lisp ccl