6.2.5 例: TPNOCHANGEフラグを設定した同期メッセージの送信

次のリストでは、最初に割り当てられたバッファ・タイプと同じタイプで応答メッセージを返す必要があることを示して、TPNOCHANGE通信フラグを使用して厳密なタイプ・チェックを行う方法を示しています。この例では、REPORTというサービス・ルーチンを参照します。(REPORTサービスは、「例: TPNOTRANフラグを設定した同期メッセージの送信」でも使用されています。)

このサンプル・コードでは、クライアントが応答をVIEW型バッファrview1で受信し、printf()文でその内容を出力しています。厳密なタイプ・チェックのフラグTPNOCHANGEが設定されているので、タイプVIEWおよびサブタイプrview1のバッファに応答が返されます。

厳密なタイプ・チェックを行うのは、REPORTサービス・サブルーチンでエラーが発生して、不適切なタイプの応答バッファが使用されることを防ぐためです。もう1つの理由は、依存関係にあるすべてのエリアで一貫していない変更が行わることを防ぐためです。たとえば、あるプログラマがREPORTサービスを変更してすべての応答を別のVIEW形式で標準化したが、それを反映するためにクライアント・プロセスを変更しなかった場合などがあります。

TPNOCHANGEフラグを設定した同期メッセージの送信のリスト

#include <stdio.h>
#include "atmi.h"
#include "rview1.h"

main(argc, argv)
int argc;
char * argv[];

{
char *rbuf;                    /* report buffer */
struct rview1 *rrbuf;         /* report reply buffer */
long rlen, rrlen;            /* buffer lengths of send and reply 
                                buffers for report */
if (tpinit((TPINIT *) tpinfo) == -1)
fprintf(stderr, "%s: failed to join application\n", argv[0]);

if (rbuf = tpalloc("STRING", NULL, 0) == NULL) { /* allocate space for report 
*/
    tpterm();
    exit(1);
}
                            /* allocate space for return buffer */
if (rrbuf = (struct rview1 *)tpalloc("VIEW", "rview1", sizeof(struct 
rview1)) \ == NULL{
    tpfree(rbuf);
    tpterm();
    exit(1);
}
(void)strcpy(rbuf, "REPORT=accrcv DBNAME=accounts FORMAT=rview1");
rlen = strlen(rbuf)+1;        /* length of request */
                              /* get report in rview1 struct */
if (tpcall("REPORT", rbuf, rlen, (char **)&rrbuf, &rrlen, TPNOCHANGE) == -1) 
{
    fprintf(stderr, "accounts receivable report failed in service call\n");
    if (tperrno == TPEOTYPE)
        fprintf(stderr, "report returned has wrong view type\n");
    tpfree(rbuf);
    tpfree(rrbuf);
    tpterm();
    exit(1);
}
(void)printf("Total accounts receivable %6d\n", rrbuf->total);
(void)printf("Largest three outstanding %-20s %6d\n", rrbuf->name1, 
rrbuf->amt1);
(void)printf("%-20s %6d\n", rrbuf->name2, rrbuf->amt2);
(void)printf("%-20s %6d\n", rrbuf->name3, rrbuf->amt3);
tpfree(rbuf);
tpfree(rrbuf);
tpterm();
}