Usocket unsigned byte 8 不接收数据而字符元素类型接收数据

Usocket unsigned byte 8 doesn't receive data while character element type does

我 运行 发现了 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

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

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

原来问题出在 hyperspec (http://www.lispworks.com/documentation/HyperSpec/Body/f_listen.htm) 中 listen 文档使用的精确措辞中。

Returns true if there is a character immediately available from input-stream; otherwise, returns false. On a non-interactive input-stream, listen returns true except when at end of file[1]. If an end of file is encountered, listen returns false. listen is intended to be used when input-stream obtains characters from an interactive device such as a keyboard.

由于 socket-stream 在被告知生成 '(unsigned-byte 8) 的字符时不会生成字符,因此 listen 将为流 return NIL 无论如何是否有数据可供读取。

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