Shiro Kawai
shiro****@lava*****
2006年 8月 20日 (日) 14:16:18 JST
From: another_face_another_smile****@yahoo***** Subject: [Gauche-devel-jp] ソケット 入力待ちで停止してしまう Date: Sun, 20 Aug 2006 08:43:12 +0900 > > クライアント サーバ > > stdin ------------> > > <----------- 無加工で返す > > > > それで以下のようなものを作ったのですが > > readで停止してしまいます。 > > 改行を入れて送信すれば停止しないことは分かったのですが > > 原因が分かりません。 これはソケットの問題ではなくてreadの仕様なんです。 readは文字列を読むだけでなく、それをS式としてパーズしようとします。 S式が完結するか、明らかなエラーをみつけるまでreadは戻りません。 ためしにクライアントから「(xyz)」という文字列を送ってみて下さい。 今度は改行無しでもreadから返りませんか? readは「(xyz)」の最後の括弧を読んだ時点で、開き括弧から始まるS式が 終わることがわかるので、改行を読まずにそのまま戻ります。 しかし、クライアントから送られたのが「xyz」という文字列であった場合、 readはその次の文字を読まないと、xyz.. で始まるシンボルの名前がまだ 続くのか、そこで終わりでxyzというシンボルを返して良いのかがわかりません。 そのため次の文字を読もうとして待ちに入るのです。 もし改行が付加されていれば、そこでシンボルが終わることがわかるので readは戻ることができます。(その場合、空白文字である改行は捨てられます。 もしxyzの次に読んだ文字が #\( であった場合は、やはりシンボルがそこで 終了しますが、開き括弧文字自体は入力ストリームに残されます) > > その他気になる点としては、 > > :buffering :none の部分は間違っていないでしょうか? 出力ポートについては :buffering :none にするより ひとかたまりの情報を書いた時点で (flush out) する方が好ましいです。 効率が良いですし、TCPパケットが不必要に分割されずに済みます。 > > 入力ポートにもなにか設定が必要でしょうか? デフォルトで適切なバッファリングモードが設定されているので 通常はいじる必要はないです。 > > それと直接関係ないですが、call-with-client-socket を使った場合に > > :buffering :none を設定する方法はあるのでしょうか? 渡されたポートpに対して (set! (port-buffering p) :none) みたいにしてバッファリングモードを変更できます。 --shiro