書くのが面倒になってサボっていたら、随分間が開いたなあ。
メモ。
送信コールバック関数を、吉里吉里が持つコンティニュアスハンドラを使用して呼び出すようにしました。送信データはオクテット列の配列で、各オクテット列データ(へのポインタ)を、WSABUF構造体の配列に代入しておきます。コンティニュアスハンドラは、オーバーラップデータ構造体が保持する転送サイズを監視し、各WSABUF構造体が保持するサイズを越えるたびに、コールバックイベントをイベントキューにエンキューします *1 。イベントキューにイベントがあれば、コンティニュアスハンドラはそのイベントを実行します。つまり、分割送信をアプリケーションレベルで実現し、分割された各データの送信完了ごとにイベントが発生する、という仕組みです。
イベント発生時にコールバックされる関数は、クライアントソケットが持つメソッドonRequestSendで、要するにイベント関数です。この関数は、最終コールバックかどうかを表すフラグと、何回目のコールバックかを表すカウンタを引数として受け取ります。予め、送信するデータを一定のサイズで区切っておけば、転送の進捗を知ることもできます。また、転送済みのバッファを順次解放したり、転送待ちのバッファにデータを逐次投入することで、使用メモリを節約することも可能になるかもしれません。
SSTPを使って、分割送信とイベント呼び出し(の一歩手前)の動作を確認しました。これと同様の機構を受信でもやるわけですが、受信はちょっと大変かも。
友達と東方花映塚で通信対戦してみました。処理落ちはそれなりに起こっていましたが、シューティングゲームでも意外と動くものですね。対戦中、ADSLモデムのアクセスランプが激しく点滅していましたが、ネットゲームってどれもこんな感じなんでしょうか。
アキバ。本とHDDを購入し、出勤途中(夜勤)の旅人さんと合流しました。カレー屋で食事をしながら例のブツ(何)を引き渡して、解散しました。
PCの内蔵S-ATA HDDをRAID1構成に。
これでうまくいくはず。今日はファイルコピーを仕掛けて就寝。
仕掛けておいたファイルコピーが完了していたので、もう一つの新HDDを接続し、アレイ構成を変更してデュプリケート開始。250GBもあると、さすがに時間がかかりますね、二時間ほど放置して、複製完了。あとはOSレベルで確認して作業終了。問題なし。
…いや、問題が一点ありました。読み込みはかなり速いのですが、書き込みが妙に遅いです。シーケンシャルリードの場合、アクセス場所にもよりますが、速いところでは65[MB/s]、遅いところで41[MB/s]でした。しかし書き込みは場所によらず、19[MB/s]と低い値で安定しています。何が原因なんでしょうか。うーむ。