Hitachi

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


tpconnect

〈このページの構成〉

名称

会話型サービスとのコネクションの確立

形式

ANSI C,C++の形式

#include <xatmi.h>
int  tpconnect(char *svc,char *data,long len,long flags)

K&R版 Cの形式

#include <xatmi.h>
int  tpconnect(svc,data,len,flags)
char    *svc;
char    *data;
long    len;
long    flags;

機能

関数tpconnect()は,会話型サービスであるsvcに,半二重型の通信路を設定します。コネクションを確立する処理の一部として,呼び出し側はデータを受け取り側のサービス関数へ渡せます。呼び出し側がデータを渡す場合は,dataはtpalloc()で割り当てたバッファを指しておいてください。lenにはどれぐらいのバッファを送信するかを設定します。

Note:dataが,長さを指定する必要がないバッファ型を指す場合は,lenは無視されます(0にしてください)。長さが必要なバッファ型をdataが指す場合は,lenには0を設定しないでください。また,dataはNULLを設定することもできます。その場合もlenは無視されます(会話型サービスにはアプリケーションデータは送信されません)。dataのtypeとsubtypeは,svcで認識するtypeとsubtypeのうちのどれか一つに必ず一致させてください。

会話型サービスが正常に開始すると,TPSVCINFOを経由してdataとlenを受信します。そのため,会話型サービスは,tpconnect()から送信されたdataを受信するためにtprecv()を呼ぶ必要はありません。

『引数』

『●svc

要求するサービスのサービス名を設定します。』

『●data

送信データ格納領域へのポインタを設定します。』

『●len

送信データの長さを設定します。』

『●flags』

flagsには,次に示す値を設定します。

TPNOTRAN

呼び出し側がトランザクションモードで,かつこのフラグを設定している場合,起動されたsvcは,呼び出し側のトランザクションの一部にはなりません。呼び出し側がトランザクションモードで,かつsvcがトランザクション処理ができないサーバに属している場合は,このフラグを必ず設定してください。呼び出し側がトランザクションモードであれば,このフラグが設定されていても,トランザクションタイムアウトは起こります(トランザクションモードでなければ起こりません)。このフラグで起動されたサービスが失敗しても,呼び出し側のトランザクションには影響しません。

TPSENDONLY

呼び出し側がデータを送信して,呼ばれたサービスがデータの受信だけできるように,コネクションを最初に確立します(つまり,呼び出し側が最初にコネクションの制御権を得ます)。TPSENDONLYまたはTPRECVONLYは,どちらかを必ず設定してください。

TPRECVONLY

呼び出し側はデータを受信するだけで,呼ばれたサービスがデータの送信だけできるように,コネクションを最初に確立します(つまり,呼び出されたサービス側が最初にコネクションの制御権を得ます)。TPSENDONLYまたはTPRECVONLYは,どちらかを必ず設定してください。

TPNOBLOCK

ブロッキング状態の場合(例えば,送信されたメッセージで内部バッファが満杯),コネクションは確立されないで,データは送信されません。TPNOBLOCKが設定されていないで,ブロッキング状態のときは,呼び出し側は状況が収まるか,タイムアウト(トランザクション,またはブロッキングタイムアウト)が起こるまで,ブロッキングしています。

TPNOTIME

呼び出し側を無期限にブロックして,ブロッキングタイムアウトが起こらないことを意味します。トランザクションタイムアウトは起こります。

TPSIGRSTRT

シグナルが実行中のシステムコールを中断したら,中断したシステムコールを再び呼びます。

リターン値

成功した場合,tpconnect()は,そのあとでこのコネクションを指定するために使われる記述子をリターンします。エラー時には,-1をリターンして,tperrnoにエラーの状態を示す値を設定します。

エラー

次のような場合,tpconnect()はエラーリターンして,次のうちどれか一つの値をtperrnoに設定します。特に示さないかぎり,呼び出し側のトランザクションがあった場合でも,失敗は呼び出し側のトランザクションに影響を与えません。

リターン値

リターン値(数値)

意味

TPEBLOCK

3

TPNOBLOCKを設定したtpconnect()を呼び出したときに,ブロッキング状態になりました。

TPEINVAL

4

間違った引数が与えられました(例えば,svcがNULL,dataがNULLでなくtpalloc()で確保したバッファへのポインタでない,TPSENDONLYまたはTPRECVONLYがflagsに設定されていない,flagsに設定した値が間違っている)。

TPELIMIT

5

未解決のコネクションが最大数に達したので,呼び出し側の要求は送信されません。

TPENOENT

6

svcで示すサービスが存在しないので,コネクションを確立できません。

TPEOS

7

オペレーティングシステムにエラーが起こりました。厳密なエラーの性質は,product-specificな方法で定義されます。

TPEPROTO

9

tpconnect()が間違った状況で呼ばれました。

TPESYSTEM

12

コミュニケーションリソースマネジャシステムでエラーが起こりました。厳密なエラーの性質は,product-specificな方法で定義されます。

TPETIME

13

タイムアウトが起こりました。呼び出し側がトランザクションモードの場合,これはトランザクションタイムアウトで,トランザクションはrollback_only状態となります。そうでない場合は,TPNOBLOCKもTPNOTIMEも設定されていない状態で,ブロッキングタイムアウトが起こったことを意味します。トランザクションタイムアウトが起こった場合は,トランザクションをロールバックするまでは,どのコネクションでのどのような送信,受信の試みも,TPETIMEでエラーリターンします。

TPETRAN

14

svcがトランザクション処理をできないにもかかわらず,TPNOTRANが設定されていません。

TPEGOTSIG

15

シグナルは受信されましたが,TPSIGRSTRTが設定されていません。

TPEITYPE

17

dataのtypeとsubtypeが,svcで使える形式ではありません。

関連項目

tpcall(),tpdiscon(),tprecv(),tpsend(),tpservice()

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

  1. 『該当バージョンのOpenTP1では,TPNOBLOCKフラグは無効となります。そのため,TPEBLOCKがtperrnoにリターンすることはありません。OpenTP1では,ブロッキング状態のため通信ができない場合は,ネットワークダウンが原因で通信ができない場合と同様に,TPESYSTEMをリターンする仕様となっています。』

  2. 『該当バージョンのOpenTP1では,TPNOTIMEフラグは無効となります。』

  3. 『TPSIGRSTRTフラグは無効となります。このフラグの有無に関係なく,シグナル受信時には,中断したシステムコールを再び呼びます。TPEGOTSIGがリターンすることはありません。』

  4. 『該当バージョンのOpenTP1では,TPEITYPEはリターンされません。svcで使えないタイプのdataを渡した場合,TPESYSTEMがリターンされます。もし呼び出し側がトランザクションモードの場合は,rollback_only状態となります。』

  5. 『OpenTP1では,トランザクションタイムアウトが起こったときには,そのプロセスは異常終了します。そのため,TPETIMEがリターンされるのは,ブロッキングタイムアウトの場合だけとなります。』

  6. 『該当バージョンのOpenTP1では,ロールバックする必要があるエラーは,X/Openで特に指定がないかぎり,TPESYSTEMとしています。ただし,TPESYSTEMがリターンしても,rollback_only状態とならない場合もあります。』

  7. 『OpenTP1のセキュリティ機能を使っている場合で,サービス要求が認証されなかったときは,TPEPROTOでエラーリターンします。サービス要求が認証されなかったことが原因かどうかは,UAPトレースの詳細エラーコードで確認してください。』

  8. 『TP1/NET/OSI-TP-Extendedを使ったOSI TP通信をする場合は,会話型サービスの通信はできません。OSI TP通信で会話型サービスの通信を使った場合,システムの動作は保証しません。』

  9. 『サーバAPが閉塞状態の場合は,ローカルノードの要求先SPPが閉塞しているか,リモートノードの要求先SPPが閉塞しているかによって,次のように動作します。

    ローカルノードの要求先SPPが閉塞しているとき

    tpconnect()は-1を返し,tperrnoにTPEPROTOが設定されます。

    リモートノードの要求先SPPが閉塞しているとき

    トランザクションモードであれば,トランザクションタイムアウトでサーバAPが異常終了します。

    非トランザクションモードであれば,tpconnect()は-1を返し,tperrnoにTPETIMEが設定されます。』