×
Namespaces

Variants
Actions

対応トランジェント

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata
Code ExampleArticle
Keywords: server
Created: hamishwillee , Andrew Thoelke, Adrian Taylor (18 Apr 2008)
Reviewed: hamishwillee (22 Aug 2011)
Last edited: hamishwillee (22 Aug 2011)

Original Authors: hamishwillee , Andrew Thoelke, Adrian Taylor

Symbian C++は、クライアント‐サーバモデルを広く活用しています。トランジェントサーバとは、必要時にのみ起動しているサーバです。つまり、最初のクライアントの接続要求によって起動し、最後のセッションが切断され一定時間が経過した後に自己終了するサーバです。

トランジェント サーバを起動・終了するコードは、動作を定型化することができます。本書と付随するサンプル コードは、クライアント プロセスとは独立したプロセスで実行されるトランジェントサーバの、Symbian OS v9 用の、基本テンプレートとして使用することができます。クライアントプロセスと同一プロセスで実行されるサーバのためのサーバ起動コードについては本書の対象外とします。

Symbianプラットフォームで使用されるサーバの多くはトランジェントサーバです。特に、使用頻度の低いサービスを提供するサーバの場合には、起動時間が長いことよりもメモリー消費が少ないことのほうが重視されるため、トランジェント サーバが有利です。

プラットフォームセキュリティでは、プロセス境界がある反面サービスにアクセスしなければならない場合があるため、トランジェントサーバは特に重要となります。クライアントが持つケイパビリティ以上のケイパビリティが必要となるサービスを実装する場合などがその例です。

コードはここからダウンロードできますFile:TransientServerTemplate.zip

Contents

サーバの動作

本書で作成するトランジェント サーバは以下の2つのコンポーネントで構成されます。

  • t-client.dll - API を提供するクライアント側 DLL
  • t-server.exe - サーバの実行イメージ

クライアントAPI(t-client.h で定義されるRMySession)は、サーバ接続、メッセージの同期送信、メッセージの非同期受信、未完了の非同期メッセージ受信要求のキャンセルなどのメソッドを提供します。

class RMySession : public RSessionBase
{
public:
IMPORT_C TInt Connect();
IMPORT_C TInt Send(const TDesC& aMessage);
IMPORT_C void Receive(TRequestStatus& aStatus,TDes& aMessage);
IMPORT_C void CancelReceive();
};

トランジェントサーバにおいて、最も注目に値するのはConnect() メソッドです。このメソッドは、まずサーバに接続してセッションの確立を試みます。サーバが存在しないなどの理由によってこの動作が失敗すると、このメソッドはサーバの起動を行い、その後セッションを確立します。

EXPORT_C TInt RMySession::Connect()
//
// Connect to the server, attempting to start it if necessary
//
{
TInt retry=2;
for (;;)
{
TInt r=CreateSession(KMyServerName,TVersion(0,0,0),1);
if (r!=KErrNotFound && r!=KErrServerTerminated)
return r;
 
if (--retry==0)
return r;
 
r=StartServer();
if (r!=KErrNone && r!=KErrAlreadyExists)
return r;
}
}

CMyServer::NewSessionL() はサーバ側で呼び出され、サーバ側セッションオブジェクトを作成します。付属のサンプル コードではそれで全てですが、実際のサーバでは、サーバのバージョンが適切か、サーバを使用するための適切なケイパビリティをクライアントが保持しているかなどがチェックされます。

トランジェント サーバではセッション数を管理します。セッションが破棄されると、CMyServer::DropSession() 関数が呼び出されてセッション数をデクリメントします。 セッション数が 0 になると、サーバ終了タイマーが作動します。他のセッションが開始された場合にはタイマーがキャンセルされますが、それ以外の場合には、タイムアウトでサーバが終了します。

テンプレートコードの内容

サンプル コードは、サンプルのクライアント‐サーバインタフェースとトランジェン ト サーバの動作を確認するための、コンソールテスト実行ファイルで構成されます。 テスト コードおよびサンプル コードは、\Transient\ ディレクトリでコマンド ライン から、通常通りビルドされます。

bldmake bldfiles
abld build
abld test build

サーバファイル

サーバは\Transient\Server\ ディレクトリに格納されます。以下は、各サーバ ファイ ルの説明です。

ディレクトリ ファイル 説明
src\ client.cpp クライアント側DLL のソースコード
server.cpp サーバのソースコード
inc\ server.h サーバの定義
clientserver.h 共有クライアント/サーバの定義
t-client.h クライアント側API。/epoc32/include/ にエクスポートされます。
group\ t-server.mmp サーバ EXE のプロジェクトファイル
t-client.mmp クライアント側DLL のプロジェクトファイル
sis\ server_gcce.pkg サーバ PKG ファイル – GCCE バイナリをインポート
server_armv5.pkg サーバPKG ファイル – ARMv5 バイナリをインポート

コンソールファイルのテスト

テストコードは\Transient\Test_ConsoleExe\ ディレクトリに格納されます。テスト コードは t-test.dll をロードするコンソール形式の実行ファイル T-Test.exe で、サー バのクライアント側 API を1つずつ実行します。

以下は、テストコード内のファイルの説明です。

ディレクトリ ファイル 説明
src\ test.cpp テスト実行ファイルのソースコード
testclient.cpp テストDLL のソースコード
inc\ plugin.h テスト DLL の定義
testclient.h テストDLL の定義
group\ t-test.mmp テスト実行ファイルのプロジェクトファイル
t-testc.mmp テスト DLL のプロジェクトファイル
sis\ TestConsoleExe_gcce.pkg テストPKG ファイル – GCCEバイナリをインポート
TestConsoleExe_armv5.pkg テストPKG ファイル – ARMv5 バイナリをインポート
data\ TestConsoleExe_reg.rss アプリケーション登録スタブ - t-test.exeをGUIで実行

デバイスへのインストール

\sis\ サブディレクトリの PKG ファイルを使用して、Symbianプラットフォーム(及びS60 3rd Edition) デバイス対応のサーバ/テスト実行ファイルのインストレーションファイルをビルドすることができます。

\sis\サブディレクトリ内に以下を入力してください。(-dコマンドはEPOCROOTのアドレス指定に応じて使用)

makesis -d%EPOCROOT% server_gcce.pkg

そして

makesis -d%EPOCROOT% TestConsoleExe_gcce.pkg

注意:SDKのパスは\epoc32\サブディレクトリが格納されているディレクトリとなります。Symbian^1のSDK標準インストールの場合、ディレクトリは以下となります:

C:\S60\devices\S60_5th_Edition_SDK_v1.0

デバイスによっては、(signsisを使用して)ファイルに署名する必要があります。該当する携帯電話のユーザーマニュアルに従ってSISファイルをインストールしてください。

テストコードの動作

テストコードでは、以下の 3 つのテストを実行します。

インタフェースの検証

サーバが起動されていない状態でのサーバ接続、メッセージ送受信、サーバが起動された状態で 2 つのセッションの確立など、通常インタフェースをテストします。さらに、すべてのセッションを完了することでトランジェント サーバが終了することを確認します。

セッションの同時開始

2 つのセッションが同時に接続を開始した時に、サーバ起動コードが対応できることを確認します。

停止状態からのサーバの起動

サーバが終了または終了処理中の状態で、サーバ起動コードが適切に動作することを確認します。(デッドスレッド/サーバ状態またはクリーンアップ後のサーバの再始動など)

テストコードの実行方法

コンソール実行ファイルは GUIアプリケーションではありません。しかし、アプリケーション登録ファイルが追加されているため、他のアプリケーション同様UIから起動することができます。(単にアプリケーションt-testを選択)

テストコードは、Symbian^1用エミュレーター及びNokia N96(S60 3rd Edition, FP2)で問題なく実行します。SISファイルはDevCertにて署名されており、基本的なケイパビリティが付与されています。テストコードをSymbian^1デバイス上でまだ試していませんが正しく実行するはずです。

テンプレートの拡張について

プラットフォームセキュリティ

クライアント DLL とサーバ EXE は、現在ケイパビリティを保持していません。本書の テンプレートを使用して保護された API を使用するサーバを作成する場合には、必要 となるケイパビリティを EXE に付与してください。クライアント DLL にも、必要と 考えられるケイパビリティを付与してください。

サーバへのアクセスを制御する場合は、CServer2 ではなくサーバ基底クラスの title= CPolicyServer を使用してください。これにより、セキュア サーバの実装や既存サー バのセキュア化が比較的容易になります。

CServer2 を直接使用して API をセキュアにすることもできます。例えば、下記のコ ードは、クライアント SID をチェックする_LIT_SECURITY_POLICY_S0 の使用方法を 示すものです。

// Check that SID matches required application.
// Use security policy check so behaviour obeys global security policy.
static _LIT_SECURITY_POLICY_S0(mySidPolicy, KRequiredSecureId);
 
r = mySidPolicy().CheckPolicy(aMessage);
if (!r)
{
User::Leave(KErrPermissionDenied);
}

現在、サーバには非保護名称が設定されているため、「t-server」と名乗る他のサーバ による偽装が可能です。クライアントがサーバに機密情報を渡す場合には、適切なサー バがロードされていることが保証されなくてはなりません。これは、サーバに「!」で 始まる保護名称を設定することによって可能です。名称の設定には ProtServ ケイパ ビリティが必要です。サーバ名に関しては以下で詳しく説明します。

UID

本書のサンプル コードは、サンプル範囲のUID/SID を使用しています。商用アプリケ ーションには、www.symbiansigned.com が割り当てる UID を使用してください。

クライアント - サーバの問題

サーバ設計の際に必要なテンプレートの変更について説明します。

クライアント側 API

クライアント側 API、プロセス間通信(IPC)、サーバ側実装は、サーバの処理内容に 依存します。サーバの多くは、本書のサンプル コードで示される API と同様の方法で クライアントとサーバ間でデータコピーを行っています。

処理内容に即した適切ファイル名、クラス名、メソッド名を指定してください。

メッセージスロット数

RMySession::Connect()RSessionBase::CreateSession() を 呼 び出す際に KServerDefaultMessageSlots でメッセージスロット数を指定します。メッセージ スロット数は、ある時点で、特定クライアントがサーバに対して持つことができる未完 了要求の数を示し、サーバ設計における重要なパラメータです。サンプル コードでは 同期関数が1つであるために、存在し得る未完了要求は1つだけです。したがって、必 要なメッセージ スロットは1つのみです。

スロット数の最大は255 です。aAsyncMessageSlots == -1 である場合には、セッショ ンはメッセージのグローバルフリープールのメッセージを使用します。

リトライ数

RMySession::Connect() は先ず、サーバセッションの開始を試み、失敗した場合に はサーバを再始動します。この際、サーバは一度も起動しなかった場合や、起動した サーバが終了している場合もあります。処理は、セッションが開始されるか、セッショ ン開始やサーバ起動が予期せぬ(または復旧不能な)エラーで失敗するか、リトライ制 限(KServerRetryCount)に達するまで繰り返されます。

KServerRetryCount (client.cpp) は無限に設定することもできますが、現在値の「2」 で、起動/終了に関連する問題の99%を排除することができます。- ただし、問題の種 類に応じて値を調整してください。

サーバ名

clientserver.h で定義されるサーバ名(KMyServerName)を編集してください。必要に 応じて第 6.1 章を参照して保護名称を設定してください。

clientserver.h で定義される他の値も、個々の設計に応じて変更してください。(IPC 関数の列挙など)

テンプレートコードに関するエラー報告や問い合わせ

まず、General Symbian C++ discussion board. ニュースグループで問いあわせてください。

Licence icon cc-by-sa 3.0-88x31.png© 2010 Symbian Foundation Limited. This document is licensed under the Creative Commons Attribution-Share Alike 2.0 license. See http://creativecommons.org/licenses/by-sa/2.0/legalcode for the full terms of the license.
Note that this content was originally hosted on the Symbian Foundation developer wiki.


This page was last modified on 22 August 2011, at 09:42.
113 page views in the last 30 days.