2.5.4 メッセージの組み立て機能と送達確認機能
TP1/Clientでは,メッセージの送受信時に自動的にメッセージの先頭4バイトにメッセージ長を付加・削除する機能があります。これを,メッセージの組み立て機能といいます。この機能を使用すると,CUPを作成するときにメッセージ長を意識する必要がなくなります。
さらに,先頭4バイトのメッセージ長に加えて,1バイトのセグメント情報,および6バイトのメッセージIDを付加してメッセージを送信し,応答専用データを受信して,メッセージの送達確認をすることもできます。これを,メッセージの送達確認機能といいます。この機能を使用すると,CUPを作成するときにメッセージの妥当性およびメッセージが送達したかどうかを意識する必要がなくなります。
メッセージの組み立て機能とメッセージの送達確認機能は,共に次の関数を発行してメッセージを送受信することで実現します。
-
dc_clt_assem_send_s関数
-
dc_clt_assem_receive_s関数
これらの関数を発行したときに,メッセージの組み立て機能だけ使用するか,さらにメッセージの送達確認機能も使用するかは,クライアント環境定義DCCLTDELIVERYCHECKで次の表に示すように指定します。
使用する機能 |
クライアント環境定義DCCLTDELIVERYCHECKの指定値 |
---|---|
メッセージの組み立て機能 |
N,または指定を省略 |
メッセージの送達確認機能 |
Y |
- 〈この項の構成〉
(1) 使用するための条件
どちらの機能を使用する場合も,引数flagsにDCCLT_ONEWAY_SND,DCCLT_ONEWAY_RCV,またはDCCLT_SNDRCVを指定したdc_rpc_open_s関数を発行しておく必要があります。
さらに,相手システムであるTP1/NET/TCP/IPも,受信メッセージの組み立て機能,または送達確認機能を使用する設定にします。TP1/NET/TCP/IPの設定方法については,マニュアル「OpenTP1 プロトコル TP1/NET/TCP/IP編」を参照してください。ただし,送受信メッセージの形式が同じである場合は,相手システムは限定しません。
(2) メッセージの形式
メッセージの組み立て機能を使用する場合と,送達確認機能を使用する場合に分けて,メッセージの形式について説明します。
(a) メッセージの組み立て機能を使用する場合
メッセージの組み立て機能を使用する場合の,送受信メッセージの形式を次の図に示します。
メッセージ長とは,組み立て,分解をするメッセージの全体長です。
(b) メッセージの送達確認機能を使用する場合
ここでは,メッセージの送達確認機能を使用する場合の送受信メッセージの形式,および応答専用データの形式について説明します。
-
送受信メッセージの形式
TP1/ClientとTP1/NET/TCP/IP間で送受信するメッセージの形式を次の図に示します。
図2‒23 送達確認機能使用時のメッセージの形式 それぞれの項目について説明します。
-
メッセージ長
組み立て,分解をするメッセージの全体長です。
-
セグメント情報
セグメントの種別と応答要求のための種別です。単一セグメントおよび自動応答要求を示す,0x18が設定されます。
-
メッセージID
メッセージと応答専用データの組み合わせを確認するための情報です。メッセージを送信するたびに,ユニークな値が設定されます。
-
-
応答専用データの形式
メッセージの送達確認機能を使用するときに送受信される,応答専用データの形式を次の図に示します。
図2‒24 応答専用データの形式 それぞれの項目について説明します。
-
メッセージ長
組み立て,分解をするメッセージの全体長です。
-
セグメント情報
セグメントの種別と応答要求のための種別です。単一セグメントおよび応答専用データを示す,0x10が設定されます。
-
メッセージID
メッセージと応答専用データの組み合わせを確認するための情報です。受信したメッセージに付加されているメッセージIDと,同じ値が設定されます。TP1/Clientは,送信時にメッセージに付加したメッセージIDと,TP1/NET/TCP/IPが応答専用データに付加したメッセージIDを比較し,一致した場合に処理を終了します。
-
(3) メッセージの組み立て機能を使用する場合の送受信の流れ
メッセージの組み立て機能を使用する場合のメッセージの組み立て,分解の流れについて説明します。
(a) メッセージの送信
メッセージの組み立て機能を使用してメッセージを送信する場合,dc_clt_assem_send_s関数を発行します。dc_clt_assem_send_s関数は,メッセージの先頭4バイトにメッセージ長を付加して送信します。
メッセージの組み立て機能を使用するときの送信の流れを次の図に示します。
メッセージを送信してすぐにコネクションを解放したい場合は,dc_clt_assem_send_s関数の引数flagsにDCCLT_SND_CLOSEを指定します。DCNOFLAGSを指定した場合,dc_rpc_close_s関数を発行するまでコネクションは解放されません。ただし,障害時を除きます。
通信先となるTP1/NET/TCP/IPのホスト名はクライアント環境定義DCSNDHOSTに,ポート番号はクライアント環境定義のDCSNDPORTに指定します。ホスト名とポート番号は,dc_clt_assem_send_s関数の引数に指定することもできます。
(b) メッセージの受信
メッセージ組み立て機能を使用してメッセージを受信する場合,dc_clt_assem_receive_s関数を発行します。送信時にメッセージの先頭に付加された,メッセージ長分のメッセージを受信します。
メッセージの組み立て機能を使用するときの受信の流れを次の図に示します。
メッセージの受信後すぐにコネクションを解放したい場合は,dc_clt_assem_receive_s関数の引数flagsにDCCLT_RCV_CLOSEを指定します。DCNOFLAGSを指定した場合,dc_rpc_close_s関数を発行するまで,コネクションは解放されません。ただし,障害時を除きます。
CUPのポート番号は,クライアント環境定義DCRCVPORTに指定します。
(4) メッセージの送達確認機能を使用する場合の送受信の流れ
メッセージの送達確認機能を使用する場合のメッセージの組み立て,分解,応答専用データの送受信の流れについて説明します。
(a) メッセージの送信と送達確認
メッセージの送達確認機能を使用してメッセージを送信する場合,dc_clt_assem_send_s関数を発行します。メッセージの送信後に,TP1/ClientはTP1/NET/TCP/IPの応答専用データを待ち合わせます。TP1/Clientは,TP1/NET/TCP/IPから応答専用データを受信したあと,CUPに制御を戻します。なお,受信した応答専用データは,CUPに通知しません。
メッセージの送達確認機能を使用するときの送信の流れを次の図に示します。
メッセージの送達確認機能を使用すると,メッセージの送信から応答専用データの受信までを監視できます。監視タイマがタイムアウトした場合,TP1/Clientは,TP1/NET/TCP/IPとのコネクションを解放し,DCCLTER_TIMED_OUTを返します。
メッセージの送信および応答専用データは,同一コネクションを使用して受信します。応答専用データを受信してすぐにコネクションを解放したい場合は,dc_clt_assem_send_s関数の引数flagsにDCCLT_SND_CLOSEを指定します。DCNOFLAGSを指定した場合,dc_rpc_close_s関数を発行するまで,コネクションは解放されません。ただし,障害時を除きます。
通信先となるTP1/NET/TCP/IPのホスト名はクライアント環境定義DCSNDHOSTに,ポート番号はクライアント環境定義のDCSNDPORTに指定します。ホスト名とポート番号は,dc_clt_assem_send_s関数の引数に指定することもできます。
(b) メッセージの受信と送達確認
メッセージの送達確認機能を使用してメッセージを受信する場合,dc_clt_assem_receive_s関数を発行します。TP1/NET/TCP/IPからメッセージを受信したあと,TP1/NET/TCP/IPに応答専用データを送信し,CUPに制御を戻します。
メッセージの送達確認機能を使用するときの受信の流れを次の図に示します。
メッセージの受信および応答専用データは,同一コネクションを使用して送信します。応答専用データを送信してすぐにコネクションを解放したい場合は,dc_clt_assem_receive_s関数の引数flagsにDCCLT_RCV_CLOSEを指定します。DCNOFLAGSを指定した場合,dc_rpc_close_s関数を発行するまで,コネクションは解放されません。ただし,障害時を除きます。
(c) 送受信メッセージの衝突
TP1/Clientから送信したメッセージと,TP1/NET/TCP/IPから送信したメッセージが衝突した場合,TP1/Clientは受信したメッセージを破棄し,TP1/NET/TCP/IPとのコネクションを解放したあと,DCCLTER_COLLISION_MESSAGEを返します。
送受信メッセージが衝突した場合の,処理の流れを次の図に示します。
(5) 妥当性チェック
メッセージの組み立て機能,および送達確認機能を使用する場合,送受信するメッセージの妥当性がTP1/Clientによって自動的にチェックされます。
(a) メッセージ長の妥当性チェック(メッセージの組み立て機能)
メッセージの組み立て機能を使用する場合,TP1/Clientはメッセージを受信後に,メッセージ長の妥当性チェックをします。発生するエラー別の対処を次の表に示します。
項番 |
エラー |
システムの処理 |
対処 |
---|---|---|---|
1 |
不正なメッセージを受信(メッセージ長が0〜4) |
処理を中断 |
相手システムの設定を見直す |
2 |
受信バッファ不足が発生(メッセージ長-4が引数recvlengよりも大きい) |
処理を中断 |
dc_clt_assem_receive_s関数の引数recvlengに指定した値が適切かどうか,またはMHPを見直す |
(b) 応答専用データの妥当性チェック(メッセージの送達確認機能)
メッセージの送達確認機能を使用する場合,TP1/Clientはメッセージの送信後に応答専用データを受信し,妥当性をチェックします。発生するエラー別の対処を次の表に示します。
項番 |
エラー |
システムの処理 |
対処 |
---|---|---|---|
1 |
次に示す不正なメッセージを受信
|
処理を中断 |
相手システムの設定を見直す |
2 |
メッセージが衝突 |
処理を中断 |
必要に応じてリトライ |
3 |
メッセージIDが不一致 |
受信リトライ |
特になし |
(c) 受信メッセージの妥当性チェック(メッセージの送達確認機能)
メッセージの送達確認機能を使用する場合,TP1/Clientはメッセージを受信後に,妥当性をチェックします。エラーが発生した場合,TP1/Clientは処理を中断します。発生するエラー別の対処を次の表に示します。
項番 |
エラー |
システムの処理 |
対処 |
---|---|---|---|
1 |
次に示す不正なメッセージを受信
|
処理を中断 |
相手システムの設定を見直す |
2 |
受信バッファ不足が発生(メッセージ長-11が引数recvlengよりも大きい) |
処理を中断 |
dc_clt_assem_receive_s関数の引数recvlengに指定した値が適切かどうか,またはMHPを見直す |