0

我在使用 USocket 库时遇到了一些真正令人费解的行为。考虑以下代码段:

    (defvar server-socket (usocket:socket-listen "localhost" 43593 
                                                 :element-type 
                                                 '(unsigned-byte 8)))

    (defvar client-connection (usocket:socket-accept server-socket))
    ;in a separate terminal, type "telnet localhost 43593".
    ;then type some text and hit enter.

    (listen (usocket:socket-stream client-connection))
    => NIL

为什么会这样?当我:element-type '(unsigned-byte 8)从论点中省略时usocket:socket-listen,它工作得很好。我可以理解是否任何任意字节都不能表示为字符(例如 utf-8 编码具有无效的字节序列),但是反过来 - 不能用字节表示的字符 - 没有意义,尤其是在网络中语境。

(如果有帮助,我在 Lubuntu 15.10、USocket 0.6.3.2 上运行 clisp-2.49)。

4

1 回答 1

0

事实证明,问题出listen在超规范(http://www.lispworks.com/documentation/HyperSpec/Body/f_listen.htm)中的文档使用的精确措辞中。

如果输入流中存在立即可用的字符,则返回 true ;否则,返回 false。在非交互式输入流上,listen 返回 true,除非在文件 [1] 末尾。如果遇到文件结尾,listen 返回 false。当 input-stream 从交互设备(如键盘)获取字符时使用 listen。

由于如果被告知生成'ssocket-stream不会生成字符,因此无论它是否有数据可供读取,都会返回流。'(unsigned-byte 8)listenNIL

据我所知,listen标准中没有非字符类型的替代品。使用 usocketwait-for-input代替,:timeout设置为 0 进行轮询(http://quickdocs.org/usocket/api)。

于 2015-12-05T23:48:25.310 回答