4.6.5 dc_clt_assem_receive_s − 組み立てメッセージの受信
(1) 形式
(a) _s付き関数
#include <dcvclt.h> DCLONG dc_clt_assem_receive_s(DCCLT_ID cltid, char CLTFAR *buff, DCLONG CLTFAR *recvleng, DCLONG timeout, DCLONG flags)
(b) _s無し関数
#include <dcvclt.h> DCLONG dc_clt_assem_receive(char CLTFAR *buff, DCLONG CLTFAR *recvleng, DCLONG timeout, DCLONG flags)
(2) 機能
メッセージの組み立て機能を使用して,メッセージを受信します。この場合,4バイトのメッセージ情報を受信したあと,メッセージ情報に設定されたメッセージ長分のメッセージを受信し,引数buffに格納します。ただし,メッセージ情報は,引数buffには格納しません。引数recvlengには,受信したメッセージ長を格納します。引数recvlengに格納するメッセージ長には,メッセージ情報の長さは含みません。
また,クライアント環境定義DCCLTDELIVERYCHECKにYを指定した場合は,メッセージの送達確認機能を使用して,メッセージを送受信します。この場合,11バイトのメッセージ情報を受信したあと,メッセージ情報に設定されたメッセージ長分のメッセージを受信し,引数buffに格納します。ただし,メッセージ情報は,引数buffには格納しません。引数recvlengには,受信したメッセージ長を格納します。引数recvlengに格納するメッセージ長には,メッセージ情報の長さは含みません。受信したメッセージ情報に「応答要求」が設定されていた場合は,11バイトのメッセージ情報を送信したあと,CUPに制御を戻します。
この関数を実行する場合,引数flagsにDCCLT_ONEWAY_RCV,またはDCCLT_SNDRCVを指定したdc_rpc_open_s関数を,あらかじめ実行しておく必要があります。
(3) UAPで値を設定する引数
-
cltid
dc_clt_cltin_s関数で受け取ったクライアントIDを指定します。
-
buff
受信したメッセージを格納する領域を指定します。通信相手が送信するメッセージ長以上の領域を指定してください。
-
recvleng
受信したメッセージを格納する領域長(引数buffの長さ)を指定します。
-
timeout
メッセージ受信時の最大待ち時間(秒)を指定します。-1から65535の整数を指定してください。
- -1を指定した場合
-
メッセージを受信するまで無制限に待ちます。
- 0を指定した場合
-
メッセージの受信を待ちません。受信するメッセージがなかった場合は,DCCLTER_TIMED_OUTでエラーリターンします。
- 1から65535を指定した場合
-
指定した秒数だけメッセージの受信を待ちます。指定した秒数を過ぎてもメッセージを受信できない場合は,DCCLTER_TIMED_OUTでエラーリターンします。
メッセージが分割されて届いた場合,メッセージ長分のメッセージが届くまで受信処理を繰り返し行います。受信処理が発生すると,この引数に指定した値が毎回適用されます。この引数に指定した値をクライアントの最大応答待ち時間として適用したい場合は,クライアント環境定義DCCLTOPTIONに,00000002オプションを指定してください。
-
flags
メッセージを受信したあと,コネクションを解放するかどうかを指定します。
- DCNOFLAGS
-
メッセージを受信したあと,dc_rpc_close_s関数を発行するまで,コネクションを解放しません。ただし,障害時を除きます。
- DCCLT_RCV_CLOSE
-
メッセージを受信したあと,コネクションを解放します。メッセージの送達確認機能を使用していて,受信したメッセージ情報に「応答要求」が設定されていた場合は,メッセージ情報を送信後,コネクションを解放します。
(4) 値が返される引数
-
buff
受信したメッセージが返されます。メッセージ情報は含みません。タイムアウトが発生すると,タイムアウトまでに受信できたメッセージが格納されます。
-
recvleng
受信したメッセージの長さが返されます。メッセージ情報の長さは含みません。
タイムアウトが発生すると,タイムアウトまでに受信できたメッセージの長さが格納されます。
(5) リターン値
リターン値 |
数値 (10進数) |
意味 |
---|---|---|
DC_OK |
0 |
正常に終了しました。 |
DCCLTER_INVALID_ARGS |
-2501 |
引数に指定した値が誤っています。 |
DCCLTER_PROTO |
-2502 |
次のどちらかの要因が考えられます。
|
DCCLTER_NO_BUFS |
-2504 |
メモリ不足が発生しました。 |
DCCLTER_NET_DOWN |
-2506 |
ネットワーク障害が発生しました。コネクションは解放されます。 |
DCCLTER_TIMED_OUT |
-2507 |
メッセージの受信時にタイムアウトになりました。コネクションは解放されます。 |
DCCLTER_SYSERR |
-2518 |
システムエラーが発生しました。ネットワーク障害の場合,コネクションは解放されます。 |
DCCLTER_RESOURCE |
-2538 |
資源不足が発生しました。 |
DCCLTER_CONNFREE |
-2542 |
相手システムからコネクションが解放されました。 |
DCCLTER_INVALID_CLTID |
-2544 |
引数cltidに指定したクライアントIDは,dc_clt_cltin_s関数で受け取ったクライアントIDと異なっています。 |
DCCLTER_INF_TOO_BIG |
-2546 |
CUPで用意した領域が小さく,相手システムからのメッセージを受信することができません。コネクションは解放されます。 |
DCCLTER_INVALID_MESSAGE |
-2548 |
不正なメッセージを受信しました。コネクションは解放されます。 |
(6) 注意事項
-
この関数は,次に示す場合にだけCUPに制御を戻します。
-
メッセージ情報に設定されたメッセージ長分のメッセージを受信した場合
-
ネットワーク障害が発生した場合
-
メッセージ受信時に,タイムアウトが発生した場合
-
相手システムからコネクションが解放された場合
-
メッセージを格納する領域(引数buff)が小さく,通信相手が送信するメッセージを格納できない場合
-
不正なメッセージを受信した場合
-
-
メッセージの組み立て機能およびメッセージの送達確認機能を使用する場合は,短いパケットで送受信するため,送信処理に時間が掛かることがあります。送信処理に時間が掛かる場合は,クライアント環境定義DCCLTTCPNODELAYにYを指定してください。