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();
}
親トピック: 同期メッセージの送信