1.3.2 XATMIインタフェース用スタブの作成方法

XATMIインタフェース用のスタブの作成方法について説明します。XATMIインタフェースの通信をするUAPの場合は,クライアントUAPとサーバUAPの両方に,スタブが必要です。

スタブを作成するときは,XATMIインタフェース定義を格納したファイル(XATMIインタフェース定義ファイル)を作成して,スタブを生成するコマンドを実行します。スタブを生成するコマンドを,次に示します。

作成したスタブのソースファイルは,C言語のコンパイラで翻訳して,UAPのオブジェクトファイルに結合させます。

XATMIインタフェース用スタブの作成手順を次の図に示します。

図1-9 XATMIインタフェース用スタブの作成手順(TCP/IP通信,OSI TP通信)

[図データ]

<この項の構成>
(1) XATMIインタフェース定義(クライアントUAP用)
(2) XATMIインタフェース定義(サーバUAP用)
(3) XATMIインタフェース定義ファイルの名称
(4) 定義ファイルのインクルード
(5) 名称の付け方の注意

(1) XATMIインタフェース定義(クライアントUAP用)

クライアントUAP(SUP,またはSPP)用のXATMIインタフェース定義の形式について説明します。

形式

called_servers = { "サーバの定義ファイル名"〔,"サーバの定義ファイル名" 〕…};

機能
サーバUAPのXATMIインタフェース定義ファイル名を,すべて指定します。サーバUAPのXATMIインタフェース定義ファイル名を指定することで,サーバUAPで定義されている型付きバッファは,クライアントUAPでも使えるようになります。
パラメタ
  • サーバの定義ファイル名
    サーバUAPのXATMIインタフェース定義ファイルのファイル名を指定します。定義ファイル名は,サフィックスが".def"のファイルです。
    一つのcalled_servers文の括弧 { } の中に,複数の定義ファイル名を指定できます。また,一つのXATMIインタフェース定義ファイルに複数のcalled_servers文を記述することもできます。
指定例
サーバUAP1とサーバUAP2とXATMIインタフェースの通信をするクライアントUAPの定義(サーバUAP1の定義ファイル名をserv1.def,サーバUAP2の定義ファイル名をserv2.defとします)。
形式1

called_servers = { "serv1.def" ,"serv2.def" };

形式2

called_servers = { "serv1.def" };
called_servers = { "serv2.def" };

(2) XATMIインタフェース定義(サーバUAP用)

サーバUAPのXATMIインタフェース定義に指定する項目を次に示します。指定は順不同です。

(a) 通信で使う型付きバッファの定義
形式

タイプ名  サブタイプ名{
           データ型  データ名;
         〔データ型  データ名;〕
                    :
                    :
           };

機能
サーバUAPで使う型付きバッファのタイプ名,サブタイプ名,および構造体を定義します。サーバUAPから ほかのサーバUAPプロセスのサービスを呼び出す場合,呼び出すプロセスで使える型付きバッファはすべて自プロセスでも使えます。そのため,ここでは自プロセス内のサービス関数が入出力として使う型付きバッファだけを定義します。
X_OCTETは定義しなくても常に認識されます。X_OCTETを定義した場合,スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)の実行時にエラーとなります。
パラメタ
  • タイプ名
    サーバUAPで使う型付きバッファの,タイプ名を指定します。
  • サブタイプ名
    サーバUAPで使う型付きバッファの,サブタイプ名を指定します。
  • データ型
    サーバUAPで使う型付きバッファの構造体にあるデータの,データ型を指定します。
  • データ名
    サーバUAPで使う型付きバッファの構造体にあるデータの,データ名を指定します。
タイプで使えるデータ型の一覧
タイプで使えるデータ型の一覧を次の表に示します。識別子とはXATMIインタフェース定義に記述するデータ型を示し,C言語のデータ型とは実際にスタブに定義される型付きバッファを示します。OpenTP1以外のシステムと通信するためにデータ型を変換する場合は,変換する識別子をXATMIインタフェース定義に指定します。
OpenTP1では,intを4バイトとしているので,定義ファイル内ではそれを明示するため「int4」と記述します。

表1-6 タイプで使えるデータ型の一覧

タイプ識別子C言語のデータ型通信プロトコル備考
TCP/IPOSI TP
X_OCTET11なし
X_COMMONshort ashort aなし
short a[n]short a[n]なし
long along aなし
long a[n]long a[n]なし
char a2char a無変換配列
octet achar a無変換配列
tchar achar a変換配列
char a[n]2char a[n]無変換配列
octet a[n]char a[n]無変換配列
tchar a[n]char a[n]変換配列
X_C_TYPEshort ashort a×なし
short a[n]short a[n]×なし
long aDCLONG a×なし
long a[n]DCLONG a[n]×なし
int4 aDCLONG a×なし
int4 a[n]DCLONG a[n]×なし
char a2char a×なし
octet achar a×なし
tchar achar a×なし
char a[n]2char a[n]×なし
octet a[n]char a[n]×なし
tchar a[n]char a[n]×なし
float afloat a×なし
float a[n]float a[n]×なし
double adouble a×なし
double a[n]double a[n]×なし
octet a[n][n]char a[n][n]×なし
tchar a[n][n]char a[n][n]×なし
str a[n]char a[n]×なし
str a[n][n]char a[n][n]×なし
tstr a[n]char a[n]×なし
tstr a[n][n]char a[n][n]×なし
(凡例)
○:該当する通信プロトコルで使えます。
×:該当する通信プロトコルでは使えません。
-:変換の識別子でも,無変換としてそのまま処理されます。
注※1
X_OCTETは,定義しなくても自動的に認識されます。XATMIインタフェース定義にX_OCTETを指定した場合は,スタブを生成するコマンドを実行したときにエラーになります。
注※2
この識別子も使えますが,新規で作成する場合は次に示す識別子を使うことをお勧めします。
X_COMMONの場合:octet または tchar
X_C_TYPEの場合:strまたは tstr

指定例

X_C_TYPE subtype1 {
                  char  name[8];
                  int4  data[10];
                  int4  flags;
                  };

(b) サービス関数名と引数情報の定義
形式

service  サービス関数名{(タイプ名 〔サブタイプ名〕) | (ALL) | (〔void〕)};

機能
サーバUAPのサービス関数の関数名と,引数として渡される型付きバッファのタイプ名とサブタイプ名を指定します。引数とは,サービス関数の実際の引数であるsvc_info構造体のdataメンバのことです。
X_OCTETの場合はサブタイプ名がないので,タイプ名だけを指定します。また,サービス関数内でsvc_info構造体のdataメンバを一度も参照しない処理の場合は,サービス関数名のあとに何も指定しないか,voidを指定します。
tpcall( ),tpacall( ),tpconnect( )は型付きバッファを送信しないで,サービス関数を呼び出せます。ただし,サービス関数でsvc_info構造体のメンバが指すデータを明示的に参照したくない場合は,引数に何も設定しないか,voidを設定します。このように指定したサービス関数を呼び出すには,クライアント側のtpcall( ),tpacall( ),tpconnect( )が送信する型付きバッファへのポインタにNULLを設定してください。ただし,X_OCTETの場合は,ポインタがNULLでなくても,送信データの長さが0の場合でも,サービスを要求できます。
引数として受け取る型付きバッファを限定しない指定をする場合は,引数に ALL を指定します。ALL を引数に指定して定義したサービス関数は,自プロセスで認識できる型付きバッファであれば,どの型でも受信できます。
パラメタ
  • サービス関数名
    サーバUAPにある,関数名を指定します。
  • タイプ名
    関数のデータ領域に指定した,タイプ名を指定します。
  • サブタイプ名
    関数のデータ領域に指定した,サブタイプ名を指定します。
指定例
例1

service svc_func1(X_C_TYPE subtype1);

例2(引数のタイプ名がX_OCTETの場合)

service svc_func2(X_OCTET);

例3(引数を受信しないサービス関数の場合)

service svc_func3(void);  または  service svc_func3();

例4(引数を限定しないサービス関数の場合)

service svc_func4(ALL);

(c) サーバUAPから,さらに別のサーバUAPを呼び出す場合

クライアントUAPのXATMIインタフェース定義(called_servers文)を指定します。

(3) XATMIインタフェース定義ファイルの名称

ファイル名には,XATMIインタフェース定義ファイルを示すサフィックス".def"を必ず付けてください。XATMIインタフェース定義ファイルを格納するディレクトリは,スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)が探せるパスであれば,特に制限はありません。

XATMIインタフェース定義ファイルのファイル名の長さは,最大255文字です。ただし,OSの制限で255文字まで指定できないことがあります。

スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)を実行したあと,スタブのソースファイルはXATMIインタフェース定義ファイルとは別の名称で作成されます。そのため,OpenTP1の稼働中にはXATMIインタフェース定義ファイルは使われません。

(4) 定義ファイルのインクルード

異なるプロセスで同じ型付きバッファを使うときは,共通の型付きバッファの定義ファイルを一つ作成して,それを各プロセスの定義ファイルにインクルードできます。

インクルードする文は,C言語と同じ書式です。次のように記述します。

  #include <ファイル名>  または  #include "ファイル名"

インクルードファイルは,スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)の-iオプションで指定したサーチパスから読み込まれます。サーチパス内に該当するファイルがない場合は,最後にカレントディレクトリを探します。

インクルードするファイルの名称は任意です(サフィックスが .h でなくてもかまいません)。ただし,そのファイルをXATMIインタフェース定義ファイルとして直接 スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)に指定する場合は,その定義の名称規則に従ってください。

インクルードするファイルの内容は,XATMIインタフェース定義ファイルと同じです。ただし,名称が重複することもありますので,自プロセス内のサービス関数の定義は含めないことをお勧めします。

(5) 名称の付け方の注意

  1. サービス関数名,サブタイプ名は,OpenTP1で規定する条件に従ってください。
    • "dc","DC","CBLDC","tx","TX","tp","TP"で始まる名称は使えません。
    • サービス関数名は,20文字以内で指定してください。
    • サブタイプ名の最大長は32文字です。そのうち16文字までが有効になります。重複があるかどうかは,16文字までの範囲でチェックしています。
    • 型付きバッファの構造体の中で使うデータのデータ名の最大長は,32文字です。
  2. 同じプロセス内では,サービス関数名が重複しないようにしてください。
  3. 同じプロセス内でサブタイプ名が重複した場合は,そのタイプおよび構造が一致するときは許可されます。不一致のときは,スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)がエラーリターンします。
  4. 異なるプロセス内では,サービス関数名やサブタイプ名は同じものを許可します。ただし,サーバとして異なるプロセスにあっても,一つのクライアントから呼ばれる場合,クライアント側からは同じプロセスと見なされます。