分散トランザクション処理機能 OpenTP1 プロトコル TP1/NET/OSI-TP編

[目次][用語][索引][前へ][次へ]

付録E.4 ユーザアプリケーションプログラムのコーディング例(半二重でのC言語)

<この項の構成>
(1) コンテンション勝者側(SPP)
(2) コンテンション敗者側(MHP)

(1) コンテンション勝者側(SPP)

 
#include <dcmcf.h>
#include <string.h>
 
#define     WAITTIME    60
 
void    SEND01(in, in_len,  out, out_len)
 
                char         *in     ;
   unsigned     DCLONG       in_len  ;
                char         *out    ;
   unsigned     DCLONG       out_len ;
{
   /*★★引数定義★★*/             /*引数を使用している関数*/
                   /* sendsync, recvsync, sendrecv, receive */
   DCLONG   action         ;/* 0         0         0        0 */
   DCLONG   commform       ;/* 0         0         0        0 */
   char     termnam[16]    ;/* 0         0         0        0 */
   char     resv01[16]     ;/* 0         0         0        0 */
   char     senddata[256]  ;/* 0         -         0        - */
   DCLONG   sdataleng      ;/* 0         -         0        - */
   char     recvdata[256]  ;/* -         0         0        0 */
   DCLONG   rdataleng      ;/* -         0         0        0 */
   DCLONG   time           ;/* -         0         0        0 */
   DCLONG   wachtime       ;/* 0         0         0        - */
   char     resv02[16]     ;/* 0         -         -        - */
   DCLONG   opcd           ;/* 0         -         -        - */
   DCLONG   inbufleng      ;/* -         0         0        0 */
 
   /*★★変数定義 & 初期化★★*/
   int         rtn = 0x00  ;
 
   /*★★引数初期化★★*/
   action         =    NULL;
   commform       =    NULL;
   memset(termnam, 0, 16)  ;
   memset(resv01, 0, 16)   ;
   memset(senddata, 0, 256);
   sdataleng      =    NULL;
   memset(recvdata, 0, 256);
   rdataleng      =    NULL;
   time           =    NULL;
   wachtime       =    NULL;
   memset(resv02,  0, 16)  ;
   opcd           =    NULL;
   inbufleng      =    NULL;
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆  ダイアログ開始要求送信(TP-BEGIN-DIALOGUE)     ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ sendsync引数設定 (初期化) ★★*/
   action           =   DCMCFEMI    ;
   commform         =   DCNOFLAGS   ;
   strcpy(termnam, "otm01")         ;
   resv01[0]        =    NULL       ;
   /* senddataイニシャライズは省略 */
   sdataleng        =    54         ;
   resv02[0]        =    NULL       ;
   opcd             =    DCNOFLAGS  ;
   wachtime         =    WAITTIME   ;
 
   /*★ senddata 設定 ★*/
   /*★ 先頭8バイト目までは,MCFが使用する ★*/
   senddata[8] = 0x00  ;  /* レングス 01 */
   senddata[9] = 0x0a  ;  /* サービスプリミティブの長さ */
 
   strcpy(senddata + 10, "OTP1")  ;  /* 送信手順(OTP1) */
   strcpy(senddata + 14, "BDR ")  ;
                          /* サービスプリミティブコード */
                          /* TP-BEGIN-DIALOGUE req */
 
   senddata[18] = 0x00  ; /* レングス 02 */
   senddata[19] = 0x2a  ; /* パラメタ全体の長さ */
 
   senddata[20] = 0x00  ; /* レングス 03 */
   senddata[21] = 0x0d  ; /* 発呼側TPSUタイトルの長さ */
 
   strcpy(senddata + 22, "PR")       ;  /* 型コード */
   strcpy(senddata + 24, "SEND_TPSU");
                          /* 発呼側TPSUタイトル(パラメタ1) */
 
   senddata[33] = 0x00  ; /* レングス 04 */
   senddata[34] = 0x02  ; /* 着呼側AP(パラメタ 2省略) */
 
   senddata[35] = 0x00  ; /* レングス 05 */
   senddata[36] = 0x0d  ; /* 着呼側TPSUタイトルの長さ */
 
   strcpy(senddata + 37, "PR")         ;  /* 型コード */
   strcpy(senddata + 39, "RECV_TPSU")  ;
                          /*着呼側TPSUタイトル(パラメタ3) */
 
   senddata[48] = 0x00  ; /* レングス 06 */
   senddata[49] = 0x04  ; /* 予備の長さ */
 
   senddata[50] = 0x88  ;
               /* 半二重&ハンドシェイク機能単位(パラメタ 4) */
   senddata[51] = 0xff  ; /* 予備 */
 
   senddata[52] = 0x00  ; /* レングス 07 */
   senddata[53] = 0x02  ; /* サービス品質(パラメタ5省略) */
 
   senddata[54] = 0x00  ; /* レングス 08 */
   senddata[55] = 0x02  ;
             /*アプリケーションコンテキスト(パラメタ6省略) */
 
   senddata[56] = 0x00  ; /* レングス 09 */
   senddata[57] = 0x04  ; /* 確認項目の長さ */
 
   strcpy(senddata + 58, "AL")    ;  /* 確認項目 */
                          /* all(同期型)(パラメタ 7) */
 
   senddata[60] = 0x00  ; /* レングス 10 */
   senddata[61] = 0x02  ; /* ユーザ情報(省略) */
 
 
 
   /*▼▼ メッセージ送信開始(sendsync) ▼▼*/
 
   rtn = dc_mcf_sendsync(action, commform, termnam, resv01,
                         senddata, sdataleng, resv02, opcd,
                         wachtime);
 
   if ( rtn != DCMCFRTN_00000 )
   {
       goto ERROR;
   }
   /*▲▲ メッセージ送信終了(sendsync) ▲▲*/
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆  ダイアログ開始応答受信(TP-BEGIN-DIALOGUE)     ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ recvsync引数設定 (初期化) ★★*/
   action           =   DCMCFFRST   ;
   commform         =   DCNOFLAGS   ;
   resv01[0]        =   NULL        ;
   /*recvdataイニシャライズは省略*/
   rdataleng        =   NULL        ;
   inbufleng        =   256         ;
   time             =   NULL        ;
   wachtime         =   WAITTIME    ;
 
 
   /*▼▼ メッセージ受信開始(recvsync) ▼▼*/
 
   rtn = dc_mcf_recvsync(action, commform, termnam, resv01,
                         recvdata, & rdataleng,
                         inbufleng, & time, wachtime);
 
   if ( rtn != DCMCFRTN_00000 )
   {
       goto ERROR;
   }
   /*▲▲ メッセージ受信終了(recvsync) ▲▲*/
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆          データ送信(TP-DATA)                   ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ sendsync引数設定 (初期化) ★★*/
   action           =   DCMCFEMI    ;
   commform         =   DCNOFLAGS   ;
   resv01[0]        =   NULL        ;
   sdataleng        =   23          ;
   resv02[0]        =   NULL        ;
   opcd             =   DCNOFLAGS   ;
   wachtime         =   WAITTIME    ;
 
   /*★ senddata clear ★*/
   memset(senddata, 0, 256)         ;
 
   /*★ senddata 設定 ★*/
   /*★ 先頭8バイト目までは,MCFが使用する ★*/
   senddata[8] = 0x00   ; /* レングス 01 */
   senddata[9] = 0x0a   ; /* サービスプリミティブの長さ */
 
   strcpy(senddata + 10, "OTP1")    ;  /* 送信手順(OTP1) */
   strcpy(senddata + 14, "TDR ")  ;
                          /* サービスプリミティブコード */
                          /* TP-DATA req */
 
   senddata[18] = 0x00  ; /* レングス 02 */
   senddata[19] = 0x02  ; /* パラメタ(省略) */
 
   senddata[20] = 0x00  ; /* レングス 03 */
   senddata[21] = 0x0b  ; /* ユーザ情報の長さ */
 
   senddata[22] = 0x80  ; /* 連結状態 */
 
   strcpy(senddata + 23, "USERDATA")  ;  /* ユーザデータ */
 
 
   /*▼▼ データ送信(sendsync)開始 ▼▼*/
 
   rtn = dc_mcf_sendsync(action, commform, termnam, resv01,
                         senddata, sdataleng, resv02, opcd,
                         wachtime);
 
   if ( rtn != DCMCFRTN_00000 )
   {
       goto ERROR;
   }
   /*▲▲ データ送信(sendsync)終了 ▲▲*/
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆      ハンドシェイク&制御権譲渡要求送信         ◆*/
/*◆    (TP-HANDSHAKE-AND-GRANT-CONTROL)            ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ sendsync引数設定 (初期化) ★★*/
   action           =   DCMCFEMI    ;
   commform         =   DCNOFLAGS   ;
   resv01[0]        =   NULL        ;
   sdataleng        =   18          ;
   resv02[0]        =   NULL        ;
   opcd             =   DCNOFLAGS   ;
   wachtime         =   WAITTIME    ;
 
   memset(senddata, 0, 256);
 
   /*★ sendsync 設定 ★*/
   /*★ 先頭8バイト目までは,MCFが使用する ★*/
   senddata[8] = 0x00  ; /* レングス 01 */
   senddata[9] = 0x0a  ; /* サービスプリミティブの長さ */
 
   strcpy(senddata + 10, "OTP1")  ;  /* 送信手順(OTP1) */
   strcpy(senddata + 14, "HGR ")  ;
                          /* サービスプリミティブコード */
                          /* TP-HANDSHAKE-AND-    */
                          /*    GRANT-CONTROL req */
 
   senddata[18] = 0x00  ; /* レングス 02 */
   senddata[19] = 0x06  ; /* パラメタ全体の長さ */
 
   senddata[20] = 0x00  ; /* レングス 03 */
   senddata[21] = 0x04  ; /* 即時確認の長さ */
 
   strcpy(senddata+22, "UR")  ;  /* 即時確認(パラメタ 1) */
 
   senddata[24] = 0x00  ; /* レングス 04 */
   senddata[25] = 0x02  ; /* ユーザ情報(省略) */
 
   /*▼▼ メッセージ送信開始(sendsync) ▼▼*/
 
   rtn = dc_mcf_sendsync(action, commform, termnam, resv01,
                         senddata, sdataleng, resv02, opcd,
                         wachtime);
 
   if ( rtn != DCMCFRTN_00000 )
   {
       goto ERROR;
   }
   /*▲▲ メッセージ送信終了(sendsync) ▲▲*/
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆      ハンドシェイク&制御権譲渡応答受信         ◆*/
/*◆    (TP-HANDSHAKE-AND-GRANT-CONTROL)            ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ recvsync引数設定 (初期化) ★★*/
   action           =   DCMCFFRST   ;
   commform         =   DCNOFLAGS   ;
   resv01[0]        =   NULL        ;
   /*recvdataイニシャライズは省略*/
   rdataleng        =   NULL        ;
   inbufleng        =   256         ;
   time             =   NULL        ;
   wachtime         =   WAITTIME    ;
 
   memset(senddata, 0, 256);
 
   /*▼▼ メッセージ受信開始(recvsync) ▼▼*/
 
   rtn = dc_mcf_recvsync(action, commform, termnam, resv01,
                         recvdata, & rdataleng,
                         inbufleng, & time, wachtime);
 
   if ( rtn != DCMCFRTN_00000 )
   {
       goto ERROR;
   }
   /*▲▲ メッセージ受信終了(recvsync) ▲▲*/
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆        TP_DATA受信(TP-DATA)                    ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ recvsync引数設定 (初期化) ★★*/
   action           =   DCMCFFRST   ;
   commform         =   DCNOFLAGS   ;
   resv01[0]        =   NULL        ;
   rdataleng        =   NULL        ;
   inbufleng        =   256         ;
   time             =   NULL        ;
   wachtime         =   WAITTIME    ;
 
   /*★★ recvdata clear ★★*/
   memset(recvdata, 0, 256)  ;
 
   /*▼▼ データ受信開始(recvsync) ▼▼*/
 
   rtn = dc_mcf_recvsync(action, commform, termnam, resv01,
                         recvdata, & rdataleng,
                         inbufleng, & time, wachtime );
 
   if ( rtn != DCMCFRTN_00000 )
   {
       goto ERROR;
   }
   /*▲▲ データ受信終了(recvsync) ▲▲*/
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆  ダイアログ終了要求受信(TP-END-DIALOGUE)       ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ recvsync引数設定 (初期化) ★★*/
   action           =   DCMCFFRST   ;
   commform         =   DCNOFLAGS   ;
   resv01[0]        =   NULL        ;
   rdataleng        =   NULL        ;
   inbufleng        =   256         ;
   time             =   NULL        ;
   wachtime         =   WAITTIME    ;
 
   /*★★ recvdata clear★★*/
   memset(recvdata, 0, 256)     ;
 
   /*▼▼ メッセージ受信開始(recvsync) ▼▼*/
 
   rtn = dc_mcf_recvsync(action, commform, termnam, resv01,
                         recvdata, & rdataleng,
                         inbufleng, & time, wachtime);
 
   if ( rtn != DCMCFRTN_00000 )
   {
       goto ERROR;
   }
   /*▲▲ メッセージ受信終了(recvsync)▲▲*/
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆    ダイアログ終了応答送信(TP-END-DIALOGUE)     ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ sendsync引数設定 (初期化) ★★*/
   action           =   DCMCFEMI    ;
   commform         =   DCNOFLAGS   ;
   resv01[0]        =   NULL        ;
   sdataleng        =   14          ;
   resv02[0]        =   NULL        ;
   opcd             =   DCNOFLAGS   ;
   wachtime         =   WAITTIME    ;
 
   /*★★ senddata clear★★*/
   memset(senddata, 0, 256)     ;
 
   /*★ senddata 設定 ★*/
   /*★ 先頭8バイト目までは,MCFが使用する ★*/
   senddata[8] = 0x00  ; /* レングス 01 */
   senddata[9] = 0x0a  ; /* サービスプリミティブの長さ */
 
   strcpy(senddata + 10, "OTP1")  ;  /* 送信手順(OTP1) */
   strcpy(senddata + 14, "EDP ")  ;
                         /* サービスプリミティブコード */
                         /* TP-END-DIALOGUE rsp */
 
   senddata[18] = 0x00  ; /* レングス 02 */
   senddata[19] = 0x02  ; /* パラメタ(省略) */
 
   senddata[20] = 0x00  ; /* レングス 03 */
   senddata[21] = 0x02  ; /* ユーザ情報(省略) */
 
   /*▼▼ メッセージ送信開始(sendsync) ▼▼*/
 
   rtn = dc_mcf_sendsync(action, commform, termnam, resv01,
                         senddata, sdataleng, resv02, opcd,
                         wachtime);
 
   /*▲▲ メッセージ送信終了(sendsync) ▲▲*/
 
ERROR : ;
}

(2) コンテンション敗者側(MHP)

 
#include <dcmcf.h>
#include <string.h>
 
#define     WAITTIME    60
 
void    RECV01(in, in_len,  out, out_len)
 
                char         *in     ;
   unsigned     DCLONG       in_len  ;
                char         *out    ;
   unsigned     DCLONG       out_len ;
{
   /*★★引数定義★★*/             /*引数を使用している関数*/
                   /* sendsync, recvsync, sendrecv, receive */
   DCLONG  action        ;/*   0         0         0        0 */
   DCLONG  commform      ;/*   0         0         0        0 */
   char    termnam[16]   ;/*   0         0         0        0 */
   char    resv01[16]    ;/*   0         0         0        0 */
   char    senddata[256] ;/*   0         -         0        - */
   DCLONG  sdataleng     ;/*   0         -         0        - */
   char    recvdata[256] ;/*   -         0         0        0 */
   DCLONG  rdataleng     ;/*   -         0         0        0 */
   DCLONG  time          ;/*   -         0         0        0 */
   DCLONG  wachtime      ;/*   0         0         0        - */
   char    resv02[16]    ;/*   0         -         -        - */
   DCLONG  opcd          ;/*   0         -         -        - */
   DCLONG  inbufleng     ;/*   -         0         0        0 */
 
   /*★★変数定義 & 初期化★★*/
   int         rtn = NULL  ;
 
   /*★★引数初期化★★*/
   action         =    NULL;
   commform       =    NULL;
   memset(termnam, 0, 16)  ;
   memset(resv01, 0, 16)   ;
   memset(recvdata, 0, 256);
   sdataleng      =    NULL;
   memset(recvdata, 0, 256);
   rdataleng      =    NULL;
   time           =    NULL;
   wachtime       =    NULL;
   memset(resv02,  0, 16)  ;
   opcd           =    NULL;
   inbufleng      =    NULL;
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆  ダイアログ開始要求受信(TP-BEGIN-DIALOGUE)     ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ receive引数設定 (初期化) ★★*/
   action           =   DCMCFFRST   ;
   commform         =   DCNOFLAGS   ;
   termnam[0]       =   NULL        ;
   /*recvdataイニシャライズは省略*/
   resv01[0]        =   NULL        ;
   rdataleng        =   NULL        ;
   inbufleng        =   256         ;
   time             =   NULL        ;
 
   /*▼▼ ダイアログ開始要求受信開始(receive) ▼▼*/
 
   rtn = dc_mcf_receive(action, commform, termnam, resv01,
                        recvdata, & rdataleng, inbufleng,
                        & time);
 
   if ( rtn != DCMCFRTN_00000 )
  {
       goto ERROR;
   }
   /*▲▲ ダイアログ開始要求受信終了(receive) ▲▲*/
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆  ダイアログ開始応答送信(TP-BEGIN-DIALOGUE)     ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ sendsync引数設定 (初期化) ★★*/
   action           =   DCMCFEMI    ;
   commform         =   DCNOFLAGS   ;
   resv01[0]        =   NULL        ;
   sdataleng        =   18          ;
   resv02[0]        =   NULL        ;
   opcd             =   DCNOFLAGS   ;
   wachtime         =   WAITTIME    ;
 
   /*★ senddata 設定 ★*/
   /*★ 先頭8バイト目までは,MCFが使用する ★*/
   senddata[8] = 0x00  ;  /* レングス 01 */
   senddata[9] = 0x0a  ;  /* サービスプリミティブの長さ */
 
   strcpy(senddata + 10, "OTP1")  ;  /* 送信手順(OTP1) */
   strcpy(senddata + 14, "BDPA")  ;
                          /* サービスプリミティブコード */
                          /* TP-BEGIN-DIALOGUE rsp */
 
   senddata[18] = 0x00  ; /* レングス 02 */
   senddata[19] = 0x06  ; /* パラメタ全体の長さ */
 
   senddata[20] = 0x00  ; /* レングス 03 */
   senddata[21] = 0x04  ; /* 結果の長さ */
 
   strcpy(senddata + 22, "AC")  ;  /* 結果(パラメタ 1) */
 
   senddata[24] = 0x00  ; /* レングス 04 */
   senddata[25] = 0x02  ; /* ユーザ情報(省略) */
 
 
   /*▼▼ メッセージ送信開始(sendsync) ▼▼*/
 
   rtn = dc_mcf_sendsync(action, commform, termnam, resv01,
                         senddata, sdataleng, resv02, opcd,
                         wachtime);
 
   if ( rtn != DCMCFRTN_00000 )
   {
       goto ERROR;
   }
   /*▲▲ メッセージ送信終了(sendsync) ▲▲*/
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆      TP_DATA受信(TP-DATA)                     ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ recvsync引数設定 (初期化) ★★*/
   action           =   DCMCFFRST   ;
   commform         =   DCNOFLAGS   ;
   resv01[0]        =   NULL        ;
   rdataleng        =   NULL        ;
   inbufleng        =   256         ;
   time             =   NULL        ;
   wachtime         =   WAITTIME    ;
 
   /*★★ recvdata clear ★★*/
   memset(recvdata, 0, 256)    ;
 
   /*▼▼ データ受信開始(recvsync) ▼▼*/
 
   rtn = dc_mcf_recvsync(action, commform, termnam, resv01,
                         recvdata, & rdataleng,
                         inbufleng, & time, wachtime);
 
   if ( rtn != DCMCFRTN_00000 )
  {
       goto ERROR;
   }
   /*▲▲ データ受信終了(recvsync) ▲▲*/
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆    ハンドシェイク&制御権譲渡要求受信           ◆*/
/*◆  (TP-HANDSHAKE-AND-GRANT-CONTROL)              ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ recvsync引数設定 (初期化) ★★*/
   action           =   DCMCFFRST   ;
   commform         =   DCNOFLAGS   ;
   resv01[0]        =   NULL        ;
   rdataleng        =   NULL        ;
   inbufleng        =   256         ;
   time             =   NULL        ;
   wachtime         =   WAITTIME    ;
 
   /*★★ recvdata clear ★★*/
   memset(recvdata, 0, 256)    ;
 
   /*▼▼ メッセージ受信開始(recvsync) ▼▼*/
 
   rtn = dc_mcf_recvsync(action, commform, termnam, resv01,
                         recvdata, & rdataleng,
                         inbufleng, & time, wachtime);
 
   if ( rtn != DCMCFRTN_00000 )
  {
       goto ERROR;
   }
   /*▲▲ メッセージ受信終了(recvsync) ▲▲*/
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆       ハンドシェイク&制御権譲渡応答送信        ◆*/
/*◆     (TP-HANDSHAKE-AND-GRANT-CONTROL)           ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ sendsync引数設定 (初期化) ★★*/
   action           =   DCMCFEMI    ;
   commform         =   DCNOFLAGS   ;
   resv01[0]        =   NULL        ;
   sdataleng        =   14          ;
   resv02[0]        =   NULL        ;
   opcd             =   DCNOFLAGS   ;
   wachtime         =   WAITTIME    ;
 
   /*★ senddata clear ★*/
   memset(senddata, 0, 256)         ;
 
   /*★ senddata 設定 ★*/
   /*★ 先頭8バイト目までは,MCFが使用する ★*/
   senddata[8] = 0x00  ;
   senddata[9] = 0x0a  ;
 
   strcpy(senddata + 10, "OTP1")  ;  /* 送信手順(OTP1) */
   strcpy(senddata + 14, "HGP ")  ;
                          /* サービスプリミティブコード */
                          /* TP-HANDSHAKE-AND-    */
                          /*    GRANT-CONTROL rsp */
 
   senddata[18] = 0x00  ;
   senddata[19] = 0x02  ; /* パラメタ(省略) */
 
   senddata[20] = 0x00  ;
   senddata[21] = 0x02  ; /* ユーザ情報(省略) */
 
   /*▼▼ メッセージ送信開始(sendsync) ▼▼*/
 
   rtn = dc_mcf_sendsync(action, commform, termnam, resv01,
                         senddata, sdataleng, resv02, opcd,
                         wachtime);
 
   if ( rtn != DCMCFRTN_00000 )
  {
       goto ERROR;
   }
   /*▲▲ メッセージ送信終了(sendsync) ▲▲*/
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆        データ送信(TP-DATA)                     ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ sendsync引数設定 (初期化) ★★*/
   action           =   DCMCFEMI    ;
   commform         =   DCNOFLAGS   ;
   resv01[0]        =   NULL        ;
   sdataleng        =   23          ;
   resv02[0]        =   NULL        ;
   opcd             =   DCNOFLAGS   ;
   wachtime         =   WAITTIME    ;
 
   /*★ senddata clear ★*/
   memset(senddata, 0, 256)         ;
 
   /*★ senddata 設定 ★*/
   /*★ 先頭8バイト目までは,MCFが使用する ★*/
   senddata[8] = 0x00  ;  /* レングス 01 */
   senddata[9] = 0x0a  ;  /* サービスプリミティブの長さ */
 
   strcpy(senddata + 10, "OTP1")  ;  /* 送信手順(OTP1) */
   strcpy(senddata + 14, "TDR ")  ;
                          /* サービスプリミティブコード */
                          /* TP_DATA req */
 
   senddata[18] = 0x00  ; /* レングス 02 */
   senddata[19] = 0x02  ; /* パラメタ(省略) */
 
   senddata[20] = 0x00  ; /* レングス 03 */
   senddata[21] = 0x0b  ; /* ユーザ情報の長さ */
 
   senddata[22] = 0x80  ; /* 連結状態 */
 
   strcpy(senddata + 23, "USERDATA")    ;  /* ユーザデータ */
 
 
   /*▼▼ データ送信(sendsync)開始 ▼▼*/
 
   rtn = dc_mcf_sendsync(action, commform, termnam, resv01,
                         senddata, sdataleng, resv02, opcd,
                         wachtime);
 
   if ( rtn != DCMCFRTN_00000 )
  {
       goto ERROR;
   }
   /*▲▲ データ送信(sendsync)終了 ▲▲*/
 
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
/*◆  ダイアログ終了要求送受信(TP-END-DIALOGUE)     ◆*/
/*◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆*/
 
   /*★★ sendrecv引数設定 ★★*/
   action           =   DCMCFEMI    ;
   commform         =   DCMCFIO     ;
   resv01[0]        =   NULL        ;
   sdataleng        =   18          ;
   rdataleng        =   NULL        ;
   inbufleng        =   256         ;
   time             =   NULL        ;
   wachtime         =  WAITTIME     ;
 
   /*★ senddata clear ★*/
   memset(senddata, 0, 256)         ;
   memset(recvdata, 0, 256)         ;
 
   /*★ senddata 設定 ★*/
   /*★ 先頭8バイト目までは,MCFが使用する ★*/
   senddata[8] = 0x00  ;  /* レングス 01 */
   senddata[9] = 0x0a  ;  /* サービスプリミティブの長さ */
 
   strcpy(senddata + 10, "OTP1")  ;  /* 送信手順(OTP1) */
   strcpy(senddata + 14, "EDR ")  ;
                          /* サービスプリミティブコード */
                          /* TP-END-DIALOGUE req */
 
   senddata[18] = 0x00  ; /* レングス 02 */
   senddata[19] = 0x06  ; /* パラメタ全体の長さ */
 
   senddata[20] = 0x00  ; /* レングス 03 */
   senddata[21] = 0x04  ; /* 確認項目の長さ */
 
   strcpy(senddata + 22, "TR")  ;  /* 確認項目(パラメタ 1) */
 
   senddata[24] = 0x00  ; /* レングス 04 */
   senddata[25] = 0x02  ; /* ユーザ情報 */
 
   /*▼▼ メッセージ送受信開始(sendrecv) ▼▼*/
 
   rtn = dc_mcf_sendrecv(action, commform, termnam, resv01,
                         senddata, sdataleng,
                         recvdata, & rdataleng,
                         inbufleng, & time, wachtime);
 
   if ( rtn != DCMCFRTN_00000 )
   {
       goto ERROR;
   }
   /*▲▲ メッセージ送受信終了(sendrecv)▲▲*/
 
ERROR : ;
}