C++ Builder CE ネットワークプログラミング 番外編

gamespy.com->openspy.netだって

番外編です。オールドタイマーかつゲーマーにはおなじみだったGamespy.comがシャットダウンしたのはずいぶん前でしたが、その代替としてOpenspy.netが動いています。後者は前者を模倣するものですが、かなり完成度というか互換性が高く、ソースコードないしバイナリで“gamespy.com”“openspy.net”に置き換えることで、昔のようにゲームクライアントやサーバーが動くようです。文字数も同じだし、バイナリの改変はStirling等ののバイナリエディタで簡単にできます。まず、Luigi Auriemma氏のgslistからいじってみましょうか?

今は今月の帯域超えているとかで表示されないようですが、その場合には来月早々にでも再訪してください。gslistはGame Server Listの意で、昔のmaster.gamespy.comに集結している各ゲームサーバーの情報を取り出すことができます。そのサーバーリストで、各サーバーの情報も取り出すことができます。今回は、懐かしいBattleField2142関係のサーバーリストや、liveな各サーバーの情報を取り出すことを考えます。まずgslistのソースコードが供給されていますから、ソース内の”gamespy.com”への参照を”openspy.net”にすげ替えてbuildしてみましょうかね?

上記のLuigi氏のサイトからgslist.zipをダウンロードします。解凍すると、

このようなファイル構成です。ここでコースは二つに分かれます。ここではソースを改変して現行のopenspy.netで動かすことにトライします。srcディレクトリ以下は、

のようになっています。C言語のソースですが、C++ Builder CEで扱えます。まず、IDEを起動して、

新規作成->コンソールアプリケーションを選択します、

上図のようにソースの種類としては”C”を選んで、“OK”

いったん適切なフォルダーを新規で作成し、そこへセーブしておきます。そのフォルダー内部に、先ほど展開して得られたソースコード(*.cと*.h)をコピーします。それらを全部プロジェクトに足して、元々のFile1.cはプロジェクトから削除します。その状態が、

このようになっているはずです。ここで先ほどから述べている文字列“gamespy.com”から“openspy.net”への置換をまず行っておきましょう。それはまずどれか例えばgslist.cをダブルクリックして、表示しておきます。それで、下の図のようにメインのメニューから検索->置換を選択します。

それから出てきたダイアログで、

”すべて置換”を選択(クリック)。

ついでに、”WIN32“を”_WIN32“に全て置換しましょう。で、SHIFT-F9を押します。それですんなりコンパイルが通るはずもなく、

[bcc32c 致命的エラー] gslist.c(64): 'GeoIP.h' file not found

とか言われますから、ここからソースを手動でいじりますGeoIPにも興味はありますが、サポートするのが面倒そうなので、パス。ここは

//#include <GeoIP.h>

とコメントアウトでおけ。再度コンパイル。またエラーが出るので、


//GeoIP   *geoipx         = NULL;
FILE    *fdout          = NULL;             // for the -o option
in_addr_t msip          = INADDR_NONE;
int     megaquery       = -1,
        scandelay       = 5,
        no_reping       = 0,
        ignore_errors   = 0,
        sql             = 0,
        quiet           = 0,
        myenctype       = -1,   // 0, 1 and 2 or -1 for the X type
        force_natneg    = 0,
        enctypex_type   = 1,
        multi_query_custom_binary_size = 0;
u16     msport          = MSPORT;           // do N OT touch
u8      *mshost         = (u8 *)MS,         // do N OT touch
        *msgamename     = (u8 *)MSGAMENAME, // do N OT touch
        *msgamekey      = (u8 *)MSGAMEKEY,  // do N OT touch
        *mymshost       = NULL,
        gslist_path[GSMAXPATH + 1] = "",
        *sql_host       = NULL,
        *sql_database   = NULL,
        *sql_username   = NULL,
        *sql_password   = NULL,
        *sql_query      = NULL,
        *sql_queryb     = NULL,
        *sql_queryl     = NULL,
        *enctypex_query = "",
        *multi_query_custom_binary = NULL;

こんな感じでGeoIPをコメントアウト。以下同様にひたすらコンパイルが通るようにします。あー、zlib.h関係も飛ばします。なんとかコンパイルが通れば、バイナリができあがります。テストしてみますかね?IDEのメインメニューの”実行”->”実行時引数”を選択。

以下のダイアログで、図のように”パラメータ”に”-n stella”を入れます。

これで保存してから実行すると、何やら表示されますが、main関数の終了とともに、画面(コマンドプロンプト)が閉じてしまうので、main()の最後のreturn文の前にgetchar()でも入れておきましょう。

結果が得られました。ちなみに”-n stella”というのはBF2142のサーバーをqueryしています。当初はデバッガで動作を追いかけて、ソースコードレベルでgslistを取り込んで使うことを考えましたが、今回はアボートしました。大昔には、Luigi氏のソースを元に、Halo Combat Evolvedのゲームサーバーブラウザを作って、busyなサーバーへのredialとか実現していたのですが、ソースコードが見つからないので、諦めました。次は、バイナリパッチによるgslistのリバイブの記事でも書きます。

コメント