6.2.1 例: リクエスト・メッセージと応答メッセージに同じバッファの使用

次のリストは、クライアント・プログラムaudit.cで、リクエスト・メッセージとレスポンス・メッセージに同じバッファを使用して、同期呼出しを行う方法を示しています。この例では、*audvメッセージ・バッファはリクエスト情報と応答情報の両方を格納するように設定されているため、同じバッファを使用できます。このコードでは、次の処理が行われます。

  1. サービスはb_idフィールドに対して問合せを実行します。ただし、このフィールドを上書きしません。
  2. アプリケーションは、balフィールドをゼロ、ermsgフィールドをNULL文字列に初期化して、サービスから返される値を受け取る準備をします。
  3. svc_name変数はリクエストされたサービス名、hdr_type変数はリクエストされた残高のタイプを示します。この例では、口座残高と窓口残高が示されます。

リスト6-1 リクエスト・メッセージと応答メッセージに同じバッファの使用

. . .
/* Create buffer and set data pointer */

audv = (struct aud *)tpalloc("VIEW", "aud", sizeof(struct aud));

      /* Prepare aud structure */

audv->b_id = q_branchid;
audv->balance = 0.0;
(void)strcpy(audv->ermsg, "");

         /* Do tpcall */

if (tpcall(svc_name,(char *)audv,sizeof(struct aud),
      (char **)&audv,(long *)&audrl,0)== -1){
      (void)fprintf (stderr, "%s service failed\n %s: %s\n",
       svc_name, svc_name, audv->ermsg);
       retc = -1;
}
else
       (void)printf ("Branch %ld %s balance is $%.2f\n",
           audv->b_id, hdr_type, audv->balance);
. . .