

usocketおよび、force-outputについて質問させてください。

usocketの勉強のために簡単なEchoサーバを作りました。 echo1とecho2です。
echo1に対してtelnetでの接続を試みたところ、正常に動作いたしました。
しかしecho2に対してtelnet接続を試みたところ、文字列をサーバに送信したにも関わらず、サーバからレスポンスが戻ってきませんでした。

[code]

    (defun echo1 (host port)
      (usocket:with-socket-listener (socket host port)
        (do () (nil nil)
          (usocket:with-server-socket (socket (usocket:socket-accept socket :element-type '(unsigned-byte 8)))
            (let ((stream (usocket:socket-stream socket)))
              (do ((byte (read-byte stream nil)
                         (read-byte stream nil)))
                  ((null byte) nil)
                (write-byte byte stream)
                (force-output stream)))))))
    
    
    
    (defun echo2 (host port)
      (usocket:with-socket-listener (socket host port)
        (do () (nil nil)
          (usocket:with-server-socket (socket (usocket:socket-accept socket :element-type '(unsigned-byte 8)))
            (let ((stream (usocket:socket-stream socket)))
              (do ((byte (read-byte stream nil)
                         (read-byte stream nil)))
                  ((null byte) nil)
                (write-byte byte stream))
              (force-output stream))))))
    
[/code]

echo1とecho2の違いは、むろん、force-outputの位置です。 そこで、伺いたのですが、どうしてforce-
outputの位置の違いによって、このような違いが生まれるのでしょうか。なお、当方の使用処理系はSBCLです。


CC BY-SA 3.0
2015-01-01T14:16:19.843
2914
2015-01-01T17:17:20.227
2015-01-01T14:35:41.200
3639
5970
question
common-lisp socket
usocketおよび、force-outputに関する質問


`force-output` が実行されるまで入力データがバッファリングされるためです。

[USOCKET API documentation](http://common-lisp.net/project/usocket/api-
docs.shtml)

> force the output to be written to the network?
>
> When you write output to the stream, it may be buffered before sent over the
> network - for optimal performance of small writes. You can force the buffer
> to be flushed the same way as with normal streams:
[code]

>     (format (socket-stream socket) "Hello there~%")   ;; output into buffers
>     (force-output (socket-stream socket))             ;; <== flush the
> buffers, if any
>  
[/code]

echo1 では1行ごとにクライアント側のソケットへ送られますが、echo2 では EOF
が入力されるまでバッファリングされる(クライアント側へは送られない)ことになります。


CC BY-SA 3.0
2015-01-01T15:07:07.540
2916
2015-01-01T17:17:20.227
2015-01-01T17:17:20.227
2914
answer