7.6. 基本機能 - セッション参加中の処理

セッション参加中の処理について説明します。

送受信

セッション参加中は PiaTransport を使用することで、ステーション間でデータ送受信を行えます。送受信については 6. PiaTransport 編および関数リファレンスを参照してください。

ネットワーク接続状態のチェック

Session クラスの接続状態チェック関数を呼び出すことで、自分がセッションに接続できているかどうかをチェックできます。セッションホストがセッションを破棄した場合や、通信が継続できなかった場合など、外的要因で切断状態になることがあります。

切断状態には、セッションから切断された場合、無線オフによる切断を含むネットワークインターフェースが切断状態になった場合の 2 種類があり、再度セッションを開始するための処理が異なります。

非同期処理中は、非同期処理内でネットワーク接続状態をチェックし、切断時には非同期処理結果としてエラーを返すため、ネットワーク接続状態のチェックを行う必要はありません。

コード 7-10. ネットワーク接続状態のチェック
// 接続状態を取得し、チェックする
nn::pia::Result sessionConnectionStatusResult = nn::pia::session::Session::GetInstance()->CheckConnectionError();
if (sessionConnectionStatusResult == nn::pia::ResultSessionConnectionIsLost())
{
    // メッシュ(P2P セッション)から切断されました
    // Session::LeaveSessionAsync の非同期処理を行った後、クリーンアップを行います
}
else if (sessionConnectionStatusResult == nn::pia::ResultNetworkConnectionIsLost())
{
    // ネットワークから切断されました
    // クリーンアップ処理、ログアウト処理(インターネットマッチメイク時限定)、ネットワークのシャットダウン処理を順に実行してください。
}


セッション内にいるステーションのチェック

ステーション数や任意の StationId がセッション内に存在するかどうかなどの情報を取得できます。

コード 7-11. 参加中のセッション解析
// 有効なステーション数
uint16_t stationNum = nn::pia::session::Session::GetInstance()->GetStationNum();
 
// セッションホストの StationId
nn::pia::StationId hostStationId = nn::pia::session::Session::GetInstance()->GetHostStationId();
// 自身の StationId
nn::pia::StationId localStationId = nn::pia::session::Session::GetInstance()->GetLocalStationId();
 
// 任意の StationId がセッション内に存在するかどうか
nn::pia::StationId targetStationId; // チェック対象の StationId であるとします
bool isValid = nn::pia::session::Session::GetInstance()->CheckStationIdIsValid(targetStationId);

セッション状態変化イベントのハンドリング

セッションの状態が変化した場合、コールバック関数を登録しておくことで状態変化を検知できます。コールバック関数登録中~登録解除の間にセッションの状態が変化した場合にコールバック関数が呼び出されます。通知されるイベントは「ステーションが参加した」「ステーションが離脱した」などです。

警告:

コールバック関数内では、長時間ブロックするような処理を記述してはいけません。システム処理に悪影響が出る可能性があります。

セッション参加処理では、新規参加ステーションとセッション参加済みの各ステーション間での接続処理を並行して進めるため、セッション参加済みの各ステーション間で EventType_EventJoin (セッションに新規ステーションが参加してきた場合のイベント)の発生タイミングがずれることがあります。また、新規参加ステーションが何らかの理由(セッション参加済みのいくつかのステーションとの接続処理に失敗したなど)でセッション参加処理に失敗した場合、接続処理の進行状況によってはセッション参加済みの各ステーション間で EventType_EventJoin の発生の有無に違いが起こる可能性があります。(その場合、EventType_EventJoin が発生したステーションでは、すぐに EventType_EventLeave が発生することになります)

EventType_EventJoin でセッションに新規参加したとして通知された StationId は、セッションを離脱し EventType_EventLeave 通知されるまでの間、対応する StationIndex への変換(および StationIndex から StationId への逆変換)が可能になります。

コールバック関数の登録はセッションのスタートアップより前に行い、登録解除はセッションのクリーンアップより後に行います。

コード 7-12. セッション状態変化イベントコールバック関数とイベントコールバック関数の登録/解除の例
// セッション状態変化イベントコールバック関数例
void sampleSessionCallback(nn::pia::session::Session::EventType eventType, nn::pia::StationId stationId)
{
    // 引数 eventType は、発生した状態変化の内容を示す列挙型です
    switch (eventType)
    {
    case nn::pia::session::Session::EventType_EventJoin:
        // StationId: stationId が割り当てられたステーションがセッションに参加した
        break;
    case nn::pia::session::Session::EventType_EventLeave:
        // StationId: stationId が割り当てられたステーションがセッションから離脱した
        break;
    case nn::pia::session::Session::EventType_SessionHostChanged:
        // StationId: stationId のステーションがセッションホストになった
        break;
    case nn::pia::session::Session::EventType_HostMigartionFailed:
        // ホストマイグレーションに失敗した
        break;
    }
}
 
// イベントコールバック関数を登録
nn::pia::session::Session::GetInstance()->RegisterSessionEventCallback(sampleSessionCallback);

// イベントコールバック関数を登録した後にセッションのスタートアップが行う必要があります。
// 登録~登録解除の間、セッションの状態が変化した場合に、コールバック関数が呼び出されます

// イベントコールバック関数を登録解除する前にセッションのクリーンアップが行う必要があります
 
// イベントコールバック関数を登録解除
nn::pia::session::Session::GetInstance()->UnregisterSessionEventCallback();

セッション設定の変更

セッションホストである場合、様々なセッションの設定をセッション参加中に変更できます。

セッションの設定変更処理は UpdateSessionSettingAsync() に UpdateSessionSetting の派生クラスで指定して呼び出すことで非同期処理が開始され、IsUpdateSessionSettingCompleted() によって非同期処理の終了を検知できます。開始処理に成功すると GetUpdateSessionSettingResult() は IsSuccess() が真となる Result 値を返します。UpdateSessionSetting の派生クラスで更新したい項目のみ設定します。

UpdateSessionSetting の派生クラスで指定できる項目は以下のようになります。


クラス名 項目 備考
nn::pia::inet::NexUpdateSessionSetting セッションタイプ SessionType_Anybody から SessionType_Friend には更新できません。(Pia 5.2.11 以降、SessionType_Friend は廃止)

最小参加人数

最大参加人数

セッションの属性 他の項目を同時に変更する場合は NexUpdateSessionSetting::SetAttribute は使用できません。NexUpdateSessionSetting::SetAttributes を使用する必要があります。

マッチメイク優先度

ユーザーパスワード

あいことば

アプリケーション定義データ

レーティング値 スコア付けによるセッション選択方法を使用している場合のみ有効

切断率 スコア付けによるセッション選択方法を使用している場合のみ有効

違反率 スコア付けによるセッション選択方法を使用している場合のみ有効

位置情報 スコア付けによるセッション選択方法を使用している場合のみ有効

国コード スコア付けによるセッション選択方法を使用している場合のみ有効
nn::pia::lan::LanUpdateSessionSetting セッションタイプ

最小参加人数

最大参加人数

セッションの属性

アプリケーション定義データ
nn::pia::local::UdsUpdateSessionSetting アプリケーション定義データ


マッチメイク優先度の変更

インターネットマッチメイク時にマッチメイク優先度だけを変更する場合は、UpdateSelectionPriority() で実行できます。 0, nn::pia::inet::SessionMaxSelectionPriority 以外の値で更新する場合は 前回の呼び出しから 30 秒間待つ必要があります。

呼び出し可能かどうかを確認するためには、IsUpdatableSelectionPriority() を使用します。

コード 7-13. マッチメイク優先度変更
uint8_t priority = 0;
uint8_t temporaryPriority = 1 - priority;
// 変更予定の値で更新が実行可能かを確認
if (nn::pia::session::Session::GetInstance()->IsUpdatableSelectionPriority(temporaryPriority))
{
    priority = temporaryPriority;
    nn::pia::Result result = nn::pia::session::Session::GetInstance()->UpdateSelectionPriority(priority);
    if (result.IsFailure())
    {
        // エラー処理
    }
}