4.8.5 tpsend − 会話型サービスへのメッセージの送信
- 〈この項の構成〉
(1) 形式
(a) TP1/Client/Wの場合
#include <dcvxatmi.h> int tpsend(DCLONG cd, char *data, DCLONG len, DCLONG flags, DCLONG *revent)
(b) TP1/Client/Pの場合
#include <dcvxatmi.h> int tpsend(DCLONG cd, char CLTFAR *data, DCLONG len, DCLONG flags, DCLONG CLTFAR *revent)
(2) 機能
会話型サービスへデータを送信します。
tpsend関数は,コネクションの制御権を持つ側から発行できます。
(3) UAPで値を設定する引数
-
cd
データを送信するときのコネクションを指定します。tpconnect関数のリターン値で示された記述子を指定してください。
cdにイベントがある場合は,tpsend関数は呼び出し側のデータを送信しないで,処理を失敗として終了します。
-
data
送信するデータを格納する型付きバッファへのポインタを指定します。
NULLを指定した場合は,エラーになります。
ここで指定する値は,会話型サービスで定義されている値と一致させてください。
-
len
送信するデータの長さを指定します。送信データの最大長は500×1,024バイトです。
データの長さを指定する必要がないバッファへのポインタのアドレスを指定するときは,lenに0を指定してください。長さを指定する必要がある場合,lenに0を指定してはいけません。
-
flags
次に示す値を指定します。
- TPRECVONLY
-
tpsend関数を発行する側のデータが送信されたあと,発行する側は,コネクションの制御を放棄します。発行する側は,それ以降tpsend関数を発行できません。コネクションのほかの端点であるデータ受信側が,tpsend関数から送信されてきたデータを受信したとき,コネクションの制御を示すイベント(TPEV_SENDONLY)を受信します。データ受信側は,それ以降tprecv関数を発行できません。
- TPNOBLOCK
-
ブロッキング状態の場合(送信されたメッセージで内部バッファが満杯の場合など),データやイベントは送信されません。TPNOBLOCKが指定されていないで,ブロッキング状態のときは,tpsend関数を発行する側は,再び通信ができる状態になるか,タイムアウト(トランザクション,またはブロッキングタイムアウト)が発生するまで,ブロッキングします。
- TPNOTIME
-
tpsend関数を発行する側を無制限にブロッキングします。ブロッキングタイムアウトは発生しません。ただし,トランザクションタイムアウトは発生します。
- TPSIGRSTRT
-
シグナルが実行中のシステムコールを中断した場合,中断したシステムコールを再び呼び出します。
-
revent
イベントを示す型付きバッファへのポインタを指定します。
tpsend関数でリターンされるイベントを次に示します。
- TPEV_DISCONIMM
-
開始した側がtpdiscon関数を使用してコネクションをすぐに切断しました。または,通信エラー(例:サーバ,マシン,ネットワークがダウンした など)によってコネクションが切断されました。TPEV_DISCONIMMは,tpdiscon関数発行によるコネクション切断の場合,開始された側に通知されます。また,通信エラーによるコネクション切断の場合は,開始した側と開始された側の両方に通知されます。
- TPEV_SVCERR
-
開始された側にコネクションの制御権がない状態でtpreturn関数を呼び出しました。TPEV_SVCERRは,開始した側に通知されます。
- TPEV_SVCFAIL
-
開始された側にコネクションの制御権がない状態でtpreturn関数を呼び出しました。TPEV_SVCFAILは,開始した側に通知されます。
さらに,tpreturn関数はTPFAILとdataなしで呼び出されました。rvalにはTPFAILが指定され,dataにはNULLが指定されています。
これらのイベントは,コネクションがすぐに切断されたことを示します。そのため,送信中のデータは失われます。このコネクションに使用されている記述子は,無効になります。二つのプログラムが同じトランザクションにある場合は,そのトランザクションはロールバックされます。
(4) リターン値
エラー時には,tpsend関数は-1をリターンし,リターン値としてエラー情報を示す次のどれか一つの値を,tperrnoに設定します。
リターン値 |
意味 |
---|---|
TPEINVAL |
引数に誤りがあります。 |
TPEBADDESC |
cdで,誤った記述子を指定しています。 |
TPETIME |
タイムアウトが発生しました。
上記のどちらの場合も,*dataに指定した値は変更されません。 |
TPEEVENT |
イベントが発生しました。リターン値はreventに返されます。 |
TPEBLOCK |
TPNOBLOCKを指定したtprecv関数を呼び出したときに,ブロッキング状態になりました。 |
TPGOTSIG |
シグナルは受信されましたが,TPSIGRSTRTを指定していません。 |
TPEPROTO |
tpsend関数発行時の状態が適切ではありません。 |
TPESYSTEM |
コミュニケーションリソースマネジャでエラーが発生しました。 |
TPEOS |
オペレーティングシステムでエラーが発生しました。 |
(5) 注意事項
-
OpenTP1では,TPNOBLOCKは無効となります。また,TPEBLOCKは返されません。OpenTP1では,ブロッキング状態のため通信ができない場合,ネットワークダウンによって通信ができない場合と同様に,TPESYSTEMを返します。
-
OpenTP1では,TPNOTIMEは無効となります。
-
TPSIGRSTRTは無効となります。TPSIGRSTRTが指定されているかどうかは,動作に影響しません。シグナル受信時には,処理を中断してシステムコールを再び呼び出します。TPGOTSIGは返されません。
-
OpenTP1では,トランザクションタイムアウトが発生した場合,該当するプロセスは異常終了します。TPETIMEが返されるのは,ブロッキングタイムアウトが発生した場合だけです。
-
OpenTP1では,ロールバックする必要があるエラーは,X/Openで指定されている場合以外は,TPESYSTEMです。ただし,TPESYSTEMが返されても,ロールバックしない場合があります。
-
OpenTP1では,サービスを行っている相手がtpdiscon関数,tpreturn関数を呼び出している場合でも,tpsend関数を呼び出すプロセスでイベントを受信していない場合は,tpsend関数でイベントを通知できません。
-
TP1/NET/OSI-TP-Extendedを使用したOSI TP通信をする場合は,会話型サービスは使用できません。OSI TP通信で会話型サービスを使用した場合,システムの動作は保証しません。
-
TP1/Clientでは,トランザクションタイムアウトが発生した場合,CUP実行プロセスが異常終了し,それ以前に確立されていたすべてのコネクションは切断されます。TPETIMEが返されるのは,ブロッキングタイムアウトが発生した場合だけです。
-
TPESYSTEMが返されたとき,TP1/Clientで発生した障害の場合は,エラー情報がエラーログに出力されます。
-
リターン値としてTPEOSが返されたとき,メモリ不足が原因の場合があります。TP1/Clientで発生した障害の場合,エラー情報がエラーログに出力されます。