tpsend
形式
ANSI C,C++の形式
#include <xatmi.h> int tpsend(int cd,char *data,long len,long flags,long *revent)
K&R版 Cの形式
#include <xatmi.h> int tpsend(cd,data,len,flags,revent) int cd; char *data; long len; long flags; long *revent;
機能
関数tpsend()は,オープンコネクションをわたって,ほかのプログラムへデータを送信するために使います。呼び出し側は,コネクションの制御権がなくてはなりません。
この関数の第1引数のcdは,データを送信するオープンコネクションを示します。cdは,tpconnect()のリターン値か,会話型サービスに渡されたパラメタ TPSVCINFOで示される記述子です。第2引数のdataは,tpalloc()で事前に割り当てられたバッファへのポインタです。lenにはバッファをどれだけ送信したいかを示します。
- 注
-
dataが大きさを指定する必要がないバッファへのポインタであれば,lenは無視されます(0にしてください)。長さが必要なバッファ型をdataが指す場合は,lenには0を設定しないでください。また,dataはNULLにすることもできます。その場合も,lenは無視されます(アプリケーションデータは送信されません。このような使い方をするのは,例えば,データを送信しないで,コネクションの制御を渡したい場合などです)。dataのtypeとsubtypeは,コネクションの他端点に認識されたtypeとsubtypeの一つに一致させてください。
『引数』
『●cd
記述子を設定します。』
『●data
送信するデータが格納されたバッファへのポインタを設定します。』
『●len
バッファの長さを設定します。』
『●flags
フラグを示します。』
『●revent
イベントを示すlong型へのポインタを示します。』
flagsには,次に示す値を設定します。
- TPRECVONLY
-
このフラグは,呼び出し側のデータが送信されたあと,呼び出し側は,コネクションの制御を放棄することを意味します(つまり,呼び出し側は,これ以上tpsend()を呼び出せません)。コネクションの他端点である受信側が,tpsend()から送信されてきたこのデータを受信したとき,コネクションの制御を示すイベント(TPEV_SENDONLY)も受信します(これ以上,tprecv()の呼び出しができません)。
- TPNOBLOCK
-
ブロッキング状態の場合(例えば,送信されたメッセージで内部バッファが満杯),データやイベントは送信されません。TPNOBLOCKが設定されていないで,ブロッキング状態のときは,呼び出し側は状況が収まるか,タイムアウト(トランザクション,またはブロッキングタイムアウト)が起こるまで,ブロッキングしています。
- TPNOTIME
-
呼び出し側を無期限にブロックして,ブロッキングタイムアウトが起こらないことを意味します。トランザクションタイムアウトは起こります。
- TPSIGRSTRT
-
シグナルが実行中のシステムコールを中断したら,中断したシステムコールを再び呼びます。
イベント
記述子cdにイベントが存在した場合は,tpsend()は,呼び出し側のデータを送信しないで失敗します。reventにイベントタイプがリターンされます。tpsend()で有効なイベントは次のとおりです。
- TPEV_DISCONIMM
-
会話のサブオーディネータに受信されるこのイベントは,会話のオリジネータがtpdiscon()を使ってコネクションをすぐに切断したか,コネクションをオープンしたままでtpreturn(),tx_commit(),またはtx_rollback()を呼び出したことを表します。また,このイベントは,通信エラーのためにコネクションが切断された場合(例えば,サーバ,マシン,ネットワークがダウンしたとき),オリジネータ,またはサブオーディネータにリターンされます。
- TPEV_SVCERR
-
会話のオリジネータに受信されるこのイベントは,会話のサブオーディネータが通信の制御権がない状態でtpreturn()を発行していることを表します。tpreturn()は,次に説明するTPEV_SVCFAILとは異なった方法で使われます。
- TPEV_SVCFAIL
-
会話のオリジネータで受信されるこのイベントは,会話の他端点上のサブオーディネータが通信の制御権がない状態でtpreturn()を呼び出したことを示します。さらに,tpreturn()はTPFAILとdataなしで呼び出されました(つまり,rvalはTPFAILを設定されて,dataにはNULLが入っています)。
これらのイベントは,コネクションがすぐに切断されたことを示します(正常終了ではなく異常終了として)。そのため,送信中のデータは失われます。このコネクションに使われている記述子は,無効になります。二つのプログラムが,同じトランザクションにある場合は,そのトランザクションはrollback_only状態になります。
リターン値
エラー時には,tpsend()は-1をリターンして,tperrnoにエラーの状態を示す値を設定します。tpsend()がリターンしてreventにTPEV_SVCFAILが設定される場合,tpurcode外部変数には,tpreturn()の一部でアプリケーションが定義した値を含みます。
エラー
次のような場合,tpsend()はエラーリターンして,次のうちどれか一つの値をtperrnoに設定します。
リターン値 |
リターン値(数値) |
意味 |
---|---|---|
TPEBADDESC |
2 |
引数cdが間違った記述子を指しています。 |
TPEBLOCK |
3 |
TPNOBLOCKを設定したtpsend()を呼び出したときに,ブロッキング状態になりました。 |
TPEINVAL |
4 |
間違った引数が与えられました(例えば,dataはtpalloc()で割り当てたバッファへのポインタではない,flagsに設定した値が間違っている)。 |
TPEOS |
7 |
オペレーティングシステムにエラーが起こりました。厳密なエラーの性質は,product-specificな方法で定義されます。 |
TPEPROTO |
9 |
tpsend()が間違った状況で呼ばれました。 |
TPESYSTEM |
12 |
コミュニケーションリソースマネジャシステムでエラーが起こりました。厳密なエラーの性質は,product-specificな方法で定義されます。 |
TPETIME |
13 |
タイムアウトが起こりました。呼び出し側がトランザクションモードの場合,これはトランザクションタイムアウトで,トランザクションはrollback_only状態となります。そうでない場合は,TPNOBLOCKもTPNOTIMEも設定されていない状態で,ブロッキングタイムアウトが起こったことを意味します。どちらの場合も,*dataとその内容は変わっていません。トランザクションタイムアウトが起こった場合は,トランザクションをロールバックするまでは,どのコネクションでのどのような送信,受信の試みも,また新しくコネクションを開始しようとする試みも,TPETIMEでエラーリターンします。 |
TPEGOTSIG |
15 |
シグナルは受信されましたが,TPSIGRSTRTが設定されていません。 |
TPEEVENT |
22 |
イベントが起こりました。このエラーが起こったときは,dataは送信されません。そのイベントタイプはreventにリターンされます。 |
関連項目
tpalloc(),tpconnect(),tpdiscon(),tprecv(),tpreturn()
『OpenTP1で使う場合の注意事項』
-
『該当バージョンのOpenTP1では,TPNOBLOCKフラグは無効となります。そのため,TPEBLOCKがリターンすることはありません。OpenTP1では,ブロッキング状態のため通信ができない場合は,ネットワークダウンが原因で通信ができない場合と同様に,TPESYSTEMをリターンする仕様となっています。』
-
『該当バージョンのOpenTP1では,TPNOTIMEフラグは無効となります。』
-
『TPSIGRSTRTフラグは無効となります。このフラグの有無に関係なく,シグナル受信時には,中断したシステムコールを再び呼びます。TPEGOTSIGがリターンすることはありません。』
-
『OpenTP1では,トランザクションタイムアウトが起こったときには,そのプロセスは異常終了します。そのため,TPETIMEがリターンされるのは,ブロッキングタイムアウトの場合だけとなります。』
-
『該当バージョンのOpenTP1では,ロールバックする必要があるエラーは,X/Openで特に指定がないかぎり,TPESYSTEMとしています。ただし,TPESYSTEMがリターンしても,rollback_only状態とならない場合もあります。』
-
『OpenTP1では,会話の相手がtpdiscon(),tpreturn()を呼び出している場合でも,tpsend()を呼び出すプロセスでイベントを受信していない場合は,tpsend()でイベントを通知できません。』
-
『TP1/NET/OSI-TP-Extendedを使ったOSI TP通信をする場合は,会話型サービスの通信はできません。OSI TP通信で会話型サービスの通信を使った場合,システムの動作は保証しません。』