【发布时间】:2017-08-11 19:57:13
【问题描述】:
我正在学习 common-lisp,我正在尝试使用 usocket library 使用客户端和服务器 tcp 套接字连接编写一个愚蠢的聊天程序。下面是我的函数。
(defun receive-thread (socket)
(block receiver-nested-loop
(loop
(let ((ready-socket (usocket::wait-for-input socket)))
(let ((return-buffer (usocket::socket-receive ready-socket nil nil)))
(if (not (eq return-buffer :eof))
(handle-received-data return-buffer)
(return-from receiver-nested-loop)))))))
我正在 2 个终端中进行简单的测试运行,我正在手动调用 (main) 函数(我知道如何编译和编写脚本)。
在第一个(用我的ip地址替换x):sbcl --load chat.lisp -a xxx.xx.xxx.xx -s
第二个:sbcl --load chat.lisp -a xxx.xx.xxx.xx
当我的程序到达上述函数时,我收到以下错误:
debugger invoked on a SIMPLE-ERROR in thread
#<THREAD RUNNING {10069DF743}>:
There is no applicable method for the generic function
#<STANDARD-GENERIC-FUNCTION USOCKET:SOCKET-RECEIVE (1)>
when called with arguments
(#<USOCKET:STREAM-SERVER-USOCKET {10069DF673}> NIL NIL).
这是我完整代码的pastebin。
谁能帮我弄清楚我做错了什么以及我需要做些什么来解决它?
编辑:删除程序中多余的 ':' 并重新测试。行为和错误保持不变。所有的函数调用都是导出符号,我只是出于 C++ 的直觉。
【问题讨论】:
-
您使用
::调用函数的事实表明您正在调用包的内部函数。公共接口应该在导出的符号中,您可以使用:而不是::访问。 -
不,我只是新手,很笨。我像 c++ 一样自动编码它而不是 lisp 导出符号。我只是将所有“::”修改为单个“:”,这是同样的错误
-
是的,刚刚检查了文档...
-
您不能在侦听套接字上调用
socket-receive,只能在连接的套接字上调用。您需要致电socket-accept以获取新连接。这就像 C 或 C++ - 您在侦听套接字上调用accept(),在它返回的连接套接字上调用recv()。 -
Yuuuup。在某个时候,我会带着工作代码回到这里并回答我自己认为的问题
标签: sockets lisp common-lisp