Ошибка make-socket в Clozure Common Lisp

На 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). Что это значит? И что я делаю не так?

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 требуется адрес сокета, и если он не указан в качестве значения параметра key:remote-address, то для разрешения адреса выполняется вызов с удаленного хоста и удаленного порта.

Другие вопросы по тегам