Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 TP1/EE/Message Control Extension 使用の手引


5.4.5 入力セグメント判定UOCインタフェース

入力セグメント判定UOCは,次に示す形式で呼び出します。

〈この項の構成〉

(1) 形式

ANSI C,C++の形式
#include <eemcp.h>
int  uoc_func(struct eemcp_uoc_segchk  *parm)

(2) 説明

入力セグメント判定UOCを呼び出すとき,MCPは次に示す所定のパラメタをparmに設定します。

(3) パラメタの内容

(a) eemcp_uoc_segchkの内容

typedef struct eemcp_uoc_segchk {
    int  pro_kind;               … プロトコル種別
    char le_name[9];             … 論理端末名称
    char reserve1[7];            … 予備
    int  rcv_prim;               … 受信サービスプリミティブ
    char *rcv_data_adr;          … 受信データ先頭アドレス
    int  rcv_data_size;          … 受信データ有効サイズ
    char reserve3[4];            … 予備
    char *uoc_inf_adr;           … MCP使用領域
    int  uoc_inf_size;           … MCP使用領域
    char reserve4[4];            … 予備
    EEMCPSEGUOCPROT *pro_indv_ifa;
                                 … プロトコル個別インタフェース領域アドレス
    EEMCPUOCTIMEINF *ptimerinf_adr;
                                 … プロトコルタイマ情報アドレス
    int  rtn_detail;             … 詳細リターンコード
    int  reserve2[3];            … 予備
    char *usat_adr;              … ユーザSATアドレス
    EEULONG usat_size;           … ユーザSATサイズ
    EEULONG lebuf_size;          … MCP使用領域
    void *lebuf;                 … MCP使用領域
    EEULONG64 usat_large_size;   … 拡張ユーザSATサイズ
    char reserve5[40];           … 予備
}EEMCPUOCSEGCHK;

(b) eemcp_seguoc_protの内容

typedef struct eemcp_seguoc_prot {
    int  rest_data_size;         … 残っている該当メッセージのサイズ
    int  next_data_size;         … 次メッセージの有効長
    char *next_data_adr;         … 次メッセージの先頭アドレス
    int  now_data_size;          … 該当メッセージの有効長
    int  reserve[3];             … 予備
}EEMCPSEGUOCPROT;

(c) eemcp_uoctimer_infの内容

typedef struct eemcp_uoctimer_inf {
    int timer_code;              … タイマセット指示
    int timer_value;             … 後続メッセージ監視タイマ値
    int timer_result;            … MCP使用領域
    int reserve1[3];             … 予備
}EEMCPUOCTIMEINF;

(d) eemcp_uocbufheadの内容

typedef struct eemcp_uocbufhead {
    struct eemcp_uocbufhead *next_bufhead_adr;
                                 … 次バッファ情報のアドレス
    char *buf_adr;               … 受信データのバッファアドレス
    int  buf_size;               … 受信データのバッファサイズ
    char reserve[4];             … 予備
}EEMCPUOCBUFHEAD;

(4) MCPが値を設定する項目

(a) eemcp_uoc_segchk

●pro_kind

プロトコル種別として,次の値が設定されます。

EEMCP_UOC_PRO_TCP

TCP/IPプロトコル

●le_name

メッセージを入力した論理端末名が設定されます。

●rcv_prim

受信サービスプリミティブとして,次の値が設定されます。

EEMCP_UOC_RCV_BRD

一方送信メッセージの受信

EEMCP_UOC_RCV_REP_SR

同期送受信メッセージの受信

●rcv_data_adr

受信したメッセージの先頭アドレスが設定されます。

●rcv_data_size

受信したメッセージの有効長が設定されます。

●uoc_inf_adr

MCPで使用するパラメタです。

●uoc_inf_size

MCPで使用するパラメタです。

●pro_indv_ifa

プロトコル個別インタフェース領域アドレスです。

●ptimerinf_adr

プロトコルタイマ情報アドレスが設定されます。

●usat_adr

ユーザSATエリアのアドレスが設定されます。TP1/EEのサービス定義のメモリ関連定義のsystem_user_areaオペランドに0を指定した場合は,値を参照できません。

●usat_size

ユーザSATエリアのサイズが設定されます(単位:バイト)。

ユーザSATエリアのサイズが4ギガバイト以上の場合は,0が設定されます。0の場合,ユーザSATエリアのサイズは,usat_large_sizeのエリアを参照してください。なお,ユーザSATエリアのサイズが4ギガバイト未満の場合でも,usat_large_sizeのエリアからサイズを取得できます。

●lebuf_size

MCPで使用するパラメタです。

●lebuf

MCPで使用するパラメタです。

●usat_large_size

ユーザSATエリアのサイズが設定されます(単位:バイト)。

(b) eemcp_uoctimer_inf(タイマ情報)

●ptimerinf_adr

プロトコルタイマ情報アドレスが設定されます。

●timer_result

MCPで使用するパラメタです。

(c) eemcp_uocbufhead(受信バッファ情報)

メッセージの最大サイズを拡張している場合(eemcpfunc定義コマンドのmsglenオペランドにextendを指定)に,eemcp_uoc_segchkのrcv_data_adrが指すパラメタです。受信したメッセージは複数の受信バッファに分割して渡します。

●next_bufhead_adr

次受信バッファ情報のアドレスが設定されます。最終受信バッファの場合,NULLが設定されます。

●buf_adr

受信バッファの先頭アドレスが設定されます。

●buf_size

受信バッファの有効長が設定されます。

(5) ユーザが値を設定する項目

(a) eemcp_uoc_segchk

●rtn_detail  〜((-19999〜-19000))

詳細リターンコードを設定できます。このコードはUOCがEEMCP_UOC_SGCK_NGをリターンしたときにMCPに返されます。MCPは詳細リターンコードをメッセージログファイルに出力します。

詳細リターンコードは,-19999〜-19000の範囲で指定してください。

(b) eemcp_seguoc_prot(領域アドレス)

●rest_data_size

残っている該当メッセージのサイズを設定します。

受信したメッセージのセグメントが未完成の場合は,不足分のメッセージサイズを設定します。EEMCP_UOC_SGCK_OK_NSEGでリターンした場合だけ有効です。

●next_data_size

次のメッセージサイズを設定します。受信したメッセージのセグメントが完成している場合,次のメッセージが含まれているときは,次のメッセージサイズを設定します。EEMCP_UOC_SGCK_OK_LASTでリターンした場合だけ有効です。

●next_data_adr

次のメッセージの先頭アドレスを設定します。next_data_sizeが0でない場合に設定します。

●now_data_size

該当するメッセージのサイズを設定します。next_data_sizeが0でない場合に設定します。

(c) eemcp_uoctimer_inf

●timer_code

後続メッセージ監視タイマを設定します。

受信したメッセージのセグメントが未完成の場合,後続メッセージの受信に対して監視タイマをセットするかどうかを設定します。EEMCP_UOC_SGCK_OK_NSEGでリターンした場合だけ有効です。

EEMCP_TIME_SET

監視タイマをセットします。

EEMCP_TIME_NO_SET

監視タイマをセットしません。

●timer_value  〜〈10進数字〉((1〜2550))(単位:秒)

後続メッセージの監視タイマの値を設定します。

この値は,監視タイマをセットする場合に設定します。timer_codeでEEMCP_TIME_SETを設定した場合だけ有効になります。監視時間は最大で1秒早くタイムアウトする場合があります。

(6) リターン値

入力セグメント判定UOCは,次のコードでリターンしてください。

リターン値

意味

EEMCP_UOC_SGCK_OK_NSEG

正常リターン(セグメント未完成)

EEMCP_UOC_SGCK_OK_LAST

正常リターン(最終セグメント受信完了)

EEMCP_UOC_SGCK_NG

セグメント判定エラー

■EEMCP_UOC_SGCK_NGがリターンした場合

UOCからEEMCP_UOC_SGCK_NGでリターンした場合,コネクションを解放してMCP後処理トランザクションを起動します。該当するメッセージは破棄します。

■UOCのパラメタが不正の場合

UOCで設定した値に不正があった場合,MCPはメッセージログを出力して,コネクションを解放します。そのあと,MCP後処理トランザクションを起動します。該当するメッセージは破棄します。

■受信バッファオーバフロー
  • メッセージ長エリアにTP1/EEサービス定義で定義した受信バッファのサイズを超える値が設定されていた場合,MCPは受信バッファオーバフローと見なし,コネクションを解放してMCP後処理トランザクションを起動します。該当するメッセージは破棄します。

  • メッセージの最大サイズを拡張していて(eemcpfunc定義コマンドのmsglenオペランドにextendを指定),かつメッセージ長エリアに設定された値が8388608を超える場合,MCPは受信バッファオーバフローと見なします。

(7) セグメントの組み立て

入力セグメント判定UOCでのセグメントの分割・組み立てを次の図に示します。

図5‒3 入力セグメント判定UOCでのセグメントの分割・組み立て

[図データ]

未完成のセグメントを次の図に示します。

図5‒4 未完成のセグメント

[図データ]

完成済みのセグメント(次のメッセージが含まれている場合)を次の図に示します。

図5‒5 完成済みのセグメント

[図データ]

セグメントが未完成として判定されたあとに,後続メッセージを受信した場合のセグメントを次の図に示します。

図5‒6 セグメントが未完成として判定されたあとに後続メッセージを受信した場合のセグメント

[図データ]

(8) 受信メッセージ

受信メッセージの構成について説明します。

■メッセージの最大サイズを拡張していない場合

メッセージの最大サイズを拡張していない場合の受信メッセージの構成は,次の図に示すとおりです。

図5‒7 メッセージの最大サイズを拡張していない場合の受信メッセージの構成

[図データ]

■メッセージの最大サイズを拡張している場合

メッセージの最大サイズを拡張している場合(eemcpfunc定義コマンドのmsglenオペランドにextendを指定)の受信メッセージの構成は,次の図に示すとおりです。

図5‒8 メッセージの最大サイズを拡張している場合の受信メッセージの構成

[図データ]

(9) 注意事項

入力セグメント判定UOCが登録されていない場合は,受信した単位(入力バッファに格納された単位)を論理メッセージ(セグメント)として,該当のサービスキューに登録します。