Gauche:ソケットとcharconv
from kou
wrap-with-input-conversionを使ってバッファリングモード:modestでポートをopenするにはどうしたらいいんだろう.
or
文字コードの違う文字列をソケット越しにreadするにはどうしたらいいんだろう.
リリース0.7現在のデザイン
現在のconversion portは無条件にfull bufferingにしている。 それ以外のモードはあんまり考えていなかった。
ソケットからの読み込みを行うコードで、select(2)で調べてから read(2)するような場合、一般には入力がどこで切れるかわからないので、 read-block等を使ってraw dataを読んだ後でいろいろ処理するような コードを想定していた。
- kou(2003/07/02 06:11:53 PDT): 分かりました.read-blockで読んでから変換するようにします.でも,入力途中というのはどうやって判断したらいいんだろうか.HTTPみたいにContent-Lengthとかあればいいけど,なかったら?変換してみて例外が発生するかを見る?
- Shiro (2003/07/02 13:48:47 PDT): きちんとやるには、 どっちにせよアプリケーション層での パケット管理が必要では? 先頭にパケット長を入れるか、 パケット終端にデリミタを入れるか。 ただ、経験的には、よっぽど大きなTCPパケットを送りつけない限り、 一つのTCPパケットを一回のreadで取り出せるので、TCPパケット毎に 変換に必要な情報が完結していれば問題になることは少ないようにも思えます。
- kou(2003/07/03 10:09:19 PDT): ごもっともです. 今回は,はじめてのGaucheアプリケーションとして一週間くらいGTKを使って IP Messangerを作って いたのですが,このIP MessangerのプロトコルはUDPで通信してパケット長もいれな いんですね.パケット番号を入れて届かなかったら再送するというスタンスのよう です.なので,今回は例外が発生しなかったら「入力が完了した」ということに しようと思います.
charconvポートを:modestでオープンできるか
ソケットから直にconvertするようなポートを:modestでオープン して、動作するだろうか? ソケットからのreadが不完全な形で 終わっていた場合はどう対応すべきだろうか?
- kou(2003/07/02 06:11:53 PDT): 引数として変換に失敗したデータを受け取るエラーハンドラを受け取るとか?
Shiro: 変換できない場合のハンドリングについては機能追加が必要と 考えています。 ただ、ここで言っているのはそれとは別で、1文字先読みしないと変換が確定しない ケースが稀にあることです。入力の最後が本当のEOFなのか、その後にまだ データが来るのかで処理を変えなければなりません。アプリケーションレベル でのパケットの終端は、低レベルの変換ルーチンにはわからないので、 上位のコードが終端を教えてやる必要があります。
kou(2003/07/03 10:09:19 PDT): これは変換中にさらにソケットにパケットが届いた場合のことを想定しているのですか?そうであれば
- 最初にreadした時点のみを入力とする. 変換中にパケットが届いても次のreadにまわす.
- 変換が終了(しそうになった)時点でソケットにパケットが届いていないか チェックして届いていたらそのパケットもreadしてしまう.
という感じですかねぇ.私だったら前者の方がいいですね.後者だったら ガンガンパケットが送られてきてたらなかなか返ってこなそうですし.
いや,そういう意味じゃないか.これだとバッファリングしてるもんな. たぶん,conversion port的には次のデータが欲しいのにアプリケーション的には 次のデータは欲しくないとかいう場合か. うーん.こういう場合だったらソケットからread出来なくなった時点での結果 (失敗したら例外を上げる)が欲しいな.conversion portが変に気を回して 次の入力を待ってほしくない.その時点で自分の出来ることだけしてくれればいい.