6.2 同期メッセージの送信

tpcall()関数は、サービス・サブルーチンにリクエストを送信し、同期的に応答を待ちます。tpcall()関数の呼出しには、次のシグネチャを使用します:

int
tpcall(char *svc, char *idata, long ilen, char **odata, long *olen, long flags)

次の表は、tpcall()関数の引数を示しています。

表6-1 tpcall()関数の引数

引数 説明
svc アプリケーションで提供されるサービス名を指すポインタ。
idata リクエストのデータ部分のアドレスを含むポインタ。このポインタは、tpalloc()の以前の呼出しで割り当てられた型付きバッファを参照しなければなりません。idatatype (および指定されている場合はsubtype)は、サービス・ルーチンで使用できるtype (および指定されている場合はsubtype)と合致する必要があります。タイプが合致しない場合、tperrnoTPEITYPEが設定され、関数の呼出しが失敗します。データがリクエストされていない場合、idataにNULLポインタを設定します。この設定は、パラメータが無視されうることを意味します。リクエストでデータが送信されない場合、idataのバッファを割り当てる必要はありません。
ilen idataで参照されるバッファ内のリクエスト・データの長さ。バッファが自己記述型の場合、つまりFML、FML32、VIEW、VIEW32、X_COMMON、X_C_TYPEまたはSTRING型バッファの場合、この引数にゼロを設定すると引数が無視されます。
*odata 応答を受信する出力バッファを指すポインタのアドレス。tpalloc()関数を使用して、出力バッファを割り当てておく必要があります。tpcall()から正常に制御が戻ったときに、応答メッセージにデータが含まれていないと、*olenにゼロが設定されます。ポインタと出力バッファの内容は変更されません。リクエスト・メッセージと応答メッセージの両方に同じバッファを使用できます。その場合、*odataには、入力バッファを割り当てたときに返されたポインタのアドレスを設定します。このパラメータがNULLを指している場合は、エラーになります。
olen 応答データの長さを指すポインタ。このパラメータがNULLを指している場合は、エラーになります。
flags フラグのオプション。論理演算子ORを使用すると、複数のフラグをリストできます。この値にゼロを設定すると、デフォルトの方法で通信が行われます。有効なフラグとデフォルト値については、『Oracle Tuxedo ATMI C関数リファレンス』tpcall(3c)に関する項を参照してください。

tpcall()は、応答を待ちます。

ノート:

tpcall()関数の呼出しは、tpcall()を呼び出した直後にtpgetrply()を呼び出すことと論理的には同じです。「非同期メッセージの送信」を参照してください。

リクエストは、svcで指定されたサービスの優先度で送信されます。ただし、tpsprio()関数の呼出しで明示的に異なる優先度が設定されている場合は除きます。詳細は、「メッセージの優先度の設定および取得」を参照してください。

tpcall()は整数を返します。失敗した場合、この整数値は-1になり、tperrno(5)に、発生したエラーのタイプを表す値が設定されます。有効なエラー・コードの詳細は、『Oracle Tuxedo ATMI C関数リファレンス』tpcall(3c)に関する項を参照してください。

ノート:

通信呼出しは様々な原因で失敗しますが、そのほとんどは、アプリケーション・レベルで修正できます。失敗の原因としては、アプリケーション定義のエラー(TPESVCFAIL)、戻り値の処理エラー(TPESVCERR)、型付きバッファのエラー(TPEITYPETPEOTYPE)、タイムアウト・エラー(TPETIME)、プロトコル・エラー(TPEPROTO)などがあります。エラーの詳細については、「エラーの管理」を参照してください。発生する可能性があるエラーについては、『Oracle Tuxedo ATMI C関数リファレンス』のtpcall()に関する項を参照してください。

Oracle Tuxedoシステムでは、割り当てられているバッファより大きなメッセージを受信した場合、メッセージ受信用バッファのサイズが自動的に変更されます。そのため、応答バッファのサイズが変更されたかどうかを確認する必要があります。

バッファの新しいサイズにアクセスするには、*olenパラメータに返されたアドレスを使用します。応答バッファのサイズが変更されたかどうかを確認するには、tpcall()を呼び出す前の応答バッファのサイズと、返された応答バッファの*olenの値とを比較します。*olenが元の値より大きい場合、バッファのサイズは大きくなっています。それ以外の場合、バッファのサイズは変更されていません。

呼出しの後にodataに戻された値で、出力バッファを参照します。サイズの増加以外に、出力バッファが変更されている場合があるからです。リクエスト・バッファのサイズを確認する必要はありません。リクエスト・データは一度割り当てられると、調整されないからです。

ノート:

リクエスト・メッセージと応答メッセージに同じバッファを使用している場合に、バッファのサイズが変更されたために応答バッファを指すポインタが変更されたときは、入力バッファへのポインタは有効なアドレスを参照しなくなります。