5.1.6 通信データの型

XATMIインタフェースの通信では,1回のサービス要求でまとまったデータを送信できるように,C言語の場合は構造体,COBOL言語の場合はレコードを送受信のデータに使えます。このデータを,C言語の場合は型付きバッファタイプトバッファ),COBOL言語の場合は型付きレコードタイプトレコード)といいます。

<この項の構成>
(1) 通信データの型の構成
(2) 通信データの型の使い方
(3) タイプで使えるデータ型の一覧
(4) 型付きバッファを操作する関数の使い方
(5) X_OCTET型を使用する場合の注意

(1) 通信データの型の構成

通信データの型は,タイプ(type)サブタイプ(subtype)から構成されます。UAPで使う通信データの型は,UAPを作成するときにスタブのソースファイル(XATMIインタフェース定義)で指定します。XATMIインタフェース定義については,マニュアル「OpenTP1 プログラム作成リファレンス」の該当する言語編を参照してください。

(a) タイプ(type)

XATMIインタフェースで規定するデータ型の呼称です。それぞれのタイプには次の特長があります。

(b) サブタイプ(subtype)

それぞれのタイプで使える範囲のデータを要素に持つ,構造体またはレコードを示す名称です。

タイプで使えるデータ型については,「5.1.6(3) タイプで使えるデータ型の一覧」を参照してください。

(2) 通信データの型の使い方

型付きバッファまたは型付きレコードを使うと,C言語の場合は構造体で,COBOL言語の場合はレコードでデータをやり取りできます。また,関数のフラグの設定によって,設定した受信用のデータ型と異なるタイプやサブタイプ,異なる大きさのデータでも受信できます。ただし,UAPで扱える通信データの型は,UAPにXATMIインタフェース定義で事前に定義した値と一致していることが前提です。

(3) タイプで使えるデータ型の一覧

型付きバッファを使うときは,XATMIインタフェース定義(サーバUAP用)にタイプ,サブタイプ,およびデータ型を指定します。XATMIインタフェース定義ファイルからスタブを生成して,スタブのオブジェクトファイルをサーバUAPにリンケージすると,該当する型付きバッファを使えるようになります。XATMIインタフェース定義については,マニュアル「OpenTP1 プログラム作成リファレンス」の該当する言語編を参照してください。

通信プロトコルにOSI TPを使ってOpenTP1以外のシステムと通信する場合でも,通信相手システムで型付きバッファおよび型付きレコードを認識できるように変換して送信できます。

タイプで使えるデータ型の一覧を次の表に示します。識別子とはXATMIインタフェース定義に記述するデータ型を示し,C言語のデータ型およびCOBOL言語のデータとは実際にスタブに定義される型付きバッファおよび型付きレコードを示します。OpenTP1以外のシステムと通信するためにデータ型を変換する場合は,変換する識別子をXATMIインタフェース定義に指定します。

表5-4 タイプで使えるデータ型の一覧

タイプ識別子C言語のデータ型COBOL言語の
データ型
通信プロトコル備考
TCP/IPOSI TP
X_OCTET111なし
X_COMMONshort ashort aPIC S9(9) COMP-5なし
short a[n]short a[n]PIC S9(9) COMP-5
OCCURS n TIMES
なし
long along aPIC S9(9) COMP-5なし
long a[n]long a[n]PIC S9(9) COMP-5
OCCURS n TIMES
なし
char a2char aPIC X無変換配列
octet achar aPIC X無変換配列
tchar achar aPIC X変換配列
char a[n]2char a[n]PIC X(n)無変換配列
octet a[n]char a[n]PIC X(n)無変換配列
tchar a[n]char a[n]PIC X(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 a 2char 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

(4) 型付きバッファを操作する関数の使い方

XATMIインタフェースの関数で通信データを操作する方法について説明します。通信データを操作できるAPIは,C言語でだけ使えます。COBOL言語の場合は,通信データを操作するためのAPIはありません。

(a) 型付きバッファの確保

型付きバッファを確保する場合は,タイプとサブタイプの値を設定したtpalloc()をUAPから呼び出します。tpalloc()で確保した領域は,NULLでクリアされます。

(b) 型付きバッファの再確保

型付きバッファの長さを大きくする場合は,tprealloc()を使います。tprealloc()で使えるバッファ型は,X_OCTETだけです。それ以外のバッファ型を指定した場合は,エラーリターンします。変更後のバッファ長が短い場合は,バッファに入り切らない分は切り捨てられます。逆に,変更後のバッファ長が長い場合は,余った部分がNULLクリアされます。

再確保に失敗すると,変更前のバッファ型も無効になります。

(c) 型付きバッファの解放

確保した領域を解放する場合は,tpfree()を使います。引数には型付きバッファへのポインタを設定します。型付きバッファのポインタでない値を設定した場合は,無視されます。

(d) 型付きバッファの情報の取得

バッファのタイプなどの情報を取得する場合は,tptypes()を使います。

(e) 型付きバッファを操作する場合の注意事項

型付きバッファを操作する関数は,Cライブラリのmalloc(),realloc(),free()と一緒には使わないでください(例えば,tpalloc()で割り当てたバッファは,free()で解放しないでください)。確保した型付きバッファに対して,free()を呼び出した場合の動作は保証しません。

(5) X_OCTET型を使用する場合の注意

X_OCTET型の型付きバッファを使う場合は,ほかの型のバッファを使う場合と次に示す点で異なります。

  1. subtype(構造体)を持たない(subtypeごとに必要な情報がない)。
  2. データを変換しないで送信する(単なるビット配列として,データを扱う)。
  3. 長さを示すパラメタを指定する必要がある。