5.1.6 通信データの型
XATMIインタフェースの通信では,1回のサービス要求でまとまったデータを送信できるように,C言語の場合は構造体,COBOL言語の場合はレコードを送受信のデータに使えます。このデータを,C言語の場合は型付きバッファ(タイプトバッファ),COBOL言語の場合は型付きレコード(タイプトレコード)といいます。
- 〈この項の構成〉
(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インタフェース定義に指定します。
タイプ |
識別子 |
C言語のデータ型 |
COBOL言語の データ型 |
通信プロトコル |
備考 |
|
---|---|---|---|---|---|---|
TCP/IP |
OSI TP |
|||||
X_OCTET |
−※1 |
−※1 |
−※1 |
○ |
○ |
なし |
X_COMMON |
short a |
short a |
PIC S9(4) COMP-5 |
○ |
○ |
なし |
short a[n] |
short a[n] |
PIC S9(4) COMP-5 OCCURS n TIMES |
○ |
○ |
なし |
|
long a |
DCLONG a |
PIC S9(9) COMP-5 |
○ |
○ |
なし |
|
long a[n] |
DCLONG a[n] |
PIC S9(9) COMP-5 OCCURS n TIMES |
○ |
○ |
なし |
|
char a※2 |
char a |
PIC X |
○ |
○ |
無変換配列 |
|
octet a |
char a |
PIC X |
○ |
○ |
無変換配列 |
|
tchar a |
char a |
PIC X |
− |
○ |
変換配列 |
|
char a[n]※2 |
char 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_TYPE |
short a |
short a |
− |
○ |
× |
なし |
short a[n] |
short a[n] |
− |
○ |
× |
なし |
|
long a |
DCLONG a |
− |
○ |
× |
なし |
|
long a[n] |
DCLONG a[n] |
− |
○ |
× |
なし |
|
int4 a |
DCLONG a |
− |
○ |
× |
なし |
|
int4 a[n] |
DCLONG a[n] |
− |
○ |
× |
なし |
|
char a ※2 |
char a |
− |
○ |
× |
なし |
|
octet a |
char a |
− |
○ |
× |
なし |
|
tchar a |
char a |
− |
○ |
× |
なし |
|
char a[n]※2 |
char a[n] |
− |
○ |
× |
なし |
|
octet a[n] |
char a[n] |
− |
○ |
× |
なし |
|
tchar a[n] |
char a[n] |
− |
○ |
× |
なし |
|
float a |
float a |
− |
○ |
× |
なし |
|
float a[n] |
float a[n] |
− |
○ |
× |
なし |
|
double a |
double 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()を使います。引数には型付きバッファへのポインタを設定します。型付きバッファのポインタでない値を設定した場合は,無視されます。
(e) 型付きバッファを操作する場合の注意事項
型付きバッファを操作する関数は,Cライブラリのmalloc(),realloc(),free()と一緒には使わないでください(例えば,tpalloc()で割り当てたバッファは,free()で解放しないでください)。確保した型付きバッファに対して,free()を呼び出した場合の動作は保証しません。
(5) X_OCTET型を使用する場合の注意
X_OCTET型の型付きバッファを使う場合は,ほかの型のバッファを使う場合と次に示す点で異なります。
-
subtype(構造体)を持たない(subtypeごとに必要な情報がない)。
-
データを変換しないで送信する(単なるビット配列として,データを扱う)。
-
長さを示すパラメタを指定する必要がある。