Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成リファレンス C言語編


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] ;   /*予備*/
};
  • nid

    ノード識別子を検索のキーにする場合,サービス要求先のノード識別子を格納した領域のアドレスを指定します。文字列の最後にはヌル文字を設定してください。このヌル文字は文字列の長さに数えません。

    ノード識別子は,システム共通定義のnode_idオペランドに指定した名称で,かつサービス要求先ノードのホスト名がグローバルドメイン内にあることが前提です。

    ノード識別子を検索のキーにしない場合には,nidにアドレス0を指定してください。

  • hostnm

    ホスト名を検索のキーにする場合,サービス要求先ノードのホスト名を格納した領域のアドレスを指定します。指定できるホスト名は1から255文字までの文字列です。文字列に使用できる文字は,英数字記号,ピリオド,およびハイフンです(ただし,IPアドレス形式は除きます)。文字列の最後にはヌル文字を設定してください。このヌル文字は文字列の長さに数えません。指定するホスト名は,/etc/hostsファイルまたはDNSなどで,IPアドレスとのマッピングができる名称です。

    なお,サービス要求先ノードのホスト名はグローバルドメインに指定されていても,指定されていなくても,どちらでもかまいません。

    ホスト名を検索のキーにしない場合には,hostnmにアドレス0を指定してください。

  • portno

    ホスト名を検索のキーとする場合,サービス要求先ノードのネームサービスのポート番号(システム共通定義 name_portに指定した値)を指定します。portnoの指定値は,DCRPC_BINDING_TBL構造体のflagsにDCRPC_NAMPORTを指定した場合だけ有効です。

    portnoに0を指定した場合,またはDCRPC_BINDING_TBL構造体のflagsにDCNOFLAGSを指定した場合は,サービス要求元のネームサービスのポート番号と,サービス要求先のネームサービスのポート番号が同じであることが前提となります。

    また,ノード識別子を検索のキーとする場合は,portnoに指定した値は無視します。

  • flags

    DCNOFLAGSを指定します。

    portnoに値を指定した場合は,DCRPC_NAMPORTを指定してください。

    なお,filler1,filler2は拡張性を考慮して設けたエリアなので,値を設定する必要はありません(filler1,filler2のメンバ名称は使用しないでください)。

注※

ここでのグローバルドメインとは,次のノード名の集合を指します。

システム共通定義の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を指定しています。

dc_rpc_call_to関数の第8引数に,指定できないDCRPC_DOMAINを指定しています。

DCRPCER_NO_SUCH_SERVICE_GROUP

-310

groupに設定したサービスグループは定義されていません。または,groupに設定したサービスグループがサポートしていない機能を使用して,dc_rpc_call_to関数を実行しています。

DCRPC_BINDING_TBL構造体のnidに指定されたノード識別子が,グローバルドメイン内にありません。

DCRPCER_SERVICE_NOT_UP

-314

DCRPC_DIRECT_SCHEDULE関数を使用してDCRPC_BINDING_TBL構造体を作成し,ソケット受信型(ユーザサービス定義のreceive_fromオペランドにsocketを指定)ユーザサーバをサービス要求先として,dc_rpc_call_to関数を呼び出しました。

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との論理和を指定しないでdc_rpc_call_to関数を呼び出しました。

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構造体を指定してdc_rpc_call_to関数を呼び出す場合,サービス要求先のOpenTP1のバージョンは03-02以降でなければなりません。03-02以降でない場合は,動作の保証はしません

  6. 次の場合,dc_rpc_call_to関数がDCRPCER_TIMED_OUTでリターンすることがあります。

    システム共通定義のall_nodeオペランドで指定していないノードのサービスグループに対して,ホスト名を検索のキーに使用してdc_rpc_call_to関数を呼び出したあとに,このノード上のOpenTP1を停止または再開始し,同じサービスグループに対して再度ホスト名を検索のキーに使用してdc_rpc_call_to関数を呼び出した場合

  7. DCRPC_DIRECT_SCHEDULE関数を使用して作成したDCRPC_BINDING_TBL構造体をdc_rpc_call_to関数のdirectionに指定して,dc_rpc_call_to関数を呼び出した場合,rpc_retryオペランドは無効になります。

  8. DCRPC_DIRECT_SCHEDULE関数を使用して作成したDCRPC_BINDING_TBL構造体をdc_rpc_call_to関数のdirectionに指定して,dc_rpc_call_to関数を呼び出した場合,性能検証用トレースは取得できますが,呼び出し先のUAPの性能検証用トレース情報とはリンクしていません。クライアントUAPで取得した性能検証用トレースの通番は,サーバUAPに引き継ぎません。