セッション参加中の処理について説明します。
セッション参加中は PiaTransport を使用することで、ステーション間でデータ送受信を行えます。送受信については 6. PiaTransport 編および関数リファレンスを参照してください。
Session クラスの接続状態チェック関数を呼び出すことで、自分がセッションに接続できているかどうかをチェックできます。セッションホストがセッションを破棄した場合や、通信が継続できなかった場合など、外的要因で切断状態になることがあります。
切断状態には、セッションから切断された場合、無線オフによる切断を含むネットワークインターフェースが切断状態になった場合の 2 種類があり、再度セッションを開始するための処理が異なります。
非同期処理中は、非同期処理内でネットワーク接続状態をチェックし、切断時には非同期処理結果としてエラーを返すため、ネットワーク接続状態のチェックを行う必要はありません。
// 接続状態を取得し、チェックする
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 がセッション内に存在するかどうかなどの情報を取得できます。
// 有効なステーション数
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 への逆変換)が可能になります。
コールバック関数の登録はセッションのスタートアップより前に行い、登録解除はセッションのクリーンアップより後に行います。
// セッション状態変化イベントコールバック関数例
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() を使用します。
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()) { // エラー処理 } } |