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に設定します。

リターン値リターン値(数値)意味
TPEBADDESC2引数cdが間違った記述子を指しています。
TPEBLOCK3TPNOBLOCKを設定したtpsend()を呼び出したときに,ブロッキング状態になりました。
TPEINVAL4間違った引数が与えられました(例えば,dataはtpalloc()で割り当てたバッファへのポインタではない,flagsに設定した値が間違っている)。
TPEOS7オペレーティングシステムにエラーが起こりました。厳密なエラーの性質は,product-specificな方法で定義されます。
TPEPROTO9tpsend()が間違った状況で呼ばれました。
TPESYSTEM12コミュニケーションリソースマネジャシステムでエラーが起こりました。厳密なエラーの性質は,product-specificな方法で定義されます。
TPETIME13タイムアウトが起こりました。呼び出し側がトランザクションモードの場合,これはトランザクションタイムアウトで,トランザクションはrollback_only状態となります。そうでない場合は,TPNOBLOCKもTPNOTIMEも設定されていない状態で,ブロッキングタイムアウトが起こったことを意味します。どちらの場合も,*dataとその内容は変わっていません。トランザクションタイムアウトが起こった場合は,トランザクションをロールバックするまでは,どのコネクションでのどのような送信,受信の試みも,また新しくコネクションを開始しようとする試みも,TPETIMEでエラーリターンします。
TPEGOTSIG15シグナルは受信されましたが,TPSIGRSTRTが設定されていません。
TPEEVENT22イベントが起こりました。このエラーが起こったときは,dataは送信されません。そのイベントタイプはreventにリターンされます。

関連項目

tpalloc(),tpconnect(),tpdiscon(),tprecv(),tpreturn()

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

  1. 『該当バージョンのOpenTP1では,TPNOBLOCKフラグは無効となります。そのため,TPEBLOCKがリターンすることはありません。OpenTP1では,ブロッキング状態のため通信ができない場合は,ネットワークダウンが原因で通信ができない場合と同様に,TPESYSTEMをリターンする仕様となっています。』
  2. 『該当バージョンのOpenTP1では,TPNOTIMEフラグは無効となります。』
  3. 『TPSIGRSTRTフラグは無効となります。このフラグの有無に関係なく,シグナル受信時には,中断したシステムコールを再び呼びます。TPEGOTSIGがリターンすることはありません。』
  4. 『OpenTP1では,トランザクションタイムアウトが起こったときには,そのプロセスは異常終了します。そのため,TPETIMEがリターンされるのは,ブロッキングタイムアウトの場合だけとなります。』
  5. 『該当バージョンのOpenTP1では,ロールバックする必要があるエラーは,X/Openで特に指定がないかぎり,TPESYSTEMとしています。ただし,TPESYSTEMがリターンしても,rollback_only状態とならない場合もあります。』
  6. 『OpenTP1では,会話の相手がtpdiscon(),tpreturn()を呼び出している場合でも,tpsend()を呼び出すプロセスでイベントを受信していない場合は,tpsend()でイベントを通知できません。』
  7. 『TP1/NET/OSI-TP-Extendedを使ったOSI TP通信をする場合は,会話型サービスの通信はできません。OSI TP通信で会話型サービスの通信を使った場合,システムの動作は保証しません。』