7.4.1 メッセージの送信

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

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

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

表7-2 tpsend()関数の引数

引数 説明
cd tpconnect()関数で戻され、データが送信される接続を識別する接続記述子。
data データ・バッファを指すポインタ。data引数に、tpalloc()を使用してすでに割り当てられているバッファを指すポインタを設定すると、接続の確立と同時にデータを送信することができます。バッファのtypesubtypeは、呼び出されたサービスで認識できなければなりません。dataにNULLを設定して、送信データがないことを示すことができます。呼び出された会話型サービスは、TPSVCINFOデータ構造体を介してdataおよびlenポインタを受け取ります。この構造体は、サービスが呼び出されたときにmain()関数によって渡されます。(リクエスト/レスポンス・サーバーも同じ方法で、dataおよびlenポインタを受け取ります。)TPSVCINFOデータ構造体の詳細は、「サービスの定義」を参照してください。
len データ・バッファの長さ。バッファが自己記述型(FMLバッファなど)の場合、lenに0を設定できます。dataに値が設定されていない場合、この引数は無視されます。
revent エラーの発生時(つまり、tperrno(5)TPEEVENTが設定された場合)に、設定されるイベント値を指すポインタ。有効なイベント値については、『Oracle Tuxedo ATMI C関数リファレンス』tpsend(3c)に関する項を参照してください。
flag フラグの設定値。有効なフラグ設定については、『Oracle Tuxedo ATMI C関数リファレンス』tpsend(3c)に関する項を参照してください。

tpsend()関数の呼出しが失敗すると-1が返され、対応するエラー・コードがtperrno(5)に設定されます。エラー・コードについては、『Oracle Tuxedo ATMI 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);
         }