【问题标题】:make-socket error in Clozure Common LispClozure Common Lisp 中的 make-socket 错误
【发布时间】: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


【解决方案1】:

您的代码中的问题是提供给MAKE-SOCKET 的关键参数需要创建一个活动的TCP 套接字,而不是一个被动的(监听器套接字),正如您在评论中指定的那样。这是因为,默认情况下,指定套接字是主动还是被动的键 :connect 的值是 :active

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 2012-12-16
    • 2010-10-24
    • 2011-07-26
    • 2019-11-17
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多