4.3.4 dc_rpc_call_to_s − 通信先を指定した遠隔サービスの要求
(1) 形式
(a) TP1/Client/Wの場合
■ _s付き関数
#include <dcvrpc.h> DCLONG dc_rpc_call_to_s( DCCLT_ID cltid, struct DCRPC_BINDING_TBL *direction, char *group, char *service, char *in, DCULONG *in_len, char *out, DCULONG *out_len, DCLONG flags)
■ _s無し関数
#include <dcvrpc.h> DCLONG dc_rpc_call_to( struct DCRPC_BINDING_TBL *direction, 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_to_s( DCCLT_ID cltid, struct DCRPC_BINDING_TBL CLTFAR *direction, 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> DCLONG dc_rpc_call_to( struct DCRPC_BINDING_TBL CLTFAR *direction, char CLTFAR *group, char CLTFAR *service, char CLTFAR *in, DCULONG CLTFAR *in_len, char CLTFAR *out, DCULONG CLTFAR *out_len, DCLONG flags)
(2) 機能
dc_rpc_call_s関数と同様に,SPPのサービスを要求します。dc_rpc_call_to_s関数では,サービスグループ名とサービス名に加え,ホスト名を該当するサービス関数の検索のキーとして使用し,サービスの要求先を限定します。
この関数を発行する前にDCRPC_DIRECT_SCHEDULE()を発行し,DCRPC_BINDING_TBL構造体を作成しておく必要があります。引数directionにDCRPC_BINDING_TBL構造体へのアドレスを指定します。それ以外のインタフェースは,dc_rpc_call_s関数と同じです。
(3) UAPで値を設定する引数
-
cltid
dc_clt_cltin_s関数で受け取ったクライアントIDを指定します。
-
direction
DCRPC_BINDING_TBL構造体のアドレスを指定します。
この関数を発行する前にDCRPC_DIRECT_SCHEDULE()を発行し,DCRPC_BINDING_TBL構造体に値を設定しておきます。
-
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
flagsにDCNOFLAGSを指定すると,応答が返されてくるか,または応答待ち時間(クライアント環境定義DCWATCHTIMの値)切れ(タイムアウト)エラーになるまで,dc_rpc_call_to_s関数は戻りません。ただし,サービス要求先のSPPがアボートした場合は,即時にエラーリターンします。
この場合,クライアント環境定義DCWATCHTIMで指定された応答待ち時間によって,次の二つのリターン値が返されます。
-
DCWATCHTIMに1〜65535を指定した場合:DCRPCER_TIMED_OUT
-
DCWATCHTIMに0(無限に待つ)を指定した場合:DCRPCER_SERVICE_NOT_UP
また,CUP実行中に応答待ち時間を変更することもできます。この場合,dc_rpc_call_to_s関数を実行する前に,dc_rpc_set_watch_time_s関数を実行してください。
flagsにDCRPC_NOREPLYを指定すると,要求したサービスは応答を返さないサービスとみなされます。この場合,dc_rpc_call_to_s関数はサービスの実行終了を待たないで,すぐに戻ります。この指定をした場合は,応答(out)と応答の長さ(out_len)は参照できません。さらに,サービス関数が実行されたかどうかは,CUPではわかりません。
-
(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_to_s関数の処理で時間切れ(タイムアウト)が発生しました。または,サービス要求したSPPが処理完了前に異常終了しました。 |
DCRPCER_MESSAGE_TOO_BIG |
-2408 |
入力パラメタ長が最大値を超えました。 |
DCRPCER_REPLY_TOO_BIG |
-2409 |
返ってきた応答の長さが,CUPで用意した領域を超えています。 |
DCRPCER_NO_SUCH_SERVICE_GROUP |
-2410 |
groupに指定したサービスグループ名は定義されていません。 または,ソケット受信型(ユーザサービス定義receive_from=socket指定)のユーザサーバへサービス要求を行いました。 または,クライアント環境定義DCCLTONLYTHISNODEの指定がNのとき,サービス要求先のSPPが未起動です。 |
DCRPCER_NO_SUCH_SERVICE |
-2411 |
serviceに指定したサービス名は定義されていません。 |
DCRPCER_SERVICE_CLOSED |
-2412 |
serviceに指定したサービスが存在するサービスグループは,閉塞されています。 |
DCRPCER_SERVICE_TERMINATING |
-2413 |
指定したサービスは終了処理中です。 |
DCRPCER_SERVICE_NOT_UP |
-2414 |
クライアント環境定義DCCLTONLYTHISNODEの指定がYのとき,サービス要求先の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_TRNCHK |
-2427 |
負荷を分散する先のノードにあるOpenTP1のバージョンが古いため,ノード間負荷バランス機能を実行できません。このリターン値は,ノード間負荷バランス機能を使用しているSPPにサービスを要求した場合にだけ戻ります。 |
DCRPCER_TESTMODE |
-2466 |
ユーザサービス定義でtest_mode=noと指定したSPPに対してサービス要求しました。 |
DCRPCER_SECCHK |
-2470 |
サービス要求先のSPPは,セキュリティ機能で保護されています。dc_rpc_call_to_s関数を呼び出したUAPには,サーバUAPへのアクセス権限がありません。 |
DCRPCER_SERVICE_TERMINATED |
-2478 |
サービス要求先のSPPが処理完了前に異常終了しました。この値はクライアント環境定義DCEXTENDFUNCTIONに00000001を指定した場合に戻ります。00000000を指定しているか指定を省略していると,リターン値にはDCRPCER_TIMED_OUT,またはDCRPCER_SERVICE_NOT_UPが戻ります。 |
DCCLTER_INVALID_CLTID |
-2544 |
cltidに指定したクライアントIDは,dc_clt_cltin_s関数で受け取ったクライアントIDと異なっています。 |
DCRPCER_PORT_IN_USE |
-2547 |
指定したポート番号は使用されています。または,OSが自動的に割り当てるポート番号が不足しています。 |
(6) 注意事項
-
ソケット受信型(ユーザサービス定義receive_from=socket指定)のユーザサーバへサービス要求を行った場合は,この関数は,DCRPCER_NO_SUCH_SERVICE_GROUPでエラーリターンします。
-
サービス要求先のOpenTP1のバージョンは,03-02以降でなければなりません。これ以前のOpenTP1をサービス要求先とした場合は,動作の保証はできません。
-
常設コネクション確立中,またはトランザクションの範囲内でこの関数を発行した場合,この関数はDCRPCER_PROTOでエラーリターンします。
-
クライアント環境定義DCCACHE,DCCLTCACHETIMに値を指定しても有効になりません。
-
スケジュールサービスに直接送信するため,クライアント環境定義DCCLTLOADBALANCEに値を指定しても有効になりません。
-
dc_rpc_call_to_s関数発行時は,クライアント環境定義DCCLTSERVICEGROUPLISTは参照しません。
-
dc_rpc_call_to_s関数発行時は,クライアント環境定義DCSCDDIRECT,DCSCDPORT,DCSCDMULTIおよびDCSCDMULTICOUNTは参照しません。
-
クライアント環境定義DCCLTONLYTHISNODEの指定値がN,または指定値を省略したときは,サービス要求を受け付けたスケジュールサービスのノード優先で負荷分散を行います。Yのときは,負荷分散を行いません。
-
サービス要求先のホスト名に誤りがあった場合,この関数はDCRPCER_INVALID_ARGSでエラーリターンします。
-
クライアント環境定義DCCLTONLYTHISNODEの指定値によって,この関数の動作に次のような相違があります。
SPPの状態
DCCLTONLYTHISNODE指定値
指定ノード
他ノード
N(省略値)
Y
負荷が低い
−
指定ノードのSPPにスケジュールされる。
指定ノードのSPPにスケジュールされる。
負荷が高い,または閉塞(受付可)
負荷が低い
他ノードのSPPにスケジュールされる。
負荷が高い
指定ノードのSPPにスケジュールされる。
閉塞
停止
閉塞(受付不可)
起動
他ノードのSPPにスケジュールされる。
関数は,DCRPCER_SERVICE_CLOSEDでエラーリターンする。
閉塞(受付可)
閉塞(受付不可)
関数は,DCRPCER_SERVICE_CLOSEDでエラーリターンする。
停止
停止
起動
他ノードのSPPにスケジュールされる。
関数は,DCRPCER_SERVICE_NOT_UPでエラーリターンする。
閉塞(受付可)
閉塞(受付不可)
関数は,DCRPCER_NO_SUCH_SERVICE_GROUPでエラーリターンする。
停止