sockets - 为什么我不能使用 usocket::socket-receive 从我的 usocket 读取数据?

标签 sockets lisp common-lisp

我正在学习 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++ 的本能。

最佳答案

您发布的错误提示您错误地使用了 usocket:socket-receive(稍微清理了一下):

There is no applicable method for the generic function
USOCKET:SOCKET-RECEIVE
when called with arguments
USOCKET:STREAM-SERVER-USOCKET

Documentation for this function表示 usocket:socket-receive 将“从数据报套接字接收数据”。我怀疑您要读取的套接字是 TCP 套接字而不是 UDP 套接字。

关于sockets - 为什么我不能使用 usocket::socket-receive 从我的 usocket 读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45642897/

相关文章:

list - 向列表中的参数添加额外的括号

lisp - 比较 Lisp 中的列表

unit-testing - 宏约定和最佳实践的 Lisp 单元测试

java - 双向多线程套接字连接

asp.net - 有时无法从 Azure 网站访问 Azure SQL 数据库

c - HTTP 通过 C 中的套接字 : Basic file server fails to properly return file

C++ 库 : Questions need Definite Answers(Opinions)

tree - Setf(?)导致树中的循环

list - 如何将文件中的列表添加到 Lisp

common-lisp - 在使用递归连接函数格式后,在 Common Lisp 中打印字符串