BEA Logo BEA Tuxedo Release 8.0

  BEA ホーム  |  イベント  |  ソリューション  |  パートナ  |  製品  |  サービス  |  ダウンロード  |  ディベロッパ・センタ  |  WebSUPPORT

 

   Tuxedo ホーム   |   C 言語を使用した BEA Tuxedo アプリケーションのプログラミング   |   先頭へ   |   前へ   |   次へ   |   目次

 


メッセージの送受信

BEA Tuxedo システムで会話型接続が確立されると、イニシエータと下位サーバ間の通信は送信呼び出しと受信呼び出しによって行われます。接続の制御を持つプロセスは、tpsend(3c) 関数を使用してメッセージを送信できます。制御がないプロセスは、tprecv(3c) 関数を使用してメッセージを受信できます。

注記 発信元 (クライアント) は、最初に tpconnect() 呼び出しの TPSENDONLY または TPRECVONLY フラグを使用して、どのプロセスが制御を持っているのかを判別します。TPSENDONLY は、発信元が制御を持つことを示します。TPRECVONLY は、呼び出されたサービスに制御が渡されたことを示します。

メッセージの送信

メッセージを送信するには tpsend(3c) 関数を使用します。この関数には、次の文法を使用します。

int
tpsend(int cd, char *data, long len, long flags, long *revent)

次の表は、tpsend() 関数の引数を示しています。

tpsend( ) 関数の引数

引数

説明

cd

tpconnect() 関数で返される接続記述子。データが送信される接続が識別されます。

data

データ・バッファを指すポインタ。data 引数に、tpalloc() を使用して既に割り当てられているバッファを指すポインタを設定すると、接続の確立と同時にデータを送信することができます。バッファのタイプとサブタイプは、呼び出されたサービスで認識できなければなりません。data に NULL を設定して、送信データがないことを示すことがきます。

呼び出された会話型サービスは、TPSVCINFO 構造体を介して data および len ポインタを受け取ります。この構造体は、サービスが呼び出されたときに main() 関数によって渡されます。要求/応答型サービスも同じ方法で、data および len ポインタを受け取ります。TPSVCINFO 構造体の詳細については、「サービスの定義」を参照してください。

len

データ・バッファの長さ。バッファが自己記述型 (FML バッファなど) の場合、len に 0 を設定できます。data に値が設定されていない場合、この引数は無視されます。

revent

エラーの発生時 (つまり、tperrno(5)TPEEVENT が設定された場合) に、設定されるイベント値を指すポインタ。有効なイベント値については、『BEA Tuxedo C リファレンス』の tpsend(3c) を参照してください。

flag

フラグの設定値。有効なフラグ設定値については、『BEA Tuxedo C リファレンス』 の tpsend(3c)を参照してください。

tpsend() 関数の呼び出しが失敗すると -1 が返され、対応するエラー・コードが tperrno(5) に設定されます。エラー・コードについては、『BEA Tuxedo C リファレンス』の tpsend(3c) を参照してください。

tpsend() 関数を呼び出すたびに、制御を渡す必要はありません。一部のアプリケーションでは、tpsend() の呼び出しを認められているプロセスが、制御をほかのプロセスに渡すまで、現在のタスクで必要な回数だけ呼び出しを実行できます。ただし、プログラムのロジックによっては、会話が継続する間は常に 1 つのプロセスが接続の制御を持たなければならないアプリケーションもあります。

次のコード例は、tpsend() 関数の呼び出し方法を示しています。

会話モードでのデータ送信

if (tpsend(cd,line,0,TPRECVONLY,revent) == -1) {
(void)userlog("%s:tpsend failed tperrno %d",
argv[0],tperrno);
(void)tpabort(0);
(void)tpterm();
exit(1);
}

メッセージの受信

オープン接続を介してデータを受信するには、tprecv(3c) 関数を使用します。この関数には、次の文法を使用します。

int
tprecv(int cd, char **data, long *len, long flags, long *revent)

次の表は、tprecv() 関数の引数を示しています。

引数

説明

cd

接続記述子。下位プログラムで呼び出しを行う場合は、cd 引数に、そのプログラムの TPSVCINFO 構造体に指定されている値を設定します。発信元のプログラムで呼び出しを行う場合は、cd 引数に、tpconnect() 関数で返される値を設定します。

data

データ・バッファを指すポインタ。data 引数は、tpalloc() を使用して既に割り当てられているバッファを指す必要があります。バッファのタイプとサブタイプは、呼び出されたサービスで認識できなければなりません。NULL は指定できません。NULL を指定すると呼び出しは失敗し、tperrno(5)TPEINVAL が設定されます。

呼び出された会話型サービスは、TPSVCINFO 構造体を介して data および len ポインタを受け取ります。この構造体は、サービスが呼び出されたときに main() 関数によって渡されます。要求/応答型サービスも同じ方法で、data および len ポインタを受け取ります。TPSVCINFO 構造体の詳細については、「サービスの定義」を参照してください。

len

データ・バッファの長さ。バッファが自己記述型 (FML バッファなど) の場合、len に 0 を設定できます。NULL は指定できません。NULL を指定すると呼び出しは失敗し、tperrno(5)TPEINVAL が設定されます。

revent

エラーの発生時 (つまり、tperrnoTPEEVENT が設定された場合) に、設定されるイベント値を指すポインタ。有効なイベント値については、『BEA Tuxedo C リファレンス』の tprecv(3c) を参照してください。

flag

フラグの設定値。有効なフラグについては、『BEA Tuxedo C リファレンス』 の tprecv(3c) を参照してください。

処理が成功すると、*data が受信データを指し、len にバッファのサイズが格納されます。lentprecv() を呼び出す前のバッファの合計サイズより大きい場合、バッファのサイズは変更されていて、len はバッファの新しいサイズを示しています。len 引数が 0 の場合、受信データがないことを示します。

次のコード例は、tprecv() 関数の使用方法を示しています。

会話型でのデータ受信

if (tprecv(cd,line,len,TPNOCHANGE,revent) != -1) {
(void)userlog("%s:tprecv failed tperrno %d revent %ld",
argv[0],tperrno,revent);
(void)tpabort(0);
(void)tpterm();
exit(1);
}

 

先頭へ戻る 前のトピックへ 次のトピックへ