2009年3月18日水曜日

boost::asio で pop3 (2)

 すみません、忙しいのと、いろいろとやりたい事があって気分がのりません。なので、ゆるゆると書き散らす事にします(手書きの図をつけようとも思ったのですが、気分がのらない)。
 boost::asio のブロッキングIOを使ったクライアント側のコーディングは、そんなに難しくないと思います。難しいと感じるのは、やはり、その名のとおり非同期IO処理でしょう。この非同期IOですが、直列化(キュー)されているのでシングル・スレッド感覚でコーディングして構わないのに、妙な難しさがあります。同じような処理をする関数なのに同じにできそうで、できない…。こんなジレンマを感じるのではないかと思います。この辺をクリアにするために、鉄道の路線図のようなものを描いてみることをお勧めします。手書きでも、脳内に描いてもOKです。
 boost::asio では、送信・受信の単位で相手からの応答を待つために、処理を分断しなければなりません。例えば、以下のような2つの路線を想定してみましょう。

路線1:送信A -> 受信 B -> 送信 C -> 受信 D -> 送信 E -> 受信 F
路線2:送信G -> 受信 H -> 送信 C -> 受信 D -> 送信 I -> 受信 J

この2つの路線で共通部分の 送信 C -> 受信 D ですが、受信 D に路線の切替機を設置しないことには、異なる関数として実装しなければならないのです。路線1を走っている場合には、「路線1を走っていますよ」という状態変数を保持し、路線2を走っている場合には、「路線2を走っていますよ」という状態変数を保持して、始めて 受信 D の関数にて、分岐ができるようになります。すなわち、受信のコマンドによる分岐以外で分岐するためには、セッションをクラス化する必要があるのです。
・・・続く

0 件のコメント: