7.4.2 メッセージの受信

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

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

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

引数 説明
cd 接続記述子。従属プログラムで呼出しを行う場合は、cd引数に、そのプログラムのTPSVCINFO構造体に指定されている値を設定します。発信元のプログラムで呼出しを行う場合は、cd引数に、tpconnect()関数で返される値を設定します。
data データ・バッファを指すポインタ。data引数は、tpalloc()を使用してすでに割り当てられているバッファを指す必要があります。バッファのtypesubtypeは、呼び出されたサービスで認識できなければなりません。NULLを指定すると呼出しは失敗し、tperrno(5)TPEINVALが設定されます。呼び出された会話型サービスは、TPSVCINFOデータ構造体を介してdataおよびlenポインタを受け取ります。この構造体は、サービスが呼び出されたときにmain()関数によって渡されます。(リクエスト/レスポンス・サービスも同じ方法で、dataおよびlenポインタを受け取ります。)TPSVCINFOデータ構造体の詳細は、5-9ページの「サービスの定義」を参照してください。
len データ・バッファの長さ。バッファが自己記述型(FMLバッファなど)の場合、lenに0を設定できます。NULLを指定すると呼出しは失敗し、tperrno(5)TPEINVALが設定されます。
revent エラーの発生時(つまり、tperrnoにTPEEVENTが設定された場合)に、設定されるイベント値を指すポインタ。有効なイベント値については、『Oracle Tuxedo ATMI C関数リファレンス』tprecv(3c)に関する項を参照してください。
flag フラグの設定値。有効なフラグについては、『Oracle Tuxedo ATMI 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); }