5.1.1 入力セグメントの判定
入力セグメント判定UOCは,メッセージを受信したとき,そのメッセージでセグメントが完成しているかどうか,完成している場合は,完成したセグメントと後続のセグメントの境界がどこであるかを判定します。UOCは,相手システムからのメッセージを受信するたびに起動します。セグメントが未完成のとき(後続メッセージがある場合)は,後続メッセージに対して,監視タイマを設定できます。
ただし,コネクションの切断を抑止している場合は,監視タイマを設定しないでください。コネクションの切断抑止については,「2.3.2(5) コネクションの切断抑止」を参照してください。
なお,入力セグメント判定UOCは,次に示す条件に該当する場合は呼び出されません。
-
MCFイベントの発生
-
UAPからのアプリケーションプログラムの起動
-
受信メッセージの組み立て機能の使用
メッセージのデータ形式の詳細については,「2.3.7 メッセージの分割と組み立て」を参照してください。
- 〈この項の構成〉
(1) 入力セグメントの判定
TP1/NET/TCP/IPはUOCを呼び出すと,受信したメッセージのセグメントが格納されている受信バッファを引き渡します。未完成の受信メッセージがTP1/NET/TCP/IPに蓄積されている場合,受信バッファには未完成の受信メッセージと今回受信したメッセージが連結して格納されます。UOCでは,受信バッファに格納された受信メッセージの内容を基に,セグメントが完成しているかどうかを判定し,リターン値を設定します。UOCでの判定結果別に,設定する必要がある情報について説明します。
- セグメントが未完成の場合
-
該当メッセージの残りサイズを設定する必要があります。UOCが呼び出された時点で残りサイズを一意に決定できないときは,一意に決定できる情報(セグメントの全体長など)が格納された位置までの残りサイズ,または,受信バッファの残りサイズを設定してください。
- セグメントが完成した場合
-
該当メッセージのサイズと次メッセージについての情報を設定する必要があります。次メッセージがある場合,TP1/NET/TCP/IPは次メッセージの先頭を受信バッファの先頭に再配置して,再度UOCを呼び出します。
入力セグメントの判定処理の流れを次の図に示します。ここでは,データAとデータBを相手システムから送信する場合を例に説明します。
各パラメタに設定した値が不正の場合,TP1/NET/TCP/IPはMCFイベントを通知して,コネクションを解放します。
(2) 後続メッセージ監視タイマの設定
セグメントが未完成のとき,必要に応じて後続メッセージ監視タイマを設定できます。後続メッセージ監視タイマのセットを指示したあとで後続メッセージのタイムアウトが発生したときは,コネクションを解放してMCFイベント処理用MHPを起動します。このとき,該当メッセージは破棄されます。また,各パラメタに設定した値が不正の場合,TP1/NET/TCP/IPはMCFイベントを起動して,コネクションを解放します。
ユーザが作成する入力セグメント判定UOCの処理の流れを次の図に示します。
- 注※1
-
残っている該当メッセージのサイズを示します。
UOCを呼び出した時点で残っている該当メッセージのサイズを一意に決定できない場合は,一意に決定できる情報が格納された位置までの残りサイズ,または受信バッファの残りサイズを設定してください。
- 注※2
-
次メッセージのサイズ,次メッセージの先頭アドレス,該当メッセージのサイズを示します。
(3) UOCエラーリターン処理
UOCからDCTCP_UOC_SGCK_NGでリターンした場合,TP1/NET/TCP/IPは障害通知イベント(CERREVT)を通知します。
(4) UOCパラメタ不正の場合の処理
UOCで設定した値に不正があった場合,MCFはメッセージログを出力し,障害通知イベント(CERREVT)を通知してコネクションを解放します。該当するメッセージは破棄します。
(5) OpenTP1への組み込み方法
スタート関数(dc_mcf_svstart)を発行するMCFメイン関数に,作成したUOCの関数アドレスを設定します。入力セグメント判定UOCの関数アドレスは任意に決められます。UOC関数をコンパイルして生成したUOCオブジェクトファイルを,UOC関数を登録したMCFメイン関数と結合して,TP1/NET/TCP/IPの実行形式プログラムを生成します。MCFメイン関数の詳細については,「8.2 MCFメイン関数の作成」を参照してください。
(6) 標準提供UOC
入力セグメント判定UOCには,TP1/NET/TCP/IPが標準提供するUOC(標準提供UOC)があります。標準提供UOCを使用する場合は,MCFメイン関数に標準提供UOC関数(dc_mcf_stduoc_tcp_segchk)の関数アドレスを登録します。
標準提供する入力セグメント判定UOCが正常に動作するためには,受信するメッセージの先頭4バイト(ヘッダ)にメッセージ全体の長さ(メッセージのサイズ)が設定されていなければなりません。メッセージのサイズはバイト順序がビッグエンディアン※である整数型でなければなりません。また,標準提供の入力セグメント判定UOCを使用する場合,メッセージの先頭にアプリケーション名を設定できなくなります。このため,アプリケーション名は入力メッセージ編集UOCなど,別の方法で決定してください。また,セグメント未完のときの後続メッセージに対する監視タイマ値を30秒で設定します。
メッセージの形式を次に示します。
- 注※
-
ビッグエンディアンとはバイトを低い方から順番に並べて,最下位のビットを最上位のバイトに置く方式のことです。
(a) 妥当性のチェック
入力セグメント判定UOCは,ヘッダ(メッセージのサイズ)の妥当性をチェックします。
受信メッセージの先頭4バイトに格納されている値(メッセージのサイズ)が4バイト未満の場合は,エラーリターンします。
(b) エラー時の設定内容
入力セグメント判定UOCでエラーを検出すると,リターンコードにDCTCP_UOC_SGCK_NGを設定します。その場合,詳細リターンコード(rtn_detail)に-19001(メッセージのサイズ不正)を設定します。
(c) 処理の流れ
標準提供UOCの処理の流れを次の図に示します。
- 注※1
-
残っている該当メッセージのサイズを示します。
- 注※2
-
次メッセージのサイズ,次メッセージの先頭アドレス,該当メッセージのサイズを示します。
(d) UAPやUOCに通知するメッセージの形式
UAPやUOCに通知するメッセージの形式を次に示します。
ホストバイトオーダがリトルエンディアンのOS(LinuxまたはWindows)では,ビックエンディアンで設定されたメッセージサイズを参照する場合,UAPまたはUOCでバイトオーダを変換してください。