4.8.6 tprecv − 会話型サービスからのメッセージの受信
- 〈この項の構成〉
(1) 形式
(a) TP1/Client/Wの場合
#include <dcvxatmi.h> int tprecv(DCLONG cd, char *CLTFAR *data, DCLONG CLTFAR *len, DCLONG flags, DCLONG CLTFAR *revent)
(b) TP1/Client/Pの場合
#include <dcvxatmi.h> int tprecv(DCLONG cd, char CLTFAR *CLTFAR *data, DCLONG CLTFAR *len, DCLONG flags, DCLONG CLTFAR *revent)
(2) 機能
会話型サービスから送信されたデータを受信します。
tprecv関数は,コネクションの制御権を持たない側から発行できます。
tprecv関数が,reventにTPEV_SVCSUCCか,TPEV_SVCFAILを指定してリターンした場合,アプリケーションがtpreturn関数の引数として渡した値は,グローバル変数tpurcodeとして参照できます。
(3) UAPで値を設定する引数
-
cd
データを受信するときのコネクションを指定します。tpconnect関数のリターン値で示された記述子を指定してください。
-
data
受信したデータを格納する型付きバッファへのポインタを指定します。
NULLを指定した場合は,エラーになります。
-
len
受信したデータの長さを指定します。受信データの最大長は500×1,024バイトです。
指定した値が,tprecv関数発行前でのバッファの合計の長さより大きい場合,新しい指定値がlenに指定されます。受信データがない場合は,0が指定されます。
-
flags
次に示す値を指定します。
- TPNOCHANGE
-
dataで指定されているバッファの型は変換されません。
受信したデータのバッファの型と,dataで指定されたバッファの型とを必ず一致させます。TPNOCHANGEを指定していない場合,dataの値は,受信したデータのバッファの型に変換されます。
- TPNOBLOCK
-
tprecv関数はデータの到着を待ちません。
データがすでに受信できる状態の場合は,tprecv関数はデータを受信してリターンします。TPNOBLOCKを指定しないで,データが受信できない状態の場合は,関数を発行する側はデータが到着するまでブロッキングします。
- TPNOTIME
-
関数を発行する側を無期限にブロッキングします。
ブロッキングタイムアウトは発生しません。ただし,トランザクションタイムアウトは発生します。
- TPSIGRSTRT
-
シグナルが実行中のシステムコールを中断した場合,中断したシステムコールを再び呼び出します。
-
revent
イベントを格納する型付きバッファへのポインタを指定します。
cdにイベントがある場合は,reventにイベントの種類が返されます。dataに指定した値はイベントのTPEV_SVCSUCC,TPEV_SVCFAIL,TPEV_SENDONLYと一緒に受信できます。
tprecv関数では次に示すイベントを指定できます。
- TPEV_DISCONIMM
-
会話型サービスを開始した側が,tpdiscon関数を呼び出してコネクションをすぐに切断しました。または,通信エラーによってコネクションが切断されました。
tpdiscon関数の発行でコネクションが切断した場合,サービスを開始された側にTPEV_DISCONIMMが返されます。
通信エラーによるコネクション切断で,サーバ,マシン,およびネットワークがダウンした場合は,サービスを開始した側と開始された側の両方にTPEV_DISCONIMMが返されます。
コネクション切断時はTPEV_DISCONIMMはすぐに通知され,転送中のデータは捨てられます。トランザクションはロールバックされます。このとき,コネクションに使われている記述子は無効になります。
- TPEV_SENDONLY
-
コネクションのほかの端点にあるシステムは,コネクションの制御権を放棄しています。TPEV_SENDONLYを受信した側は,データを送信できますが,制御権を放棄するまではデータを受信できません。
- TPEV_SVCERR
-
サービスを開始された側が,tpreturn関数を発行しています。tpreturn関数は,処理中に次のようなエラーが発生しました。
・tpreturn関数に間違った引数が渡されていた
・サービスがコネクションをオープンしている間に,tpreturn関数が発行された
TPEV_SVCERRが返されたときは,アプリケーションで定義されたデータやリターン値は動作に影響しません。コネクションは切断され,cdの値は無効になります。TPEV_SVCERRがデータを受信する側のトランザクション内で発生した場合は,トランザクションはロールバックされます。
- TPEV_SVCFAIL
-
サービスのほかの端点にある,開始された側のサービスが,アプリケーションで指定されて,完了しないで終了(tpreturn関数のリターン値がTPFAIL)しました。TPEV_SVCFAILは,開始した側に返されます。
tpreturn関数発行時,開始された側のサービスがこのコネクションを制御する場合は,サービスは開始した側へ型付きバッファを渡すことができます。
tprecv関数終了時,サーバはコネクションを切断します。その場合,cdの値は無効になります。TPEV_SVCFAILがデータを受信する側のトランザクション内で発生した場合は,トランザクションはロールバックします。
- TPEV_SVCSUCC
-
サービスのほかの端点にある,開始された側のサービスが,アプリケーションで指定されて,完了して終了(tpreturn関数のリターン値がTPSUCCESS)しました。TPEV_SVCSUCCは,開始した側に返されます。
tprecv関数終了時,サーバはコネクションを切断します。その場合,cdの値は無効になります。TPEV_SVCSUCCがデータを受信する側のトランザクション内で発生した場合は,トランザクションはコミットまたはロールバックします。このときサーバ側は,処理が発生したトランザクションをコミットまたはロールバックできます。どちらを実行するかは,トランザクションモードによって異なります。
(4) リターン値
エラー時には,tprecv関数は-1をリターンし,リターン値としてエラー情報を示す次のどれか一つの値を,tperrnoに設定します。
リターン値 |
意味 |
---|---|
TPEINVAL |
引数に誤りがあります。 |
TPEBADDESC |
cdで,誤った記述子を指定しています。 |
TPEOTYPE |
到着したバッファの型を,tprecv関数を呼び出した側で認識していません。または,flagsにTPNOCHANGEを指定しているのに,dataに指定したバッファの型が送信されてきたバッファの型と一致していません。 上記のどちらの場合もdataおよびlenの値は変更されません。tprecv関数を呼び出した側のトランザクションとしてサービスが実行されている場合は,到着したバッファを捨てるまで,トランザクションはロールバックします。 上記のエラー発生時,指定されたイベントは捨てられ,サービスの処理結果は未決着になります。発行側では,すぐにサービスを終了してください。 |
TPETIME |
タイムアウトが発生しました。
上記のどちらの場合も,dataに指定した値は変更されません。 |
TPEEVENT |
イベントが発生しました。リターン値はreventに返されます。 |
TPEBLOCK |
TPNOBLOCKを指定したtprecv関数を呼び出したときに,ブロッキング状態になりました。 |
TPGOTSIG |
シグナルは受信されましたが,TPSIGRSTRTを指定していません。 |
TPEPROTO |
tpdiscon関数を呼び出したときの状態が適切ではありません。 |
TPESYSTEM |
コミュニケーションリソースマネジャでエラーが発生しました。 |
TPEOS |
オペレーティングシステムでエラーが発生しました。 |
(5) 注意事項
-
シグナル受信時には,処理を中断してシステムコールを再び呼び出します。TPGOTSIGはリターンされません。TPSIGRSTRTが指定されているかどうかは,システムコールの呼び出しには影響しません。
-
OpenTP1では,トランザクションタイムアウトが発生した場合には,該当するプロセスは異常終了します。TPETIMEは,ブロッキングタイムアウトが発生した場合だけ返されます。
-
OpenTP1では,X/Openで指定されていない場合,トランザクションをロールバックする必要があるエラーはTPESYSTEMです。ただし,TPESYSTEMが返されても,ロールバックされない場合があります。
-
TP1/NET/OSI-TP-Extendedを使用したOSI TP通信をする場合は,会話型サービスは使用できません。OSI TP通信で会話型サービスを使った場合,システムの動作は保証しません。
-
TP1/Clientでは,トランザクションタイムアウトが発生した場合,CUP実行プロセスは異常終了します。それ以前に確立されていたすべてのコネクションは切断されます。また,TPETIMEがリターンされるのは,ブロッキングタイムアウトの場合だけです。
-
TP1/Clientに対してtpconnect関数を呼び出すことはできません。cdにはtpconnect関数がリターンした記述子だけ指定できます。
-
TPESYSTEMが返されたとき,TP1/Clientで発生した障害の場合,エラー情報がエラーログに出力されます。
-
リターン値としてTPEOSが返されたとき,メモリ不足が原因の場合があります。TP1/Clientで発生した障害の場合,エラー情報がエラーログに出力されます。