7.2 クライアント/サーバ形態のUAPのコーディング例(SPP TAMアクセス)

クライアント/サーバ形態のUAP構成例を次の図に示します。ここでは,SPPのコーディング例だけを掲載します。このSPPにサービスを要求するSUPは,「7.1 クライアント/サーバ形態のUAPのコーディング例(SUP,SPP DAMアクセス)」と同じSUPからサービス要求されるものとします。

図7-2 クライアント/サーバ形態のUAP構成例(TAMアクセス)

[図データ]

ここでは,図に示した構成例のコーディング例を示します。

<この節の構成>
(1) SPPの例(メイン関数)
(2) SPPの例(サービス関数)

(1) SPPの例(メイン関数)

SPPのメイン関数のコーディング例を次に示します。

 10  /*
 20   * spp01 メイン関数
 30   */
 40  #include <stdio.h>
 50  #include <dcrpc.h>
 60  #include <dctam.h>
 70  #define  TAMTABLE    "tamtable30"
 80  
 90  long  tamfd ;      /* tamfile file-id  */
100  
110  main()
120  {
130  
140  /*
150   * リターンコード格納変数の定義
160   */
170    int    rcd ;
180  /*
190   * RPC-OPEN(UAPの開始)
200   */
210    rcd = dc_rpc_open(DCNOFLAGS) ;
220    if(rcd != DC_OK) {
230      printf("SPP01:dc_rpc_openに失敗しました。code = %d ¥n", rcd) ;
240      goto PROG_END ;
250    }
260  /*
270   * TAM-OPEN(TAMテーブルのオープン)
280   */
290    rcd = dc_tam_open(TAMTABLE, DCTAM_REC_EXCLUSIVE) ;
300    if(rcd <= 0) {
310      printf("SVR01:dc_tam_openに失敗しました。code = %d ¥n", rcd) ;
320      goto TAM_END ;
330    }
340    tamfd = (long)rcd ;
350  /*
360   * RPC-MAINLOOP(SPPのサービス開始)
370   */
380    rcd = dc_rpc_mainloop(DCNOFLAGS) ;
390    if(rcd != DC_OK) {
400      printf("SPP01:dc_rpc_mainloopに失敗しました。code = %d ¥n", rcd) ;
410    }
420  /*
430   * TAM-CLOSE(TAMテーブルのクローズ)
440   */
450    rcd = dc_tam_close(tamfd, DCNOFLAGS) ;
460    if(rcd != DC_OK) {
470      printf("SVR01:dc_tam_closeに失敗しました。code = %d ¥n", rcd) ;
480    }
490  TAM_END :
500  /*
510   * RPC-CLOSE(UAPの終了)
520   */
530    dc_rpc_close(DCNOFLAGS) ;
540  PROG_END :
550    printf("SPP01:SPPのサービス処理を終了します。¥n") ;
560    exit(0) ;
570  }

(2) SPPの例(サービス関数)

SPPのサービス関数のコーディング例を次に示します。

 10  /*
 20   * srv01 サービス関数
 30   */
 40  #include <stdio.h>
 50  #include <string.h>
 60  #include <dctam.h>
 70  #define  TAM_REC_SIZE  128
 80  
 90  extern  long tamfd ;   /* tamfile file-id */
100  
110  void svr01(in_data, in_leng, out_data, out_leng)
120    char *in_data ;
130    long *in_leng ;
140    char *out_data ;
150    long *out_leng ;
160  {
170  
180  /*
190   * 変数の定義
200   */
210    static struct DC_TAMKEY keyptr ;
220    static char   *tamc_buf ;
230    static char   tam_cntl_buf[TAM_REC_SIZE] ;
240    static char   write_buf[TAM_REC_SIZE] ;
250    struct tam_cntl_p {
260                       char keyname[10] ;
270                       char filler[118] ;
280                      } *tam_cntl_p ;
290    int    rcd ;
300    int    write_size ;
310    int    tamc_buf_size ;
320    static char keypar[4][10] = {
330                                  { 0x00, 0x00, 0x00, 0x00, 0x00,
340                                    0x00, 0x00, 0x00, 0x00, 0x01} ,
350                                  { 0x00, 0x00, 0x00, 0x00, 0x00,
360                                    0x00, 0x00, 0x00, 0x00, 0x02} ,
370                                  { 0x00, 0x00, 0x00, 0x00, 0x00,
380                                    0x00, 0x00, 0x00, 0x00, 0x03} ,
390                                  { 0x00, 0x00, 0x00, 0x00, 0x00,
400                                    0x00, 0x00, 0x00, 0x00, 0x04} ,
410                                } ;
420    printf("SVR01:処理の開始 ¥n") ;
430  /*
440   * TAM_READ(TAMテーブルから第1レコードを入力)
450   */
460    keyptr.keyname = keypar[0] ;
470    tamc_buf_size = TAM_REC_SIZE ;
480    rcd = dc_tam_read(tamfd, &keyptr, 1, tam_cntl_buf,
490                      tamc_buf_size, DCTAM_EQLSRC | DCTAM_MODIFY) ;
500    if(rcd != DC_OK) {
510      printf("SVR01:dc_tam_readに失敗しました。code = %d ¥n", rcd) ;
520      strcpy(out_data, "SVR01:TAM READ FAILED") ;
530      *out_leng = strlen(out_data) ;
540      goto PROG_END ;
550    }
560  /*
570   * TAM_REWRITE(TAMテーブルの第1レコードを検索前提の更新)
580   */
590    tam_cntl_p = (struct tam_cntl_p *)tam_cntl_buf ;
600    memcpy(tam_cntl_p->filler, in_data, *in_leng) ;
610    rcd = dc_tam_rewrite(tamfd, &keyptr, 1, tam_cntl_buf,
620                                tamc_buf_size, DCNOFLAGS) ;
630    if(rcd != DC_OK) {
640      printf("SVR01:dc_tam_rewriteに失敗しました。code = %d ¥n", rcd) ;
650      strcpy(out_data, "SVR01:TAM REWRITE FAILED") ;
660      *out_leng = strlen(out_data) ;
670      goto PROG_END ;
680    }
690  /*
700   * TAM_WRITE(TAMテーブルの第2レコードを更新)
710   */
720    keyptr.keyname = keypar[1] ;
730    tam_cntl_p = (struct tam_cntl_p *)write_buf ;
740    memcpy(tam_cntl_p->keyname, keypar[1], 10) ;
750    memcpy(tam_cntl_p->filler, in_data, *in_leng) ;
760    write_size = TAM_REC_SIZE ;
770    rcd = dc_tam_write(tamfd, &keyptr, 1, tam_cntl_p,
780                              write_size, DCTAM_WRITE) ;
790    if(rcd != DC_OK) {
800      printf("SVR01:dc_tam_writeに失敗しました。code = %d ¥n", rcd) ;
810      strcpy(out_data, "SVR01:TAM WRITE FAILED") ;
820      *out_leng = strlen(out_data) ;
830      goto PROG_END ;
840    }
850  /*
860   * TAM_READ(TAMテーブルから第3レコードを入力)
870   */
880    keyptr.keyname = keypar[2] ;
890    tamc_buf_size = TAM_REC_SIZE ;
900    rcd = dc_tam_read(tamfd, &keyptr, 1, tam_cntl_buf,
910                      tamc_buf_size, DCTAM_EQLSRC | DCTAM_MODIFY) ;
920    if(rcd != DC_OK) {
930      printf("SVR01:dc_tam_readに失敗しました。code = %d ¥n", rcd) ;
940      strcpy(out_data, "SVR01:TAM READ FAILED") ;
950      *out_leng = strlen(out_data) ;
960      goto PROG_END ;
970    }
980  /*
990   * TAM_READ_CANCEL(TAMテーブルの第3レコードの検索を取り消す)
1000   */
1010    rcd = dc_tam_read_cancel(tamfd, &keyptr, 1, DCNOFLAGS) ;
1020    if(rcd != DC_OK) {
1030      printf("SVR01:dc_tam_read_cancelに失敗しました。code = %d ¥n",
1040                                                                rcd) ;
1050      strcpy(out_data, "SVR01:TAM READ CANCEL FAILED") ;
1060      *out_leng = strlen(out_data) ;
1070      goto PROG_END ;
1080    }
1090  /*
1100   * TAM_delete(TAMテーブルの第4レコードを削除)
1110   */
1120    keyptr.keyname = keypar[3] ;
1130    rcd = dc_tam_delete(tamfd, &keyptr, 1,
1140                               NULL, 0, DCTAM_NOOUTREC) ;
1150    if(rcd != DC_OK) {
1160      printf("SVR01:dc_tam_deleteに失敗しました。code = %d ¥n", rcd) ;
1170      strcpy(out_data, "SVR01:TAM DELETE FAILED") ;
1180      *out_leng = strlen(out_data) ;
1190      goto PROG_END ;
1200    }
1210    strcpy(out_data, "SVR01:PROCESS COMPLETE") ;
1220    *out_leng = strlen(out_data) ;
1230  PROG_END :
1240    printf("SVR01:処理を終了します。¥n") ;
1250    return ;
1260  }