[Gauche-devel-jp] Re: ソケット 入力待ちで停止してしまう

Back to archive index

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



Gauche-devel-jp メーリングリストの案内
Back to archive index