1.3.2 XATMIインタフェース用スタブの作成方法
XATMIインタフェース用のスタブの作成方法について説明します。XATMIインタフェースの通信をするUAPの場合は,クライアントUAPとサーバUAPの両方に,スタブが必要です。
スタブを作成するときは,XATMIインタフェース定義を格納したファイル(XATMIインタフェース定義ファイル)を作成して,スタブを生成するコマンドを実行します。スタブを生成するコマンドを,次に示します。
作成したスタブのソースファイルは,C言語のコンパイラで翻訳して,UAPのオブジェクトファイルに結合させます。
XATMIインタフェース用スタブの作成手順を次の図に示します。
- 〈この項の構成〉
(1) XATMIインタフェース定義(クライアントUAP用)
クライアントUAP(SUP,またはSPP)用のXATMIインタフェース定義の形式について説明します。
- 形式
called_servers = { "サーバの定義ファイル名" 〔,"サーバの定義ファイル名"〕…};
- 機能
-
サーバUAPのXATMIインタフェース定義のファイル名を,すべて指定します。サーバUAPのXATMIインタフェース定義ファイル名を指定することで,サーバUAPで定義されているレコード型は,クライアントUAPでも使えるようになります。
- パラメタ
- 指定例
-
サーバ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インタフェース定義に指定する項目を次に示します。指定は順不同です。
-
通信で使うレコード型の定義
-
サービスプログラム名とレコード型の定義
-
called_servers文(サーバUAPから,さらに別のサーバUAPを呼び出す場合)
(a) 通信で使うレコード型の定義
- 形式
タイプ名 サブタイプ名{ データ型 データ名; 〔データ型 データ名;〕 : : };
- 機能
-
サーバUAPで使うレコード型のタイプ名,サブタイプ名,およびレコードを定義します。サーバUAPから ほかのサーバUAPプロセスのサービスを呼び出す場合,呼び出すプロセスで使えるレコード型はすべて自プロセスでも使えます。そのため,ここでは自プロセス内のサービスプログラムが入出力として使うレコード型だけを定義します。
X_OCTETは定義しなくても常に認識されます。X_OCTETを定義した場合,スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)の実行時にエラーとなります。
X_C_TYPEはCOBOL言語のAPIでは使えません。X_C_TYPEを定義した場合,スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)に -bオプションを付けて実行するとエラーとなります。
- パラメタ
-
-
タイプ名
サーバUAPで使うレコード型の,タイプ名を指定します。
-
サブタイプ名
サーバUAPで使うレコード型の,サブタイプ名を指定します。
-
データ型
サーバUAPで使うレコード型の,データ型を指定します。
-
データ名
サーバUAPで使うレコード型の,データ名を指定します。
-
- タイプで使えるデータ型の一覧
-
タイプで使えるデータ型の一覧を次の表に示します。識別子とはXATMIインタフェース定義に記述するデータ型を示し,COBOL言語のデータとは実際にスタブに定義される型付きレコードを示します。OpenTP1以外のシステムと通信するためにデータ型を変換する場合は,変換する識別子をXATMIインタフェース定義に指定します。
表1‒6 タイプで使えるデータ型の一覧 タイプ
識別子
COBOL言語のデータ
通信プロトコル
備考
TCP/IP
OSI TP
−※1
−※1
○
○
なし
short a
PIC S9(4) COMP-5
○
○
なし
short a[n]
PIC S9(4) COMP-5
OCCURS n TIMES
○
○
なし
long a
PIC S9(9) COMP-5
○
○
なし
long a[n]
PIC S9(9) COMP-5
OCCURS n TIMES
○
○
なし
char a※2
PIC X
○
○
無変換配列
octet a
PIC X
○
○
無変換配列
tchar a
PIC X
−
○
変換配列
char a[n]※2
PIC X(n)
○
○
無変換配列
octet a[n]
PIC X(n)
○
○
無変換配列
tchar a[n]
PIC X(n)
−
○
変換配列
−※3
−※3
×
×
なし
- (凡例)
-
○:該当する通信プロトコルで使えます。
×:該当する通信プロトコルでは使えません。
−:変換の識別子でも,無変換としてそのまま処理されます。
- 注※1
-
X_OCTETは,定義しなくても自動的に認識されます。XATMIインタフェース定義にX_OCTETを指定した場合は,スタブを生成するコマンドを実行したときにエラーになります。
- 注※2
-
この識別子も使えますが,新規で作成する場合は次に示す識別子を使うことをお勧めします。
X_COMMONの場合:octetまたはtchar
X_C_TYPEの場合:strまたはtstr
- 注※3
-
X_C_TYPEは,COBOL言語のAPIでは使えません。X_C_TYPEを定義した場合,スタブを生成するコマンドに-bオプションを指定して実行するとエラーになります。
- 指定例
X_COMMON subtype1 { char name[8]; long data[10]; long flags; };
(b) サービスプログラム名とレコード型の定義
- 形式
service サービスプログラム名{ (タイプ名 〔サブタイプ名〕)|(ALL)|(〔void〕)};
- 機能
-
サーバUAPにある,サービスプログラムのプログラム名と,渡されるレコード型のタイプ名とサブタイプ名を指定します。
X_OCTETの場合はサブタイプ名がないので,タイプ名だけを指定します。また,サービスプログラム内でレコード型を一度も使わない処理の場合は,サービスプログラムのあとに何も指定しないか,voidを指定します。
TPCALL,TPACALL,TPCONNECTは,型付きレコードを送信しないで,サービスプログラムを呼び出せます。ただし,サービスプログラムでレコード型を明示的に参照したくない場合は,データ領域に何も設定しないか,空白を設定します。このように指定したサービスプログラムを呼び出すには,クライアント側のTPCALL,TPACALL,TPCONNECTが送信する型付きレコードに,空白を設定してください。ただし,X_OCTETの場合は,データ領域が空白でなくても,送信データの長さが0の場合でも,サービスを要求できます。
データ領域として受け取るレコード型を限定しない指定をする場合は,ALL を指定します。ALL を指定して定義したサービスプログラムは,自プロセスで認識できるレコード型であれば,どの型でも受信できます。
- パラメタ
-
-
サービスプログラム名
サーバUAPにある,プログラム名を指定します。
-
タイプ名
APIのデータ領域に指定した,タイプ名を指定します。
-
サブタイプ名
APIのデータ領域に指定した,サブタイプ名を指定します。
-
- 指定例
-
- 例1
service svc_func1(X_COMMON subtype1);
- 例2(タイプ名がX_OCTETの場合)
service svc_func2(X_OCTET);
- 例3(型付きレコードを受信しないサービスプログラムの場合)
service svc_func3(void); または service svc_func3();
- 例4(レコード型を限定しないサービスプログラムの場合)
service svc_func4(ALL);
(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) 名称の付け方の注意
-
サービスプログラム名,サブタイプ名は,OpenTP1で規定する条件に従ってください。
-
"dc","DC","CBLDC","tx","TX","tp","TP" で始まる名称は使えません。
-
サービスプログラム名は,20文字以内で指定してください。
-
サブタイプ名の最大長は32文字です。そのうち16文字までが有効になります。重複があるかどうかは,16文字までの範囲でチェックしています。
-
型付きレコードの中で使うデータのデータ名の最大長は,32文字です。
-
-
同じプロセス内では,サービスプログラム名が重複しないようにしてください。
-
同じプロセス内でサブタイプ名が重複した場合は,そのタイプおよび構造が一致するときは許可されます。不一致のときは,スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)がエラーリターンします。
-
異なるプロセス内では,サービスプログラム名やサブタイプ名は同じものを許可します。ただし,サーバとして異なるプロセスにあっても,一つのクライアントから呼ばれる場合,クライアント側からは同じプロセスと見なされます。