Ошибка 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, вы могли бы найти:
трассировка последних вызовов в стеке: MAKE-SOCKET, который вызывает MAKE-TCP-SOCKET, который вызывает%SOCKET-CONNECT (который вызывает ошибку);
значения переменных внутри каждого вызова, видя, например, что внутри вызова% SOCKET-CONNECT параметр SOCKET-ADDRESS равен NIL;
код всех трех функций, просмотрев его, вы могли бы найти, что
MAKE-TCP-SOCKET
требуется адрес сокета, и если он не указан в качестве значения параметра key:remote-address, то для разрешения адреса выполняется вызов с удаленного хоста и удаленного порта.