セッションは作成時の設定によってオープン(参加募集中)/クローズ(参加締切)のどちらかの状態となっています。セッションホストは参加募集状態の変更 API を使用することで、募集状態を変更できます。
参加募集状態をオープンに変更する場合、OpenSessionAsync() を呼び出します。呼び出しにより非同期処理が開始され、IsOpenSessionCompleted() で非同期処理の終了を検知できます。変更処理に成功すると GetOpenSessionResult() は IsSuccess() が真となる Result 値を返します。
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 値を返します。
クローズの非同期処理では以下のように処理が行われます。
非同期処理がタ イムアウトした場合、GetCloseSessionResult() は ResultNegligibleFault を返します。このとき、マッチメイクセッションを締め切ることには成功していますが、非同期処理終了後に新規参加者がメッシュに参加してくる可能性があります。アプリケーション側で適切な処理を行う必要があります。
以下に適切な処理例を紹介します。
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 が返されます。
ホストマイグレーションが行われた場合、新しくセッションホストになったステーションは参加募集状態がアプリケーションにとって適切な状態であるかを確認し、必要であれば募集状態を適切な状態に変更します。