bea ホーム | 製品 | dev2dev | support | askBEA
BEA Logo Tuxedo
 ドキュメントのダウンロード   サイトマップ   用語集 
検索
0

Tuxedo C リファレンス

 Previous Next Contents View as PDF  

tprecv(3c)

名前

tprecv()−会話型接続でメッセージを受信するルーチン

形式

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

機能説明

tprecv() は、別のプログラムからオープン接続を介してデータを受け取るときに使用します。tprecv() の最初の引数 cd は、データを受け取るオープン接続を指定します。cd には、tpconnect() から返される記述子、あるいは会話型サービスに渡される TPSVCINFO パラメータに含まれる記述子のいずれかを指定します。2 番目の引数 data は、tpalloc() によって以前に割り当てられたバッファを指すポインタのアドレスです。

data は、前に tpalloc() が割り当てたバッファへのポインタのアドレスでなければなりません。また、len は long 型 (tprecv() が受信したデータのサイズに設定した) を指さなければなりません。*data は応答を含んでいるバッファを指し、*len は、バッファのサイズを含みます。FMLFML32 バッファは、通常最小サイズ 4096 バイトを確保します。したがって、応答が 4096 バイトより大きい場合は、バッファ・サイズは返されるデータを入れるのに十分な大きさに拡大します。

容量まで満たされていない送信側のバッファ (たとえば、FML および STRING バッファ) は、送信に使用された大きさになります。システムは、受信データのサイズを任意の量で拡大します。これは、受信者が送信者の割り当てたバッファ・サイズより小さく、送信されたデータのサイズより大きいバッファを受け取ることを意味します。

受信バッファのサイズは、増加することも減少することもあります。また、アドレスもシステムがバッファを内部で交換するごとに常に変更されます。応答バッファのサイズが変わったどうか (また変わったとしたらどれくらい変わったのか) を決定するには、tprecv()*len とともに発行される前に、合計サイズを比べてください。バッファ管理の詳細については、C 言語アプリケーション・トランザクション・モニタ・インターフェイスについてを参照してください。

*len が 0 の場合、データは受け取られず、*data も、それが指すバッファも、変更されていません。data*data または len が NULL であると、エラーになります。

tprecv() は、接続の制御をもたないプログラムしか出せません。

次に、有効な flags の一覧を示します。

TPNOCHANGE

デフォルトでは、*data が指すバッファ型と異なるバッファ型を受信すると、*data のバッファ型は受信したバッファ型に変更されます (受信プロセスがそのバッファ型を認識できる場合)。このフラグが設定されていると、*data が指すバッファのタイプは変更されません。つまり、受信されたバッファのタイプおよびサブタイプは、それぞれ *data が指すバッファのタイプおよびサブタイプと一致しなければなりません。

TPNOBLOCK

tprecv() はデータが到着するまで待機しません。すでにデータが受信できる状態であると、tprecv() はデータを取り込んで終了します。このフラグが設定されておらず、かつ受信できるデータがない場合、呼び出し元はデータが到着するまでブロックされます。

TPNOTIME

このフラグは、呼び出し元が無制限にブロックでき、ブロッキング・タイムアウトの対象にならないようにすることを指定します。ただし、トランザクション・タイムアウトはあいかわらず有効です。

TPSIGRSTRT

シグナルが関数内部の受信システム・コールを中断させると、呼び出しが再度出されます。

記述子 cd に対してイベントが存在すると、tprecv() は終了し、tperrnoTPEEVENT に設定します。イベントのタイプが revent で返されます。TPEV_SVCSUCCTPEV_SVCFAIL および TPEV_SENDONLY イベントとともに、データを受け取ることができます。tprecv() の有効なイベントを次に示します。

TPEV_DISCONIMM

会話の従属側が受け取るこのイベントは、その会話の起動元が tpdiscon() により即時切断要求を出したこと、あるいは接続をオープンにしたままで tpreturn()tpcommit()、または tpabort() を出したことを示します。このイベントは、通信エラー (サーバ、マシン、ネットワークの障害など) により接続が切断されたときにも起動元またはその従属側に返されます。これは即時切断通知 (つまり、正常ではなくアボート) であるため、処理途中のデータは失われます。2 つのプログラムが同じトランザクションに参加していた場合、そのトランザクションは「アボートのみ」のマークが付けられます。この接続に使用された記述子は無効になります。

TPEV_SENDONLY

接続の他方の側にあるプログラムは、接続の制御を放棄しました。このイベントの受信側はデータを送信することはできますが、制御を放棄するまではデータを受信することはできません。

TPEV_SVCERR

このイベントは、会話の起動元が受け取るもので、会話の従属側が tpreturn() を出したことを示します。tpreturn() に、サービスが正しく応答を返すことができないようなエラーが発生しています。たとえば、不正な引数が tpreturn() に渡されていたり、tpreturn() が、そのサービスが別の従属側にオープン接続を持っている最中に呼び出されている可能性があります。このイベントの性質上、アプリケーションが定義したデータや戻りコードは返されません。この接続は切断され、記述子は無効になります。このイベントが受信側のトランザクションの一部として発生した場合は、トランザクションには「アボートのみ」のマークが付けられます。

TPEV_SVCFAIL

このイベントは、接続の起動元が受け取るもので、会話の他方の側の従属サービスが、アプリケーションで定義されているように正常に終了しなかったことを示します (つまり、TPFAIL または TPEXIT とともに tpreturn() が呼び出されています)。従属サービスは、tpreturn() が呼び出されたときにこの接続の制御下にあった場合は、アプリケーション定義の戻りコードおよび型付きバッファを接続の要求元に返すことができます。サービス・ルーチンの終了処理の一部として、サーバはこの接続を切断しています。このため、cd は無効な記述子となります。このイベントが、受信側のトランザクションの一部として発生すると、そのトランザクションに中途終了マークが付けられます。

TPEV_SVCSUCC

このイベントは、会話の起動元が受け取るもので、接続の他方の側の従属サービスがアプリケーションで定義されているように正常に終了したことを示します (すなわち、TPSUCCESS とともに tpreturn() が呼び出されています)。サービス・ルーチンの終了処理の一部として、サーバはこの接続を切断しています。このため、cd は無効な記述子となります。受信側がトランザクション・モードである場合、そのトランザクションをコミット (それが起動元でもある場合) するか、アボートして、サーバ (トランザクション・モードである場合) が行った作業内容をコミットあるいはアボートさせます。

マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tprecv() の呼び出しを発行できません。

戻り値

reventTPEV_SVCSUCC または TPEV_SVCFAIL のどちらかに設定されている場合に、tprecv() が終了した場合は、グローバル変数 tpurcode には、tpreturn() の一部として送信されるアプリケーション定義の値が含まれます。

異常終了すると、tpcrecv() は -1 を返し、tperrno を設定してエラーの条件を示します。呼び出しが異常終了して tperrno に特定の値が設定されたときは、中間の ATMI 呼び出しを省略して引き続き tperrordetail() を呼び出すと、エラーに関する詳細な情報が提供されます。詳細については、tperrordetail(3c) リファレンス・ページを参照してください。

エラー

異常終了時には、tprecv()tperrno を次のいずれかの値に設定します。

[TPEINVAL]

無効な引数が与えられました (たとえば、data が tpalloc() によって割り当てられたバッファを指すポインタのアドレスでない、あるいは flags が無効である場合など)。

[TPEOTYPE]

受け取るバッファのタイプおよびサブタイプのどちらも呼び出し元に通知されていません。または TPNOCHANGEflags に設定されていて、*data のタイプおよびサブタイプが受け取るバッファのタイプおよびサブタイプと合っていません。*data の内容も *len も変更されていません。会話が呼び出し元の現在のトランザクションの一部になっている場合は、受け取るバッファが放棄されるため、トランザクションには「アボートのみ」のマークが付けられます。

[TPEBADDESC]

cd が無効です。

[TPETIME]

このエラー・コードは、タイムアウトが発生したか、または現在のトランザクションがすでに「ロールバックのみ」とマークされているにもかかわらず tprecv() が試行されたことを示します。

呼び出し元がトランザクション・モードにある場合、トランザクションはすでに「ロールバックのみ」になっているか、またはタイムアウトが発生しています (中途終了マークが付けられる)。呼び出し元がトランザクション・モードにない場合、ブロッキング・タイムアウトが発生しています。ブロッキング・タイムアウトは、TPNOBLOCK または TPNOTIME、あるいはその両方を指定した場合は発生しません。いずれの場合でも、*data もその内容も変更されません。

トランザクション・タイムアウトが発生すると、1 つの例外を除き、トランザクションがアボートされない限り、新しいリクエストを送信したり、未処理の応答を受信しようとしても、TPETIME で異常終了します。1 つの例外とは、ブロックされず、応答を期待せず、かつ呼び出し元のトランザクションのために送信されない (つまり、TPNOTRANTPNOBLOCK および TPNOREPLY が設定された状態で tpacall() が呼び出される場合) 要求です。

ATMI 呼び出しがトランザクション内部で失敗すると、そのトランザクションは TX_ROLLBACK_ONLY 状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。

[TPEEVENT]

イベントが発生し、そのタイプが revent に記録されます。[TPETIME] と、[TPEEVENT] リターン・コードには関連があります。トランザクション・モードにおいては、会話の受信側が tprecv にブロックされていて、送信側が tpabort() を出した場合、受信側は [TPEVENT] リターン・コードを TPEV_DISCONIMM のイベントと共に取得します。ただし、受信側が tprecv() を呼び出す前に、送信側が tpabort() を出した場合は、そのトランザクションはすでに GTT から削除されてしまっているので、tprecv() は異常終了し、[TPETIME] コードが返されます。

[TPEBLOCK]

ブロッキング状態のため、TPNOBLOCK が指定されました。

[TPGOTSIG]

シグナルを受け取りましたが、TPSIGRSTRT が指定されていません。

[TPEPROTO]

tprecv() が不正なコンテキストで呼び出されました (たとえば、呼び出しプログラムがデータの送信のみを行えるよう接続が確立されている場合など)。

[TPESYSTEM]

BEA Tuxedo システムのエラーが発生しました。エラーの正確な内容がログ・ファイルに書き込まれます。

[TPEOS]

オペレーティング・システムのエラーが発生しました。

使用法

サーバは、tpreturn() を呼び出すとき、アプリケーション定義の戻りコードおよび型付きバッファを渡すことができます。戻りコードはグローバル変数 tpurcode で使用され、バッファは data で使用されます。

関連項目

tpalloc(3c)tpconnect(3c)tpdiscon(3c)tperrordetail(3c)tpsend(3c)tpservice(3c)tpstrerrordetail(3c)

 

Back to Top Previous Next
Contact e-docsContact BEAwebmasterprivacy