3. 接続処理
3.1. ゲームサーバーに接続する
NEX では、ゲームサーバーに接続する処理を下記の3つのフェーズに分けて行います
- インターネットに接続する 「CTR プログラミングマニュアル 無線通信編 3.3 自動接続」を参照
- フレンドサーバーに接続する 「CTR プログラミングマニュアル 無線通信編 4.3 フレンド・プレゼンス」を参照
- ゲームサーバーに接続する
初めてフレンドサーバーに接続する際に、フレンドサーバーからCTR本体に対してプリンシパルIDを発行します。 このプリンシパルIDは、発行されたCTR本体のバックアップに保存されます。
ゲームサーバーへログインするには、NgsFacade::Login() を使用します。 この関数の引数には、ProtocolCallContextクラスオブジェクトのポインタ、ゲームサーバー ID、アクセスキーを渡します。 また、オプションで非同期処理のタイムアウト時間(ミリ秒)、プリンシパル ID(デフォルト値 INVALID_PRINCIPALID)を指定することも可能です。 本関数は、ProtocolCallContext クラスオブジェクトにタイムアウトを指定することはできません。 プリンシパルID に INVALID_PRINCIPALID 以外を渡すと本体内に保存されているプリンシパル ID と比較し、一致しない場合に”QERROR(Fpd, InvalidPrincipalId)”を返します。
非同期処理の結果、ログインに失敗した場合、NgsFacade::GetLastLoginErrorCode() にてネットワークエラーコードを取得してください。
NEX 2.5 より、ログイン時にサーバーのバージョンをチェックし、ライブラリの要求サーバーバージョンよりも古い場合にはゲームサーバーにログインできないように仕様変更を行いました。 ゲームサーバーの更新申請は OMAS から行ってください。
ログイン時にサーバーのバージョンをチェックし、ライブラリの要求サーバーバージョンよりも古い場合にはゲームサーバーにログインできません。 ゲームサーバーの更新申請は OMAS から行ってください。
static const qUnsignedInt32 GAME_SERVER_ID = 0xXXXXXXXX;
static const qChar16 ACCESS_KEY[] = "xxxxxxxx";
void LoginGameServer(NgsFacade* pNgsFacade)
{
ProtocolCallContext oContext;
qResult result = pNgsFacade->Login(&oContext, GAME_SERVER_ID, ACCESS_KEY);
if(!result)
{
return;
}
// 非同期処理の結果を待つ
oContext.Wait();
if (oContext.GetState() != CallContext::CallSuccess)
{
NN_LOG("Network Error Code \u\n", pNgsFacade->GetLastLoginNetworkErrorCode());
return;
}
}
補足
開発機では開発用サーバーを、製品実機では製品用サーバーを自動的に使用しますので、ライブラリ使用者が接続先を意識する必要はありません。
3.2. ゲームサーバーから切断する
ゲームサーバーから切断するには、NgsFacade::Logout() を使用します。 この関数には、ProtocolCallContextクラスオブジェクトのポインタを引数として渡します。 マッチメイクセッションに入った状態でクライアントがログアウトすると、ゲームサーバー側で自動的にマッチメイクセッションの退出処理を行います。
ゲームサーバーからログアウトした後で、フレンドサーバーにログインしている必要が無い場合はフレンドサーバーからのログアウトとアクセスポイントからの切断も併せて行ってください。
NEX ライブラリはクライアントから明示的なリクエストがない場合、ログイン中 ゲームサーバーにキープアライブを送信します。 アクセスポイントとの接続が切れた場合や本体の電源断などで、30 秒以上ゲームサーバーと通信できなかった場合、クライアントは自動的にオフライン状態に移行し、ゲームサーバーはクライアントがログアウトしたものと判断します。
補足
ログイン処理中・ログアウト処理中・ログイン中のいずれかの状態のとき NgsFacade クラスオブジェクトを破棄しようとすると、NgsFacade のデストラクタ内で NgsFacade::Terminate() が呼ばれ、オフライン状態に遷移するまでブロックします。 NgsFacade クラスオブジェクトを破棄する場合、破棄する前に NgsFacade::Terminate() を呼ぶことを推奨します。