dc_rpc_call_to

名称

通信先を指定した遠隔サービスの呼び出し

形式

ANSI C,C++の形式

#include <dcrpc.h>
int 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)

K&R版 C の形式

#include <dcrpc.h>
int dc_rpc_call_to(*direction, *group, *service, *in, *in_len,
                  *out, *out_len, flags)
struct DCRPC_BINDING_TBL  *direction;
char      *group;
char      *service;
char      *in;
DCULONG   *in_len;
char      *out;
DCULONG   *out_len;
DCLONG    flags;

機能

特定のSPPにサービスを要求します。dc_rpc_call関数と同様に「サービスグループ名」と「サービス名」を引数に設定するのに加え,ホスト名またはノード識別子を指定したDCRPC_BINDING_TBL構造体を引数に設定します。DCRPC_BINDING_TBL構造体に指定したホスト名またはノード識別子は,サービス要求先を特定する検索のキーとして使用します。この設定に該当するサービス関数へサービスが要求されます。

ただし,ドメイン修飾をしてサービスを要求できません。それ以外は,dc_rpc_call関数の機能と変わりません。

なお,この機能は,TP1/Extension 1をインストールしていることが前提です。TP1/Extension 1をインストールしていない場合の動作は保証できませんので,ご了承ください。

UAPで値を設定する引数

●direction

サービス要求先を特定する検索キーを格納するDCRPC_BINDING_TBL構造体のアドレスを指定します。検索のキーはホスト名またはノード識別子のどちらかです。

DCRPC_BINDING_TBL構造体の形式を次に示します。

struct DCRPC_BINDING_TBL {
   char *nid ;           /*ノード識別子格納アドレス*/
   char *hostnm ;        /*ホスト名格納アドレス*/
   short portno ;        /*ポート番号*/
   short filler1 ;       /*予備*/
   DCLONG flags ;        /*属性*/
   DCLONG filler2[4] ;   /*予備*/
};

注※
ここでのグローバルドメインとは,次のノード名の集合を指します。
システム共通定義のname_domain_file_useオペランドにNを指定している場合
システム共通定義のall_nodeオペランド,all_node_exオペランドで指定したノード名の集合です。
システム共通定義のname_domain_file_useオペランドにYを指定している場合
ドメイン定義ファイルに指定したノード名の集合です。なお,ドメイン定義ファイルは次の場所に格納します。
  • all_nodeのドメイン定義ファイル
    $DCCONFPATH/dcnamndディレクトリ下
  • all_node_exのドメイン定義ファイル
    $DCCONFPATH/dcnamndexディレクトリ下

dc_rpc_call_to関数のdirectionに指定するDCRPC_BINDING_TBL構造体は,「DCRPC_BINDTBL_SET関数」または「DCRPC_DIRECT_SCHEDULE関数」を使用して作成することもできます。詳細については,「DCRPC_BINDTBL_SET,DCRPC_DIRECT_SCHEDULE」を参照してください。

●group

SPPのサービスグループ名を,31バイト以内のアスキー文字列で設定します。文字列の最後にはヌル文字を設定してください。このヌル文字は文字列の長さに数えません。

●service

SPPのサービス名を,31バイト以内のアスキー文字列で設定します。文字列の最後にはヌル文字を設定してください。このヌル文字は文字列の長さに数えません。

●in

サービスの入力パラメタを設定します。

●in_len

サービスの入力パラメタ長を設定します。1からDCRPC_MAX_MESSAGE_SIZEまでの範囲の長さが設定できます。DCRPC_MAX_MESSAGE_SIZEは,dcrpc.hで定義してあります。

注※
rpc_max_message_sizeオペランドを使用した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,rpc_max_message_sizeオペランドに指定した値になります。

●out

サービス関数から返ってくる応答を格納する領域を設定します。outで指す領域へ,サービス関数からの応答が設定されます。

●out_len

サービスの応答の長さを設定します。1からDCRPC_MAX_MESSAGE_SIZEまでの範囲の長さが設定できます。DCRPC_MAX_MESSAGE_SIZEは,dcrpc.hで定義してあります。

注※
rpc_max_message_sizeオペランドを使用した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,rpc_max_message_sizeオペランドに指定した値になります。

非応答型RPCの場合も,サービスの応答の長さを設定した領域のアドレスを指定する必要があります。この場合,サービスの応答の長さには,0を設定します。

●flags

RPCの形態とオプションを次に示す形式で設定します。

{DCNOFLAGS|DCRPC_NOWAIT|DCRPC_NOREPLY|DCRPC_CHAINED}〔|DCRPC_TPNOTRAN〕

DCNOFLAGS
同期応答型RPC
DCRPC_NOWAIT
非同期応答型RPC
DCRPC_NOREPLY
非応答型RPC
DCRPC_CHAINED
連鎖RPC
DCRPC_TPNOTRAN
トランザクション処理からのサービス要求で,要求先の処理をトランザクションにしない場合に設定します。またはDCRPC_DIRECT_SCHEDULE関数を使用してDCRPC_BINDING_TBL構造体を作成し,非トランザクション属性(ユーザサービス定義のatomic_updateオペランドに'N'を指定,またはシステム共通定義のjnl_fileless_optionオペランドに'Y'を指定)のユーザサーバにサービス要求を行う場合に設定します。
この値はRPCの形態との論理和で設定してください。
(例)
同期応答型RPCでトランザクションにしないサービス要求をする場合,flagsには「DCNOFLAGS|DCRPC_TPNOTRAN」と設定します。

サーバUAPから値が返される引数

●out

サービス関数が設定した,応答が返されます。

●out_len

サービス関数が設定した,応答の長さが返されます。

リターン値

dc_rpc_call関数のリターン値を参照してください。

なお,dc_rpc_call関数のリターン値のうち,dc_rpc_call_to関数ではエラー要因に追加があるリターン値を次に示します。

リターン値リターン値(数値)意味
DCRPCER_INVALID_ARGS-301引数に設定した値が間違っています。
DCRPC_BINDING_TBL構造体のhostnmに指定されたホスト名が,/etc/hostsファイルまたはDNSなどで,IPアドレスとのマッピングができません。
dc_rpc_call_to関数の第1引数に指定したDCRPC_BINDING_TBL構造体が,DCRPC_DIRECT_SCHEDULE関数で作成されていて,DCRPC_DIRECT_SCHEDULE関数のhostnmに0を指定しています。
DCRPCER_NO_SUCH_SERVICE_GROUP-310groupに設定したサービスグループは定義されていません。または,groupに設定したサービスグループがサポートしていない機能を使用して,dc_rpc_call_to関数を実行しています。
DCRPC_BINDING_TBL構造体のnidに指定されたノード識別子が,グローバルドメイン内にありません。
DCRPCER_TRNCHK_EXTEND-372同時に起動できるトランザクションブランチの数を超えたため,トランザクションブランチを開始できません。
一つのトランザクションブランチから開始できる子トランザクションブランチの最大数を超えたため,トランザクションブランチを開始できません。
トランザクション内でドメイン修飾をしたサービス要求で,flagsにDCRPC_TPNOTRANを設定していません。
リソースマネジャ(RM)でエラーが発生したため,トランザクションブランチを開始できません。
DCRPC_DIRECT_SCHEDULE関数を使用してDCRPC_BINDING_TBL構造体を作成し,非トランザクション属性(ユーザサービス定義のatomic_updateオペランドに'N'を指定,またはシステム共通定義のjnl_fileless_optionオペランドに'Y'を指定)のユーザサーバに対し,dc_rpc_call_to関数のflagsにDCRPC_TPNOTRANとの論理和を指定しないでサービスを要求しました。
TP1/LiNKの「システム環境設定」ウィンドウの[トランザクション機能]が[あり]に設定されていません。
注※
ここでのグローバルドメインとは,次のノード名の集合を指します。
システム共通定義のname_domain_file_useオペランドにNを指定している場合
システム共通定義のall_nodeオペランド,all_node_exオペランドで指定したノード名の集合です。
システム共通定義のname_domain_file_useオペランドにYを指定している場合
ドメイン定義ファイルに指定したノード名の集合です。なお,ドメイン定義ファイルは次の場所に格納します。
  • all_nodeのドメイン定義ファイル
    $DCCONFPATH/dcnamndディレクトリ下
  • all_node_exのドメイン定義ファイル
    $DCCONFPATH/dcnamndexディレクトリ下

その他関連事項

dc_rpc_call関数の項目を参照してください。

注意事項

  1. 一つのマシン内に複数のLANアダプタが接続されているマルチホームドホスト形態で,システム共通定義のmy_hostに指定したホスト名と異なる自マシン内のほかのホスト名を,DCRPC_BINDING_TBL構造体のhostnm,DCRPC_BINDING_SET関数のhostnm,またはDCRPC_DIRECT_SCHEDULE関数のhostnmに指定してはいけません。指定した場合は,動作の保証はしません
  2. ホスト名とノード識別子を同時にDCRPC_BINDING_TBL構造体に指定した場合,ホスト名の指定が有効になり,ノード識別子の指定は無視します。
  3. DCRPC_BINDING_TBL構造体に,ホスト名,ノード識別子ともに0を指定した場合は,dc_rpc_call関数とまったく同様に動作します。
  4. スケジュールサービスの管理するユーザサーバに直接サービスを要求する場合は,必ずDCRPC_DIRECT_SCHEDULE関数を使用してDCRPC_BINDING_TBL構造体を作成してください。
  5. DCRPC_DIRECT_SCHEDULE関数を使用してDCRPC_BINDING_TBL構造体を作成し,ソケット受信型(ユーザサービス定義のreceive_fromオペランドにsocketを指定)ユーザサーバへサービスを要求した場合は,dc_rpc_call_to関数は,DCRPCER_SERVICE_NOT_UPでエラーリターンします。
  6. DCRPC_DIRECT_SCHEDULE関数で作成したDCRPC_BINDING_TBL構造体を指定してdc_rpc_call_to関数を呼び出すときに,非トランザクション属性(ユーザサービス定義のatomic_updateオペランドに'N'を指定,またはシステム共通定義のjnl_fileless_optionオペランドに'Y'を指定)のユーザサーバへサービスを要求する場合,flagsにDCRPC_TPNOTRANとの論理和を指定しなければなりません。そうしない場合,dc_rpc_call_to関数はDCRPCER_TRNCHK_EXTENDでエラーリターンします。
  7. DCRPC_DIRECT_SCHEDULE関数で作成したDCRPC_BINDING_TBL構造体を指定してdc_rpc_call_to関数を呼び出す場合,サービス要求先のOpenTP1のバージョンは03-02以降でなければなりません。03-02以降でない場合は,動作の保証はしません
  8. ドメイン修飾をしたRPCはできません。dc_rpc_call_to関数のflagsにDCRPC_DOMAINを指定した場合は,DCRPCER_INVALID_ARGSでエラーリターンします。
  9. 次の場合,dc_rpc_call_to関数がDCRPCER_TIMED_OUTでリターンすることがあります。
    システム共通定義のall_nodeオペランドで指定していないノードのサービスグループに対して,ホスト名を検索のキーに使用してdc_rpc_call_to関数を呼び出したあとに,このノード上のOpenTP1を停止または再開始し,同じサービスグループに対して再度ホスト名を検索のキーに使用してdc_rpc_call_to関数を呼び出した場合
  10. DCRPC_DIRECT_SCHEDULE関数を使用して作成したDCRPC_BINDING_TBL構造体をdc_rpc_call_to関数のdirectionに指定して,dc_rpc_call_to関数を呼び出した場合,rpc_retryオペランドは無効になります。
  11. DCRPC_DIRECT_SCHEDULE関数を使用して作成したDCRPC_BINDING_TBL構造体をdc_rpc_call_to関数のdirectionに指定して,dc_rpc_call_to関数を呼び出した場合,性能検証用トレースは取得できますが,呼び出し先のUAPの性能検証用トレース情報とはリンクしていません。クライアントUAPで取得した性能検証用トレースの通番は,サーバUAPに引き継ぎません。