4.3.3 dc_rpc_call_s遠隔サービスの要求

<この項の構成>
(1) 形式
(2) 機能
(3) UAPで値を設定する引数
(4) 値が返される引数
(5) リターン値
(6) 注意事項

(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関数に次の値を指定します。

入力パラメタ,入力パラメタ長,応答の長さは,CUPのdc_rpc_call_s関数で指定した値がそのままサービス関数に渡されます。応答を返さないサービス関数のサービスを呼ぶときは,応答の長さを指定しても無視されます。

入力パラメタ長と応答の長さの最大値DCRPC_MAX_MESSAGE_SIZEは,ヘッダファイルdcvrpc.hに定義されています。

注※
クライアント環境定義DCCLTRPCMAXMSGSIZEに2以上を指定した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,クライアント環境定義DCCLTRPCMAXMSGSIZEに指定した値になります。
(b) 引数の参照

サービス関数の処理終了後に,次の値が参照できます。

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で値を設定する引数

(4) 値が返される引数

(5) リターン値

リターン値数値
(10進数)
意味
DC_OK0正常終了しました。
DCRPCER_INVALID_ARGS-2401引数に指定した値が誤っています。
DCRPCER_PROTO-2402dc_rpc_open_s関数が実行されていません。
DCRPCER_NO_BUFS-2404必要なバッファが確保できませんでした。または,リソース不足が発生しました。
DCRPCER_NET_DOWN-2406ネットワーク障害が発生しました。
DCRPCER_TIMED_OUT-2407dc_rpc_call_s関数の処理で時間切れ(タイムアウト)が発生しました。または,サービス要求したSPPが処理完了前に異常終了しました。
DCRPCER_MESSAGE_TOO_BIG-2408入力パラメタ長が最大値を超えました。
DCRPCER_REPLY_TOO_BIG-2409返ってきた応答の長さが,CUPで用意した領域を超えています。
DCRPCER_NO_SUCH_SERVICE_GROUP-2410次のどちらかの要因が考えられます。
  • groupに指定したサービスグループ名は定義されていません。
  • TP1/Serverと通信するにもかかわらず,クライアント環境定義DCCLTNOSERVERにYが指定されています。
DCRPCER_NO_SUCH_SERVICE-2411serviceに指定したサービス名は定義されていません。
DCRPCER_SERVICE_CLOSED-2412serviceに指定したサービスが存在するサービスグループは,閉塞されています。
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に対してサービス要求しました。
または,次の条件が重なった環境下から関数を呼び出しています。
  • クライアント環境定義DCUTOKEYを指定しています。
  • CUP実行プロセスとの常設コネクションが確立中です。
  • トランザクションの範囲外です。
  • ユーザサービス定義で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次のどれかの要因が考えられます。
  • 同時に起動できるトランザクションブランチの数を超えたため,トランザクションブランチを開始できません。
  • 一つのトランザクションブランチから開始できる子トランザクションブランチの最大数を超えたため,トランザクションブランチを開始できません。
  • トランザクション内でドメイン修飾をしたサービス要求で,flagsにDCRPC_TPNOTRANを設定していません。
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-2544cltidに指定したクライアントIDは,dc_clt_cltin_s関数で受け取ったクライアントIDと異なっています。
DCRPCER_PORT_IN_USE-2547指定したポート番号は使用されています。または,OSが自動的に割り当てるポート番号が不足しています。
注※
クライアント環境定義DCCLTRPCMAXMSGSIZEに2以上を指定した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,クライアント環境定義DCCLTRPCMAXMSGSIZEに指定した値になります。

(6) 注意事項