ちょっと前にオンラインアップデート用のEXEを作った事があったので、
今回はその事について。

本当は本体のFormCreateイベント辺りに1度だけ実行すべきなのかも知れないですが、
違う言語で既に生成されたEXEだった事もあり、別途EXEとして作成してみました。

まず、最初にオンラインゲームのアップデート手順を色々と参考にして、自分なりに手順を考えてみました。

・対象EXEが起動していない事を確認する(起動していた場合はアップデートEXEを終了)
・サーバーに接続する
・バージョン情報とCRC情報、ファイルサイズをサーバから取得する
・クライアントの現在バージョンと最新バージョンを比較する
・バージョンが古い場合はサーバから新しいデータを取得する
・データの転送が終了したのち、CRCとファイルサイズを照合する
・ファイルが破損していた場合は直ちに取得したデータを削除して、終了する
・照合に成功した場合は、古いファイルを削除し、新しいファイルを移動する

という、流れです。

その際、一番迷ったのがサーバーです。
HTTPでアクセスする場合、無論、HTTPサーバに接続してDLするわけですが、
この場合、Webブラウザ等からもアクセスできてしまうので、色々と問題がありそうです。
(制限などを設ければいいかもしれないが)
更に、バージョン情報の問い合わせを行う際に、専用のファイルを毎回用意する必要があり、
パッチ準備の負担も大きくなってしまいます。(補助EXEを作れば随分マシになりますが)

FTPで接続する場合、一番の問題点はアカウント情報でしょうか。
EXEにアカウント情報を組み込むのは、例えanonymousでもいい感じには思えません。

以上の事を考えると、パッチ専用のサーバは用意すべきなのか?と言うことです。
自前でパッチ用サーバを作れば、情報管理はEXE上で行えるので、ファイルを用意する必要がなくなります。(規模にもよりますが)
更に、HTTPからの要求は全て無視できるので何かと好都合です。また、パッチの失敗回数など、特定の情報も取得できます。
問題点と言えば、HTTPサーバと併用して使用するのでサーバの負担が増加する事と、セキュリティの問題ですかね。

最近はよくオンラインアップデート機能を見かけますが、HTTPがメジャーなんでしょうかね?
また、実行中のEXEを終了せずにアップデートが可能な物が多いですが、あの中は一体どうなっているんでしょうか・・・。

カテゴリー: ニュース

1件のコメント

koreyasu · 2007-07-09 15:15

HTTPリクエストにはUSER_AGENTというクライアント側のアプリケーションを特定する情報が含まれています。(アンチウィルス等で消されたり、意図的に変更されたりする可能性もあります。)
通常の用途では、ブラウザ間の差異やPCと携帯の差異に対応する為の判断材料になっています。
この情報を利用して、特定クライアントからであればDL。それ以外であれば、何かメッセージを表示という風にする事もできます。

アップデートのプログラムを作ったことがありますが、私の場合はディレクトリ=バージョン情報とし、新しいバージョンのディレクトリがあればアップデート開始という風にしていました。
物によっては、上書き、削除等ありますので簡単なスクリプトを各ディレクトリにいれ、この内容を元にアップデート作業を自動的に行う形です。

最近のネットゲームのオンラインアップデートに関しては、P2Pのファイル共有システムを使ったものが多いですね。サイズが100MB超えるものも多くなって来てますので。また、ファイルのダウンロード開始と、パッチ適用日をずらすことによって、負荷集中を避けるようにしてるケースも多いです。

現在コメントは受け付けていません。