マッチングサーバーの作成

マッチングサーバーの作成

フレームワークを利用したマッチングサーバーを書くために必要なことは以下のようなものがある:


これらは sample_match_server/main.cpp に記述されている。

MatchServerインスタンスの生成

nine::match::MatchServer のインスタンスを得る。 ファクトリメソッドが提供されているので、これを呼び出せばいい。


  MatchServer* m_pServer;
  m_pServer = MatchServer::CreateInstance();

マッチングサーバーの設定

サーバーの設定用には MatchServerConfig 構造体が定義されている。 このインスタンスを作ってメンバ変数をセットし、MatchServer::initialize を呼ぶ。

設定構造体は少し複雑になっている。定義を参照しながら解説していく。

MatchServerConfig と二つのネットワーク

まずトップレベルは MatchServerConfig である。


struct MatchServerConfig
{
      struct GameUnitConfig: public ServerUnitConfig {
            std::string host;
            uint16_t port;
      } gameserver;

      struct ClientUnitConfig: public ServerUnitConfig {
            std::string host;
            uint16_t port;
      } client;
};

ここには gameserver, client という二つのメンバがある。 それぞれの型については後で説明するとして、二つある意味を説明する。

マッチングサーバーは、ゲームクライアント接続用とゲームサーバー接続用に二つのアクセプタを持っている。一般的には、クライアント用はインターネットに開き、ゲームサーバーはイントラネットにする。

gameserver, client というメンバはそれぞれのアクセプタ用の設定になっている。

二つの構造体定義は独立しているが、現在のところ定義内容は同じである。 host, port というメンバを持ち、さらに ServerUnitConfig という構造体を継承している。

host,port にアクセプタの bind するアドレスを記述する。

ServerUnitConfig


struct ServerUnitConfig
{
      ServerUnitConfig();
      ServerUnitConfig& operator=(const ServerUnitConfig& r);

      nine::MessageServerConfig mcfg;

      int timeout;
};

ServerUnitConfig は内部に nine::MessageServerConfig を持ち、またメンバ変数 timeout を持つ。

サーバー用、クライアント用の二つのアクセプタは独立した MessageServer に乗っている。 それぞれのメッセージサーバーの設定を mcfg メンバ変数に指定する。 特に、最大接続数 nCommunicators を忘れずに指定すること。

フレームワークは、接続してきた communicator の setSendTimeout/setReceiveTimeout を呼びだす。 この時の引数にここで指定した timeout を用いる。

アカウントモジュールのセット

アカウントモジュールを MatchServer::setAccountModule() で指定する。

アカウントモジュールは AccountModule を継承したクラスで、フレームワーク利用者が作成する。

ルームモジュールのセット

ルームモジュールを MatchServer::setRoomModule() で指定する。

なお、ルームモジュールのセットと同時に新しいマッチングドメインを作る。 setRoomModule の第一引数はルームドメインの名前であり、ユニークにする必要がある。

ルームモジュールは RoomModule を継承したクラスで、フレームワーク利用者が作成する。

MatchServer の実行

実行には MatchServer::turn() を呼び出す。

turn は nine::MessageServer::turn() などと同様に、一回の処理のみを行う。 実際にサーバーを動作させるには繰り返して呼ぶ必要がある。