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