5.1. PiaLan 基本機能

PiaLan を利用する場合の手順や注意点を説明します。

初期化関連処理の順序

Pia のモジュールの初期化を 1.4. セットアップの順序 ページの「モジュールの初期化処理/終了処理の順序」の順で行います。
PiaLan を使用する場合は、以下の処理が必要になります。

  • ネットワークインターフェースの起動
  • ローカル IP アドレスの取得
  • 取得した IP アドレスの PiaLan への登録

PiaSession のスタートアップより前に処理を完了する必要があります。

終了関連処理の順序

PiaSession のクリーンアップ後、再度 PiaSession のスタートアップからセッション処理を行えます。

再スタートアップせずに終了する場合は最初に PiaLan に登録したローカル IP アドレスの設定解除を行います。
次に Pia のモジュールを初期化した順序と逆の順序で終了処理を行います。

PiaLan の初期化

PiaLan モジュールの初期化(lan::Initialize)を行います。

同じルータ下に存在する端末間でマッチメイクを行う LanFacade クラスのシングルトンを生成します。PiaLan の初期化が完了したら、PiaTransport に nn::pia::lan::LanNetworkFactory を渡して初期化します。PiaTransport の初期化については 6. PiaTransport 編を参照してください。

コード 5-1. PiaLan の初期化
/*
PiaCommon の初期化を済ませておきます
*/


// PiaLan を初期化します
result = nn::pia::lan::Initialize();
PIA_ASSERT(result.IsSuccess());

// PiaLan で必要なシングルトンの生成を開始します
result = nn::pia::lan::BeginSetup();
PIA_ASSERT(result.IsSuccess());

// LanFacade のシングルトンを生成します
result = nn::pia::lan::LanFacade::CreateInstance();
PIA_ASSERT(result.IsSuccess());

// PiaLan で必要なシングルトンの生成を終了します
result = nn::pia::lan::EndSetup();
PIA_ASSERT(result.IsSuccess());

/*
nn::pia::transport::Transport::Setting.pFactory に
nn::pia::lan::LanNetworkFactory のポインタを指定して
PiaTransport の初期化を行います。その後、PiaSession の初期化を行います。
*/

ネットワークインターフェースの起動

CTR-SDK の AC ライブラリ、ソケットライブラリを使用してネットワークインターフェースを起動します。

ローカルの IP アドレスを LanFacade に登録

ネットワークインターフェースの起動に成功したら、 ローカルの IP アドレスを取得して、LanFacade に登録します。

コード 5-2. ローカルの IP アドレスの取得、および LanFacade への登録


int32_t ret;
nn::socket::InAddr addr1;
nn::socket::InAddr addr2;

ret = nn::socket::GetPrimaryAddress(reinterpret_cast<uint8_t*>(&addr1), reinterpret_cast<uint8_t*>(&addr2));
PIA_SAMPLE_ASSERT(ret == 0);

nn::pia::lan::LanFacade::LanNetworkSetting setting;
setting.localAddress = nn::pia::common::ByteOrder::NetworkToHost32(addr1.addr);
setting.subnetmask = nn::pia::common::ByteOrder::NetworkToHost32(addr2.addr);
setting.localCommunicationVersion = 0;

nn::pia::Result result = nn::pia::lan::LanFacade::GetInstance()->Bind(setting);
if (result.IsFailure())
{
    // アドレスが取得できず、値がゼロの場合はエラーになります
}


PiaSession API の呼び出し

ローカルの IP アドレスを LanFacade に登録したら以降は PiaSession の API を呼び出すことでセッションの構築/参加処理を行います。詳しくは 7.4. 基本機能 - ブラウズマッチメイク7.5. 基本機能 - ランダムマッチメイクを参照してください。

LAN セッションの開始

session::Session のセッション構築/参加を行う非同期処理中に LAN セッションを開始します。また、セッション破棄/離脱を行う非同期処理中に LAN セッションを終了します。

P2P メッシュネットワークへの参加

セッション参加処理の詳細については、プログラミングマニュアル 7.4. 基本機能 - ブラウズマッチメイク7.5. 基本機能 - ランダムマッチメイク を参照してください。

通信バージョンの不一致検出

LanFacade::LanNetworkSetting 構造体の localCommunicationVersion で通信バージョンを設定できます。異なるバージョン間では通信を行うことができません。セッションに参加する際にバージョン不一致を検出した場合、参加失敗となり、自身と相手のバージョン比較結果により、ResultLanLowerVersion, ResultLanHigherVersion のいずれかが返ります。ResultLanLowerVersion が返る場合、本体機能による更新が必要です。

ディスパッチ処理

LAN セッション中(セッションスタートアップからクリーンアップまでの間)は、Pia のディスパッチ関数(pia::common::Scheduler)を呼び出す必要があります。(Pia のディスパッチについては、6. PiaTransport 編 を参照してください。)

LanFacade に登録した設定の解除

PiaSession のクリーンアップ処理後から PiaSession の終了処理までの間に  LanFacade::Unbind() を呼び出して登録したアドレスの設定を解除します。

ゲームサーバーを使用する場合との変更点

NEX ゲームサーバーを使用してセッションを確立する場合との変更点を以下にまとめます。

  • NEX の初期化処理、終了処理は行わない
  • ゲームサーバーへのログイン、ログアウトは行わない
  • PiaLan の初期化処理で LanFacade のシングルトンを生成する
  • ローカルの IP アドレス、サブネットマスクを LanFacade::Bind() で設定する
  • transport::NetworkFactory は inet::NexNetworkFactory ではなく、lan::LanNetworkFactory を使用する
  • Session API に指定する session::CreateSessionSetting は inet::NexCreateSessionSetting ではなく、lan::LanCreateSessionSetting を使用する
  • Session API に指定する session::JoinSessionSetting は inet::NexJoinSessionSetting ではなく、lan::LanJoinSessionSetting を使用する
  • Session API に指定する session::SessionSearchCriteria は inet::NexSessionSearchCriteria ではなく、lan::LanSessionSearchCriteria を使用する