Hitachi

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


tprecv

〈このページの構成〉

名称

会話型サービスからのメッセージの受信

形式

ANSI C,C++の形式

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

K&R版 Cの形式

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

機能

関数tprecv()は,ほかのプログラムからオープンコネクションをわたって送信されてきたデータを受信するために使います。tprecv()の第1引数のcdには,データを受信するためのオープンコネクションを設定します。cdは,tpconnect()のリターン値かサービスのパラメタTPSVCINFOで示される記述子です。第2引数のdataは,tpalloc()で事前に割り当てられたバッファへのポインタのアドレスです。

成功した場合,幾つかのイベントタイプでは,*dataは,受信したデータへのポインタ,*lenは受信データバッファのサイズを示します。

Note:*lenが呼び出し前のバッファの合計サイズよりも大きかった場合は,新しいバッファのサイズが*lenです。*lenが0の場合は,受信したデータはなくて,*dataやそれが指すバッファは変わりません。data,*data,およびlenがNULLである場合は,エラーとなります。

tprecv()は,コネクションの制御権を持たないプログラムでだけ呼び出せます。

『引数』

『●cd

記述子を設定します。』

『●data

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

『●len

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

『●flags

フラグを示します。』

『●revent

イベントを示すlong型へのポインタを示します。』

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

TPNOCHANGE

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

TPNOBLOCK

tprecv()はデータの到着を待ちません。データがすでに受信できる状態の場合は,tprecv()はデータを受信してリターンします。このフラグを設定しないで,データが使えない状態の場合は,呼び出し側はデータが到着するまでブロックします。

TPNOTIME

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

TPSIGRSTRT

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

イベント

記述子cdにイベントが存在して,tprecv()がエラーにならなかった場合は,reventにイベントタイプがリターンされます。dataはイベントのTPEV_SVCSUCC,TPEV_SVCFAIL,TPEV_SENDONLYと一緒に受信できます。tprecv()で有効なイベントは次のとおりです。

TPEV_DISCONIMM

会話のサブオーディネータに受信されるこのイベントは,会話のオリジネータがtpdiscon()を呼び出してコネクションをすぐに切断したか,コネクションをオープンしたままでtpreturn(),tx_commit(),またはtx_rollback()を呼び出したことを表します。また,このイベントは,通信エラーのためにコネクションが切断された場合(例えば,サーバ,マシン,ネットワークがダウンしたとき),オリジネータ,またはサブオーディネータにリターンされます。コネクションの切断はすぐに通知されるので(正常終了ではなく異常終了として),転送中のデータは捨てられます。二つのプログラムが同じトランザクションに参加している場合は,トランザクションはrollback_only状態になります。このコネクションに使われている記述子は,無効になります。

TPEV_SENDONLY

コネクションの他端点のプログラムは,コネクションの制御権を放棄しています。このイベントの受け取り側はデータの送信が許可されていますが,制御権を放棄するまではデータを受信できません。

TPEV_SVCERR

会話のオリジネータに受信されるこのイベントは,会話のサブオーディネータがtpreturn()を呼び出していることを示します。tpreturn()は,サービスが成功してリターンすることを妨げるエラーに遭遇しました。例えば,tpreturn()に間違った引数が渡されていたり,サービスがほかのサブオーディネータのためにコネクションをオープンしている間に,tpreturn()が呼ばれたりした場合です。このイベントの性質のために,アプリケーションで定義されたデータやリターン値は役に立ちません。このコネクションは切断されて,cdは無効になります。このイベントが受け取り側のトランザクションの一部で起こった場合は,トランザクションはrollback_only状態となります。

TPEV_SVCFAIL

会話のオリジネータで受信されるこのイベントは,会話の他端点上のサブオーディネータのサービスがアプリケーションで指定されて,不成功に終了した(つまり,tpreturn()がTPFAILで呼ばれた)ことを示します。tpreturn()が呼ばれたとき,サブオーディネータのサービスがこのコネクションを制御する場合は,サービスは会話のオリジネータへ型付きバッファを渡せます。サービス関数の終了の部分で,サーバはコネクションを切断します。よって,cdは無効になります。このイベントが受け取り側のトランザクションの一部で起こった場合は,トランザクションはrollback_only状態となります。

TPEV_SVCSUCC

会話のオリジネータで受信されるこのイベントは,会話の他端点上のサブオーディネータのサービスがアプリケーションで指定されて,成功して終了した(つまり,tpreturn()がTPSUCCESSで呼ばれた)ことを示します。サービス関数の終了の部分で,サーバはコネクションを切断します。よって,cdは無効になります。このイベントが受け取り側のトランザクションの一部で起こった場合は,コミットまたはロールバックするために,サーバ(もまた,トランザクションモードの場合)によってなされた処理を引き起こしたトランザクションのコミット(受け取り側が(トランザクションを)開始した場合)や,ロールバックのどちらかを実行できます。

リターン値

tprecv()が,reventにTPEV_SVCSUCCか,TPEV_SVCFAILを設定してリターンした場合,アプリケーションがtpreturn()の引数として渡した定義値は,グローバル変数tpurcodeとして参照できます。エラー時には,tprecv()は-1をリターンして,

tperrnoにエラーの状態を示す値を設定します。イベントが通知されたときにエラーが起こっていなければ,tprecv()は-1をリターンして,tperrnoにTPEEVENTが設定されています。

エラー

次のような場合,tprecv()はエラーリターンして,次のうちどれか一つの値をtperrnoに設定します。

リターン値

リターン値(数値)

意味

TPEBADDESC

2

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

TPEBLOCK

3

TPNOBLOCKを設定したtprecv()を呼び出したときに,ブロッキング状態になりました。

TPEINVAL

4

間違った引数が与えられました(例えば,dataはtpalloc()で割り当てたバッファへのポインタではない,flagsに設定した値が間違っている)。

TPEOS

7

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

TPEPROTO

9

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

TPESYSTEM

12

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

TPETIME

13

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

TPEGOTSIG

15

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

TPEOTYPE

18

到着したバッファのtypeとsubtypeを,呼び出し側で認識していません。または,flagsにTPNOCHANGEを設定しているのに,*dataのtypeとsubtypeが送信されてきたバッファのtypeとsubtypeに一致していません。どちらの場合も,*dataも*lenも変更されません。呼び出し側のトランザクションとして会話型サービスが実行されている場合は,到着したバッファを捨てるまで,トランザクションはrollback_only状態となります。このエラーが起こった場合,cdに該当するイベントは捨てられて,会話型通信は未決着な状態になります。呼び出し側は,すぐに会話型通信を終了させてください。

TPEEVENT

22

あるイベントが起こって,そのタイプはreventにリターンされます。

関連項目

tpalloc(),tpconnect(),tpdiscon(),tpsend()

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

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

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

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

  4. 『TP1/NET/OSI-TP-Extendedを使ったOSI TP通信をする場合は,会話型サービスの通信はできません。OSI TP通信で会話型サービスの通信を使った場合,システムの動作は保証しません。』