7.7. 基本機能 - 参加募集状態の変更

セッションは作成時の設定によってオープン(参加募集中)/クローズ(参加締切)のどちらかの状態となっています。セッションホストは参加募集状態の変更 API を使用することで、募集状態を変更できます。

参加募集状態の変更

参加募集状態をオープンに変更する場合、OpenSessionAsync() を呼び出します。呼び出しにより非同期処理が開始され、IsOpenSessionCompleted() で非同期処理の終了を検知できます。変更処理に成功すると GetOpenSessionResult() は IsSuccess() が真となる Result 値を返します。

コード 7-14. 参加募集状態をオープンに変更する場合
result = nn::pia::session::Session::GetInstance()->OpenSessionAsync();
if (result.IsFailure())
{
    // エラー処理
}

// 非同期処理の開始に成功した場合、ディスパッチ関数を定期的に呼び出して非同期処理の進行を待つ必要があります
while (nn::pia::session::Session::GetInstance()->IsOpenSessionCompleted() == false)
{
    if (networkType == Internet)
    {
        // インターネット通信の場合、サーバーとのキープアライブ通信などのために NEX の Scheduler::Dispatch を呼ぶ必要があります
        nn::nex::Scheduler::GetInstance()->DispatchAll();
    }
    nn::pia::common::Scheduler::GetInstance()->Dispatch();
}
 
// 非同期処理の結果確認
result = nn::pia::session::Session::GetInstance()->GetOpenSessionResult();
if (result.IsFailure())
{
    // エラー処理
}

 

参加募集状態をクローズに変更する場合、 CloseSessionAsync() を呼び出します。呼び出しにより非同期処理が開始され、IsCloseSessionCompleted() で非同期処理の終了を検知できます。変更処理に成功すると GetCloseSessionResult() は IsSuccess() が真となる Result 値を返します。

クローズの非同期処理では以下のように処理が行われます。

  1. 参加しているマッチメイクセッションを締め切ります(インターネット通信の場合、Pia 内部で nex::MatchmakeExtensionClient::CloseParticipation() を呼び出します)。
  2. マッチメイクセッションの参加者数とメッシュの参加者数が一致していることを確認します。
    1. 参加者数が一致していれば、問題なくクローズが行えたとして非同期処理を終了します。
    2. 参加者数が一致していない場合、マッチメイクセッションのクローズ前に新規参加者(または離脱者)がいたと判断し、参加処理(または離脱処理)の完了を待つ状態に移行します。
  3. 完了待ち状態の間に、参加者数が一致すれば問題なくクローズが行えたとして非同期処理を終了します。
  4. 完了待ち状態に移行してから一定期間(15秒)経過しても参加者数が一致しない場合、タイムアウトして非同期処理を終了します。

非同期処理がタ イムアウトした場合、GetCloseSessionResult() は ResultNegligibleFault を返します。このとき、マッチメイクセッションを締め切ることには成功していますが、非同期処理終了後に新規参加者がメッシュに参加してくる可能性があります。アプリケーション側で適切な処理を行う必要があります。

以下に適切な処理例を紹介します。

  • 再度 CloseSessionAsync() を呼び出してクローズ処理が成功するのを待ちます。
  • 非同期処理完了後に新規参加されても問題が起きないようにアプリケーション側で適切に処理を行います。
  • セッション参加承認判定用コールバックを登録しておき、新規参加者の参加を拒否します。
コード 7-15. 参加募集状態をクローズに変更する場合
result = nn::pia::session::Session::GetInstance()->CloseSessionAsync();
if (result.IsFailure())
{
    // エラー処理
}

// 非同期処理の開始に成功した場合、ディスパッチ関数を定期的に呼び出して非同期処理の進行を待つ必要があります
while (nn::pia::session::Session::GetInstance()->IsCloseSessionCompleted() == false)
{
    if (networkType == Internet)
    {
        // インターネット通信の場合、サーバーとのキープアライブ通信などのために NEX の Scheduler::Dispatch を呼ぶ必要があります
        nn::nex::Scheduler::GetInstance()->DispatchAll();
    }
    nn::pia::common::Scheduler::GetInstance()->Dispatch();
}
 
// 非同期処理の結果確認
result = nn::pia::session::Session::GetInstance()->GetCloseSessionResult();
if (result.IsFailure())
{
    if (result == ResultNegligibleFault())
    {
        // 非同期処理がタイムアウトしました
        // この時点でマッチメイクセッションは閉じることには成功していますが、後で新規参加者がいるかもしれません
        // アプリケーションで適切にハンドリングする必要があります
    }
    else
    {
        // エラー処理
    }
}

参加募集状態の取得

セッションホストは GetSessionOpenStatus() で参加募集状態を取得できます(Session::IsHost() が真となる条件で取得できます)。オープン状態の場合は SessionOpenStatus_Open, クローズ状態の場合は SessionOpenStatus_Close が返されます。

クライアントは参加募集状態を取得できません。クライアントが GetSessionOpenStatus() を呼び出した場合は SessionOpenStatus_Unknown が返されます。

ホストマイグレーションが行われた場合、新しくセッションホストになったステーションは参加募集状態がアプリケーションにとって適切な状態であるかを確認し、必要であれば募集状態を適切な状態に変更します。