Hitachi

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


tpgetrply

〈このページの構成〉

名称

リクエスト/レスポンス型サービスからの非同期応答の受信

形式

ANSI C,C++の形式

#include <xatmi.h>
int  tpgetrply(int *cd,char **data,long *len,long flags)

K&R版 Cの形式

#include <xatmi.h>
int  tpgetrply(cd,data,len,flags)
int     *cd;
char    **data;
long    *len;
long    flags;

機能

関数tpgetrply()は,先に送信したサービス要求の応答をリターンします。この関数の第1引数のcdは,tpacall()がリターンした記述子へのポインタです。フラグに指定がなければ,この関数は応答が*cdと一致するか,タイムアウトが起こるまで待ちます。

dataは,tpalloc()で事前に割り当てたバッファへのポインタのアドレスを設定してください。lenは必ずlong型を指定してください。これには,tpgetrply()が成功したときに受信したデータ長が設定されます。tpgetrply()は,必要に応じてバッファを確保し直します。成功した場合は,*dataは応答を含むバッファのポインタで,*lenにはデータのサイズが入っています。

Note:*dataは,バッファのサイズが大きくなったことでリターン時に変わることがあります。*lenが以前に呼んだバッファの合計サイズよりも大きかった場合は,新しいバッファのサイズは*lenです。*lenが0の場合は,受信する必要があるデータはなく,*dataやバッファへのポインタは変更されません。*dataやlenがNULLである場合は,エラーになります。

『引数』

『●cd

記述子を設定します。』

『●data

受信したデータを格納するバッファへのポインタのアドレスを設定します。』

『●len

受信したデータの長さを格納する領域のアドレスを設定します。』

『●flags』

flagsには,次に示す値を設定します。

TPGETANY

このフラグは,tpgetrply()がcdで指した記述子を無視して,受信できる何らかの応答をリターンして,返ってきた応答の記述子をcdに設定することを意味します。応答がなくて,このフラグを設定していない場合は,tpgetrply()は応答の到着を待ちます。

TPNOCHANGE

*dataで示されたバッファとは異なるタイプをバッファに受信したとき,このフラグを設定していなければ,*dataのバッファ型は,受け取り側が到着したバッファ型を認識しているかぎり,受信したデータのバッファ型に変換されます。このフラグを設定した場合は,*dataで指しているバッファのタイプは変換されません。つまり,受信したバッファのtypeとsubtypeと,*dataで指しているバッファのtypeとsubtypeは必ず一致させてください。

TPNOBLOCK

tpgetrply()は応答の到着を待ちません。応答がすぐに受信できる状態の場合は,tpgetrply()は応答とリターン値を得ます。このフラグを設定していない場合,tpgetrply()発行時に応答が到着していなければ,呼び出し側は応答が到着するか,またはタイムアウト(トランザクション,またはブロッキングタイムアウト)が起こるまで,ブロッキングしています。

TPNOTIME

呼び出し側を無期限にブロックして,ブロッキングタイムアウトが起こらないことを意味します。トランザクションタイムアウトは起こります。

TPSIGRSTRT

シグナルが実行中のシステムコールを中断したら,中断したシステムコールを再び呼びます。

以下,特に記述しないかぎり,応答を受信したあとは,*cdは無効になります。

リターン値

tpgetrply()が正常リターンするか,またはtperrnoにTPESVCFAILが設定されてリターンしたとき,アプリケーションがtpreturn()の引数として渡した定義値は,グローバル変数tpurcodeとして参照できます。エラー時には,-1をリターンして,tperrnoにエラーの状態を示す値を設定します。

エラー

次のような場合,tpgetrply()はエラーリターンして,次のうちどれか一つの値をtperrnoに設定します。TPGETANYをflagsに設定していない場合,特に述べなければ,*cdは無効になります。TPGETANYをflagsに設定している場合は,*cdはエラーになった応答の記述子を示します。応答が戻ってくる前にエラーが起こった場合は,*cdは0を指します。特に示さないかぎり,呼び出し側がトランザクション下にあった場合でも,失敗は呼び出し側のトランザクションに影響を与えません。

リターン値

リターン値(数値)

意味

TPEBADDESC

2

引数cdが間違った記述子を指しています。

TPEBLOCK

3

TPNOBLOCKを設定していたときに,ブロッキング状態になりました。*cdは有効なままです。

TPEINVAL

4

間違った引数が与えられました(例えば,cd,data,*data,lenがNULL,flagsに設定した値が間違っている)。cdがNULLでない場合は,このエラーのあとも引き続き有効で,応答は解決していない状態のままです。

TPEOS

7

オペレーティングシステムにエラーが起こりました。厳密なエラーの性質は,product-specificな方法で定義されます。

TPEPROTO

9

tpgetrply()が間違った状況で呼ばれました。

TPESVCERR

10

このエラーは,サービス関数を呼び出しているときか,tpreturn()で完了したときに起こります(例えば,適切でない引数を設定した)。このエラーが起こったときは,応答のデータはリターンされません(つまり,*dataも*lenも変更されません)。サービスの応答が呼び出し側のトランザクションとして実行された場合は,トランザクションはrollback_only状態になります。

トランザクションがタイムアウトしないかぎり,それ以降の通信は,ロールバックする前までは実行されます。この処理は正常になるか,または無効になります(エラーリターンまたはイベントが通知されます)。継続する処理を有効にする通信には,TPNOTRANを設定してください。トランザクション機能によって呼び出し側のトランザクションをロールバックする何らかの処理が実行されます。

TPESVCFAIL

11

呼び出し側の応答を送信するサービス関数が,TPFAILを設定したtpreturn()を呼び出しました。これは,アプリケーションレベルの失敗です。送信されたサービスの応答の内容は,*dataで指すバッファとして有効になります。サービス要求が呼び出し側の現在のトランザクションとして実行されている場合は,トランザクションはrollback_only状態となります。

トランザクションがタイムアウトしないかぎり,それ以降の通信は,ロールバックする前までは実行されて,呼び出し側のトランザクションとして実行されたこれらの処理は,トランザクションの完了時にロールバックします。継続する処理を有効にする通信には,TPNOTRANを設定してください。トランザクション機能によって呼び出し側のトランザクションをロールバックする何らかの処理が実行されます。

TPESYSTEM

12

コミュニケーションリソースマネジャシステムでエラーが起こりました。厳密なエラーの性質は,product-specificな方法で定義されます。

TPETIME

13

タイムアウトが起こりました。呼び出し側がトランザクションモードの場合,これはトランザクションタイムアウトで,トランザクションはrollback_only状態となります。そうでない場合は,TPNOBLOCKもTPNOTIMEも設定されていない状態で,ブロッキングタイムアウトが起こったことを意味します。呼び出し側がトランザクションモードでないかぎり(そして,TPGETANYが設定されていないかぎり),引数*cdは有効です。どちらの場合も,*dataも*lenも変わっていません。トランザクションタイムアウトが起こった場合は,トランザクションをロールバックするまでは,新しく送信しようとしていた送信や,解決していない応答は,TPETIMEでエラーリターンします。

TPEGOTSIG

15

シグナルは受信されましたが,TPSIGRSTRTが設定されていません。

TPEOTYPE

18

応答のtypeとsubtypeを,呼び出し側で認識できません。または,TPNOCHANGEのフラグが設定されているのに,*dataで指しているバッファのtypeとsubtypeが,サービスから送信されてきた応答のバッファのtypeとsubtypeに一致していません。このエラーが起こった場合,*dataも*lenも変わっていません。呼び出し側のトランザクションとしてサービス要求が実行されている場合,応答は捨てられて,トランザクションはrollback_only状態となります。

関連項目

tpacall(),tpalloc(),tpreturn()

『OpenTP1で使う場合の注意事項』

  1. 『TPSIGRSTRTフラグは無効となります。このフラグの有無に関係なく,シグナル受信時には,中断したシステムコールを再び呼びます。TPEGOTSIGがリターンすることはありません。』

  2. 『OpenTP1では,トランザクションタイムアウトが起こったときには,そのプロセスは異常終了します。そのため,TPETIMEがリターンされるのは,ブロッキングタイムアウトの場合だけとなります。』

  3. 『該当バージョンのOpenTP1では,ロールバックする必要があるデータは,X/Openで特に指定がないかぎり,TPESYSTEMとしています。ただし,TPESYSTEMがリターンしても,rollback_only状態とならない場合もあります。』

  4. 『tpacall()で,呼び出したサービスが使えないタイプのデータをサービスに渡していた場合,tpacall()は正常に終了して,tpgetrply()でエラーとなります。tpgetrply()でTPESYSTEMのエラーが起こった場合は,tpacall()の実行結果も確認してください。』

  5. 『サービス要求先のSPPが異常終了した場合,定義のwatch_timeオペランドに指定した時間よりも早く,TPETIMEでエラーリターンする場合があります。また,watch_timeオペランドに0(応答を受信するまで無限に待つ)を指定しているときは,TPEPROTOでエラーリターンする場合があります。』

  6. 『OpenTP1のセキュリティ機能を使っている場合で,サービス要求が認証されなかったときは,TPEPROTOでエラーリターンします。サービス要求が認証されなかったことが原因かどうかは,UAPトレースの詳細エラーコードで確認してください。』

  7. 『TP1/NET/OSI-TP-Extendedを使ったOSI TP通信をする場合,受信するデータの長さはNET/Library共通定義のNETバッファグループ定義nettbufにあるlengthオペランドに指定した値を超えないようにしてください。』

  8. 『TP1間でOSI TP通信を行う場合で,atomic_updateオペランドが'N'のサービスをトランザクションとして呼ばれる場合,サービス要求元には,TPESVCERRが返ります。』

  9. 『TCP/IP通信で呼び出されたサービスから,さらにOSI TP通信でサービスを呼び出し,応答を受け取らないでサービス関数を終了した場合,TCP/IP通信でサービスを呼び出したUAPには正常な応答電文が返り,tpcall(),tpgetrply()はエラーリターンしません。』

  10. 『OSI TP通信をするXATMIのエラーは,従来のTCP/IPとエラー動作が異なる場合があります。』