【问题标题】:Why won't can't I read from my usocket using usocket::socket-receive?为什么我不能使用 usocket::socket-receive 从我的 usocket 中读取数据?
【发布时间】: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


【解决方案1】:

您发布的错误提示您错误地使用了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 套接字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2022-11-02
    • 2019-05-15
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2015-04-12
    相关资源
    最近更新 更多