4.3.3 dc_rpc_call_s − 遠隔サービスの要求
(1) 形式
(a) TP1/Client/Wの場合
■ _s付き関数
#include <dcvrpc.h> DCLONG dc_rpc_call_s(DCCLT_ID cltid, char *group, char *service, char *in, DCULONG *in_len, char *out, DCULONG *out_len, DCLONG flags)
■ _s無し関数
#include <dcvrpc.h> int dc_rpc_call(char *group, char *service, char *in, DCULONG *in_len, char *out, DCULONG *out_len, DCLONG flags)
(b) TP1/Client/Pの場合
■ _s付き関数
#include <dcvrpc.h> DCLONG dc_rpc_call_s(DCCLT_ID cltid, char CLTFAR *group, char CLTFAR *service, char CLTFAR *in, DCULONG CLTFAR *in_len, char CLTFAR *out, DCULONG CLTFAR *out_len, DCLONG flags)
■ _s無し関数
#include <dcvrpc.h> int dc_rpc_call(char CLTFAR *group, char CLTFAR *service, char CLTFAR *in, DCULONG CLTFAR *in_len, char CLTFAR *out, DCULONG CLTFAR *out_len, DCLONG flags)
(2) 機能
SPPのサービスを要求します。「サービスグループ名+サービス名」に該当するサービス関数を呼び,その応答を受け取ります。
サービス要求されたサーバUAPが存在するノードのOpenTP1は,稼働していなければなりません。OpenTP1が稼働していない場合(開始処理中を含む)は,dc_rpc_call_s関数はDCRPCER_NET_DOWN,DCRPCER_OLTF_NOT_UP,DCRPCER_OLTF_INITIALIZINGでエラーリターンします。
dc_rpc_call_s関数を実行したときに,目的のサービスグループが閉塞されている場合は,DCRPCER_SERVICE_CLOSEDでエラーリターンします。
dc_rpc_call_s関数を実行したときに,目的のサービスグループがdcsvstopコマンドなどで終了処理中,または終了している場合,DCRPCER_SERVICE_TERMINATING,DCRPCER_SERVICE_CLOSED,DCRPCER_NO_SUCH_SERVICE_GROUPのうちのどれかでエラーリターンします。どのリターン値が戻るかは,dc_rpc_call_s関数を実行したタイミングで決まります。
ソケット受信型サーバでは,ユーザサービス定義のmax_socket_msgとmax_socket_msglenの指定でデータの輻輳制御をしています。そのため,サービス要求を受信できない場合があります。このとき,dc_rpc_call_s関数は,DCRPCER_SERVER_BUSYでエラーリターンします。この値が戻った場合,CUPは適当な時間をおいてから再実行すれば,サービス要求できる場合があります。
XDM/DCCM3と通常の通信形態で通信する場合,クライアント環境定義DCCLTSERVICEGROUPLISTにXDM/DCCM3論理端末のホスト名およびポート番号を指定し,dc_rpc_call_s関数を実行します。
(a) 引数の設定
CUPではサービス関数の応答の領域(out)を確保しておきます。さらに,CUPではdc_rpc_call_s関数に次の値を指定します。
-
入力パラメタ(in)
-
入力パラメタ長(in_len)
-
応答の長さ(out_len)
入力パラメタ,入力パラメタ長,応答の長さは,CUPのdc_rpc_call_s関数で指定した値がそのままサービス関数に渡されます。応答を返さないサービス関数のサービスを呼ぶときは,応答の長さを指定しても無視されます。
入力パラメタ長と応答の長さの最大値DCRPC_MAX_MESSAGE_SIZE※は,ヘッダファイルdcvrpc.hに定義されています。
- 注※
-
クライアント環境定義DCCLTRPCMAXMSGSIZEに2以上を指定した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,クライアント環境定義DCCLTRPCMAXMSGSIZEに指定した値になります。
(b) 引数の参照
サービス関数の処理終了後に,次の値が参照できます。
-
サービス関数の応答(out)
-
サービス関数の応答の長さ(out_len)
out_lenは,サービス関数から実際に返ってきた応答の長さです。
同期応答型RPC(flagsにDCNOFLAGSを設定)の場合,dc_rpc_call_s関数がリターンしたあと,outとout_lenを参照できます。非応答型RPC(flagsにDCRPC_NOREPLYを設定)の場合,outとout_lenは参照できません。また,dc_rpc_call_s関数がエラーリターンした場合もoutとout_lenは参照できません。
返ってきた応答がCUPで確保した応答の領域(out)よりも大きい場合は,リターン値DCRPCER_REPLY_TOO_BIGでエラーリターンします。
(3) UAPで値を設定する引数
-
cltid
dc_clt_cltin_s関数で受け取ったクライアントIDを指定します。
-
group
サービスグループ名を31バイト以内の文字列で指定します。文字列の最後には,NULL文字を指定してください。
-
service
サービス名を31バイト以内の文字列で指定します。文字列の最後には,NULL文字を指定してください。
-
in
サービスの入力パラメタを指定します。
-
in_len
サービスの入力パラメタ長を指定します。1からDCRPC_MAX_MESSAGE_SIZE※までの範囲の長さが指定できます。
- 注※
-
クライアント環境定義DCCLTRPCMAXMSGSIZEに2以上を指定した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,クライアント環境定義DCCLTRPCMAXMSGSIZEに指定した値になります。
-
out
サービスの応答を受け取る領域を指定します。
-
out_len
サービスの応答を受け取る領域の長さを指定します。1からDCRPC_MAX_MESSAGE_SIZE※までの範囲の長さが指定できます。
- 注※
-
クライアント環境定義DCCLTRPCMAXMSGSIZEに2以上を指定した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,クライアント環境定義DCCLTRPCMAXMSGSIZEに指定した値になります。
-
flags
RPCの形態を指定します。
DCNOFLAGS:同期応答型RPC
DCRPC_NOREPLY:非応答型RPC
DCRPC_CHAINED:連鎖RPC
flagsにDCNOFLAGS,またはDCRPC_CHAINEDを指定すると,応答が返されてくるか,または応答待ち時間(クライアント環境定義DCWATCHTIMの値)切れ(タイムアウト)エラーになるまで,dc_rpc_call_s関数は戻りません。ただし,サービス要求先のSPPがアボートした場合は,即時にエラーリターンします。
この場合,DCWATCHTIMで指定された応答待ち時間によって,次の二つのリターン値が返されます。
-
DCWATCHTIMに1〜65535を指定した場合:DCRPCER_TIMED_OUT
-
DCWATCHTIMに0(無限に待つ)を指定した場合:DCRPCER_SERVICE_NOT_UP
また,CUP実行中に応答待ち時間を変更することもできます。この場合,dc_rpc_call_s関数を実行する前に,dc_rpc_set_watch_time_s関数を実行してください。
なお,トランザクション中,または常設コネクション中に限り,DCRPC_CHAINEDを指定できます。
flagsにDCRPC_NOREPLYを指定すると,要求したサービスは応答を返さないサービスとみなされます。この場合,dc_rpc_call_s関数はサービスの実行終了を待たないで,すぐに戻ります。この指定をした場合は,応答(out)と応答の長さ(out_len)は参照できません。さらに,サービス関数が実行されたかどうかは,CUPではわかりません。
トランザクションの処理からのRPCを,トランザクションとしないサービス要求にできます。RPCの形態を示すパラメタにDCRPC_TPNOTRANを合わせて指定すると,該当するdc_rpc_call_s関数のサービス要求は,トランザクションの処理でないサービス要求になります。
(例)DCNOFLAGS|DCRPC_TPNOTRAN
このサービス要求は,トランザクションの処理からだけ指定できます。トランザクションの範囲外でこの指定をした場合,dc_rpc_call_s関数はDCRPCER_INVALID_ARGSでエラーリターンします。
-
(4) 値が返される引数
-
out
サービス関数で指定したサービスの応答が返されます。引数flagsにDCRPC_NOREPLYを指定した場合は,返されません。
-
out_len
サービス関数で指定したサービスの応答の長さが返されます。引数flagsにDCRPC_NOREPLYを指定した場合は,返されません。
(5) リターン値
リターン値 |
数値 (10進数) |
意味 |
---|---|---|
DC_OK |
0 |
正常終了しました。 |
DCRPCER_INVALID_ARGS |
-2401 |
引数に指定した値が誤っています。 |
DCRPCER_PROTO |
-2402 |
dc_rpc_open_s関数が実行されていません。 |
DCRPCER_NO_BUFS |
-2404 |
必要なバッファが確保できませんでした。または,リソース不足が発生しました。 |
DCRPCER_NET_DOWN |
-2406 |
ネットワーク障害が発生しました。 |
DCRPCER_TIMED_OUT |
-2407 |
dc_rpc_call_s関数の処理で時間切れ(タイムアウト)が発生しました。または,サービス要求したSPPが処理完了前に異常終了しました。 |
DCRPCER_MESSAGE_TOO_BIG |
-2408 |
入力パラメタ長が最大値を超えました。 |
DCRPCER_REPLY_TOO_BIG |
-2409 |
返ってきた応答の長さが,CUPで用意した領域を超えています。 |
DCRPCER_NO_SUCH_SERVICE_GROUP |
-2410 |
次のどちらかの要因が考えられます。
|
DCRPCER_NO_SUCH_SERVICE |
-2411 |
serviceに指定したサービス名は定義されていません。 |
DCRPCER_SERVICE_CLOSED |
-2412 |
serviceに指定したサービスが存在するサービスグループは,閉塞されています。 |
DCRPCER_SERVICE_TERMINATING |
-2413 |
指定したサービスは終了処理中です。 |
DCRPCER_SERVICE_NOT_UP |
-2414 |
サービス要求先のSPPが未起動であるか,または処理完了前に異常終了しました。この値はクライアント環境定義DCWATCHTIMに0を指定(応答無限待ち指定)した場合に戻ります。 |
DCRPCER_OLTF_NOT_UP |
-2415 |
指定したサービスが存在するノードのOpenTP1が実行されていません。または,トランザクション処理中,サーバとのコネクションが切断されているため,通信できません。 |
DCRPCER_SYSERR_AT_SERVER |
-2416 |
指定したサービスでシステムエラーが発生しました。 |
DCRPCER_NO_BUFS_AT_SERVER |
-2417 |
指定したサービスでメモリ不足が発生しました。 |
DCRPCER_SYSERR |
-2418 |
システムエラーが発生しました。 |
DCRPCER_INVALID_REPLY |
-2419 |
サービス関数がOpenTP1に返した応答長が,1からDCRPC_MAX_MESSAGE_SIZE※までの範囲にありません。 |
DCRPCER_OLTF_INITIALIZING |
-2420 |
サービス要求されたノードにあるOpenTP1は,開始処理中です。 |
DCRPCER_NO_BUFS_RB |
-2423 |
メモリ不足が発生しました。 |
DCRPCER_SYSERR_RB |
-2424 |
システムエラーが発生しました。 |
DCRPCER_SYSERR_AT_SERVER_RB |
-2425 |
指定したサービスでシステムエラーが発生しました。 |
DCRPCER_REPLY_TOO_BIG_RB |
-2426 |
返ってきた応答が,CUPで用意した領域に収まりません。 |
DCRPCER_TRNCHK |
-2427 |
ノード間負荷バランス機能の環境で,複数のSPPのトランザクション属性が一致していません。または,負荷を分散する先のノードにあるOpenTP1のバージョンが古いため,ノード間負荷バランス機能を実行できません。このリターン値は,ノード間負荷バランス機能を使用しているSPPにサービスを要求した場合にだけ戻ります。 |
DCRPCER_CONNFREE |
-2442 |
常設コネクションが解放されました。 |
DCRPCER_SERVER_BUSY |
-2456 |
サービス要求先のソケット受信型サーバが,サービス要求を受信できません。 |
DCRPCER_TESTMODE |
-2466 |
クライアント環境定義DCUTOKEYを指定している環境下で,ユーザサービス定義でtest_mode=noと指定したSPPに対してサービス要求しました。 または,次の条件が重なった環境下から関数を呼び出しています。
|
DCRPCER_NOT_TRN_EXTEND |
-2467 |
トランザクション処理の連鎖RPCを使ったあとで,flagsにDCRPC_TPNOTRANを設定したdc_rpc_call_s関数でサービスを要求しています。 |
DCRPCER_SECCHK |
-2470 |
サービス要求先のSPPは,セキュリティ機能で保護されています。dc_rpc_call_s関数を呼び出したUAPには,サーバUAPへのアクセス権限がありません。 |
DCRPCER_TRNCHK_EXTEND |
-2472 |
次のどれかの要因が考えられます。
|
DCRPCER_SERVICE_TERMINATED |
-2478 |
サービス要求先のSPPが処理完了前に異常終了しました。この値はクライアント環境定義DCEXTENDFUNCTIONに00000001を指定した場合に戻ります。00000000を指定しているか指定を省略していると,リターン値にはDCRPCER_TIMED_OUT,またはDCRPCER_SERVICE_NOT_UPが戻ります。 |
DCRPCER_VERSION_CHECK |
-2479 |
サービス要求先のTP1/Server Baseのバージョンが古い(03-03以降でない)ため,データ圧縮機能は使用できません。このリターン値は,トランザクションの範囲内でサービス要求した場合に戻ります。 |
DCCLTER_INVALID_CLTID |
-2544 |
cltidに指定したクライアントIDは,dc_clt_cltin_s関数で受け取ったクライアントIDと異なっています。 |
DCRPCER_PORT_IN_USE |
-2547 |
指定したポート番号は使用されています。または,OSが自動的に割り当てるポート番号が不足しています。 |
(6) 注意事項
-
入力パラメタ(in),およびサービス関数の応答(out)に同じバッファを指定しないでください。
-
flagsにDCRPC_NOREPLYを指定した場合,次のリターン値は戻りません。
- 発生しないエラー
-
DCRPCER_REPLY_TOO_BIG
DCRPCER_INVALID_REPLY
- 発生しても検出できないエラー
-
DCRPCER_NO_SUCH_SERVICE
DCRPCER_SERVICE_CLOSED
DCRPCER_SERVICE_TERMINATING
DCRPCER_SYSERR_AT_SERVER
DCRPCER_NO_BUFS_AT_SERVER
DCRPCER_OLTF_INITIALIZING
-
リターン値DCRPCER_TIMED_OUTが戻る場合,次に示す要因が考えられます。
クライアント環境定義で指定した最大応答待ち時間が短い
サービス要求先のSPPから発行したサービス関数の異常終了
サービス要求先のSPPが存在するノードの障害
サービス要求先のSPPの処理完了前での異常終了
ネットワーク障害
上記の場合,サービス要求先のSPPから開始したトランザクションの処理はコミットされて,データベースが更新されていることがあります。データベースが更新されているかどうか確認してください。
-
CUPからdc_trn_begin_s関数を実行後,dc_rpc_call_s関数を実行して,次に示すリターン値が戻った場合は,必要があればロールバック要求の関数を実行してください。
DCRPCER_TIMED_OUT
DCRPCER_NO_SUCH_SERVICE
DCRPCER_NO_BUFS_AT_SERVER
DCRPCER_INVALID_REPLY
DCRPCER_NO_BUFS_RB
DCRPCER_SYSERR_RB
DCRPCER_SYSERR_AT_SERVER_RB
DCRPCER_REPLY_TOO_BIG_RB