another_face_another_smile****@yahoo*****
another_face_another_smile****@yahoo*****
2006年 8月 20日 (日) 15:02:49 JST
赤木です。 理解でしました。 > これはソケットの問題ではなくてreadの仕様なんです。 > readは文字列を読むだけでなく、それをS式としてパーズしようとします。 > S式が完結するか、明らかなエラーをみつけるまでreadは戻りません。 > > ためしにクライアントから「(xyz)」という文字列を送ってみて下さい。 > 今度は改行無しでもreadから返りませんか? > readは「(xyz)」の最後の括弧を読んだ時点で、開き括弧から始まるS式が > 終わることがわかるので、改行を読まずにそのまま戻ります。 その通りでした。 すっかり、S式をパースすることを忘れていました。 S式を読むときは port->sexp-list とばかり考えていたもので。 パースできればいいので xyz<space><改行> などとやってみても大丈夫でした。 ありがとうございました。 At Sat, 19 Aug 2006 19:16:18 -1000 (HST), Shiro Kawai wrote: > > 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 mailing list > Gauch****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/gauche-devel-jp -------------------------------------- Let's start Yahoo! Auction - Free Campaign Now! http://pr.mail.yahoo.co.jp/auction/