Hitachi

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


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で使う場合の注意事項』

  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通信で会話型サービスの通信を使った場合,システムの動作は保証しません。』