予習超大事
本当に、前回予習した事だけで作れてしまった。
やっぱり予習は大事だな。もっとこう、中学生くらいの時に気付きたかったね。
免責事項(必読)
それで、だ。このサンプルは、以下の2つが全て揃った時に初めてIPアドレスなどの情報を書いたり見たりできるようになる。
- ユーザーエージェント名
- GETメソッドで送信するデータの名前と数
これらはソース中に記載されている。そしてこのマッチングサーバーの改造版は、実際にWORZやBOMBERDMANで使う予定である。
従って、ユーザーエージェント名については全くでたらめな値を入れておく。そうしておかないとCGIを悪用されかねないので。また、そのほかにも幾つかの手段を用いてユーザーがホンモノであるかどうかをチェックするが、サンプルには実装しない。適宜研究してくれ。まあ素人の浅知恵程度のモノではあるが・・・
また、このソースを流用して発生するいかなる損害も俺は責任を負わない。自己責任でな。
CGI解説
全体の流れ
まず、サーバーの現在の時間を取得する処理などが入っている。今回は単純な秒比較を行うため、time関数を用いて秒単位で時間を取得している。
サーバーリストが存在する場合は読み込み、ユーザーエージェントでHSPからのアクセスか、それ以外からのアクセスかを判別する。
HSPからアクセスされた場合
ユーザーエージェントによりHSPからのアクセスと判断されたら次にデータを読み取る。今まではデータの中身だけで名前は特に気にしていなかったが、今回は名前も極めて重要な要素だ。
- hostname
- filever
- comment
- readmode
という4つのデータ名を受信した場合に特別な処理が入る。
readmodeを受信した場合、その他データの内容如何に関わらず読み込みモードとして動作する。後述する登録処理がスキップされるわけだ。
そして他の3つについては、それぞれを1つ以上受信しないとエラーとなり終了する。通常プログラムから呼び出すのでこれらの値が欠ける事は無いだろうが、まあそういう風にしてある。
そして読み込みモードでなければ登録作業になる。
まずIPアドレスによって、このユーザーが過去にホスティングしていないか調べる。もしサーバーリストにこのユーザーと同じIPアドレスがなかった場合、新規登録となる。
サーバーに次の情報を保存する。登録時の時間(秒)、名前、ゲームのバージョン、コメント、IPアドレスである。この登録時の時間とCGIが起動したときの時間を比べ、保存期限以内であれば残しそれ以外は削除される。さらに出力時には、出力期限以内であれば出力される。
従ってホストは、出力期限以内に定期的にサーバーにアクセスすることで、自分がホスティングしているという事を知らせ続ける。
もし通常終了、もしくは異常終了してサーバーへ一定時間アクセスが無い場合は出力時のリストから外され、さらに長時間アクセスが無かった場合にはサーバーのファイルから削除されるという寸法だ。
それで、登録しようとした際に既にサーバーリストにこのユーザーがいた場合だが、次にそれがいつであるかを調べる。表示期限以内ならば、そのままの状態で時間値の更新だけを行う。表示期限外ならば、新規ユーザーと同じ手順で新たに登録する。
その後出力処理だ。ファイルに保存期限以内のホストのデータが出力され、さらに読み込みモードであり、表示期限以内のホストがいた場合には、標準出力に出力され、文字列がHSPに送付される手はずとなっている。
指定したユーザーエージェント以外からのアクセスされた場合
問答無用でブラウザからのアクセスと断定する。
読み込んだサーバーリスト全体から保存期限以内の物のみを書き出し、さらに表示期限以内の物を標準出力に出力している。テーブルタグを使い、表組みにしてみた。テスト用クライアントを走らせると、最後のアクセスから凡そ一分間は以下のような表示になる。
ダウンロード
テケスト形式でうpしておく。
samplecgi.txt
HSP側での対応について
サーバーを作ったがはいいが、次はクライアントを対応させねばなるまい。
・・・っつっても、チョコチョコ変わるだけなのでそう難しい作業ではないはずだ。2~3日以内にやっておく。しておいた。ソースコードと実行ファイルをうpしておいたので各自研究してくれ。
実行ファイルは稼働中のマッチングサーバーに接続可能であり、そのまま全世界の人々と対戦することが出来る。*1もっといろいろな人と対戦したいならば口コミで広めるべし。ソースコードはユーザーエージェント名等が適当になっているので、このままでは接続できない。また現在稼働中のマッチングサーバーについては、ソースは公開しない。
問題点
- HTMLタグをコメントに入れられると反映されてしまい極めて危ない
- サンプルでは実装されていないが稼働中のサーバーはタグを無効化するようにしてある