2015-12-05 22 views
0

我遇到了一些與USocket庫真正令人費解的行爲。請考慮以下代碼片段:Usocket無符號字節8在字符元素類型不接收數據時

(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上運行clisp-2.49,USocket 0.6.3.2,以防萬一)。

回答

0

原來問題出在的超文本(http://www.lispworks.com/documentation/HyperSpec/Body/f_listen.htm)文檔中使用的精確措辭。

返回true,如果有一個字符立即從輸入流;否則,返回false。在非交互式輸入流上,除文件[1]結尾處外,listen返回true。如果遇到文件結尾,listen將返回false。當輸入流從諸如鍵盤的交互設備獲得字符時,傾聽被使用。

由於socket-stream如果它告訴產生'(unsigned-byte 8)的,listen將爲流返回NIL不管它是否有數據準備好被讀取不產生字符。

據我所知,在標準中沒有替代listen的非字符類型。使用usocket的wait-for-input代替,:timeout設置爲0輪詢(http://quickdocs.org/usocket/api)。

相關問題