Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成の手引


3.2.2 コネクションを再確立・強制解放する場合のコーディング例

ここでは,コネクションを再確立・強制解放する場合の,コーディング例を示します。

〈この項の構成〉

(1) コネクションを再確立する場合のコーディング例

CERREVT(コネクション障害)が通知されたあと,コネクションを自動的に再確立する場合の例を,次の図およびコーディング例に示します。

図3‒3 コネクションを自動的に再確立するUAPの例

[図データ]

void cerrevt(){
    char    rcvdata[256];
    DCLONG  rcv_len;
    DCLONG  rtime;
    int     rtn;
    dcmcf_tactcnopt cnopt;
    dcmcf_tlscnopt  cnopt2;
    DCLONG  infcnt = 1;
    dcmcf_cninf     inf;
 
    rtn = dc_mcf_receive(DCMCFFRST, DCNOFLAGS, termnam, "", rcvdata,
                         &rcv_len, sizeof(rcvdata), &rtime);
    if (DCMCFRTN_00000 == rtn){
 
        /* コネクション解放時の処理 */
        /*            :             */
 
        /* コネクションの再確立要求 */
        memset(&cnopt, 0, sizeof(cnopt));
        strcpy(cnopt.idnam, termnam);
 
        rtn = dc_mcf_tactcn(DCMCFLE , &cnopt, NULL, NULL, NULL, NULL);
        if (DCMCFRTN_00000 == rtn){
            /* コネクション確立要求の受付:成功 */
 
            while(1){
                /* コネクションの状態取得 */
                memset(&cnopt2, 0, sizeof(cnopt2));
                strcpy(cnopt2.idnam, termnam);
                memset(&inf, 0, sizeof(inf));
 
                rtn = dc_mcf_tlscn(DCMCFLE, &cnopt2, NULL, NULL, NULL, &infcnt, &inf, NULL);
                if (DCMCFRTN_00000 == rtn){
                    if (DCMCF_CNST_ACT == inf.status){
                        /* コネクション確立状態 */
                        break;
                    }
                } else {
                    /* 障害処理 */
                }
                sleep(1);
            }
 
            /* コネクション確立後の処理 */
            /*         :                */
 
        } else {
            /* コネクション確立要求の受付:失敗 */
            /* 障害処理 */
        }
 
    } else {
        /* 障害処理 */
    }
    
    return;
}

(2) コネクションを強制解放する場合のコーディング例

受信したメッセージに形式誤りがあったときにコネクションを強制解放する場合の例を,次の図およびコーディング例に示します。

図3‒4 コネクションを強制解放するUAPの例

[図データ]

void mhprecv(){
    char    rcvdata[256];
    DCLONG  rcv_len;
    DCLONG  rtime;
    int     rtn;
    int     check;
    dcmcf_tdctcnopt cnopt;
    dcmcf_tlscnopt  cnopt2;
    DCLONG  infcnt = 1;
    dcmcf_cninf     inf;
 
    rtn = dc_mcf_receive(DCMCFFRST, DCNOFLAGS, termnam, "", rcvdata,
                         &rcv_len, sizeof(rcvdata), &rtime);
    if (DCMCFRTN_00000 == rtn){
 
        /* 受信メッセージのチェック処理 */
        /*            :                */
 
        if (0 == check){
            /* チェック結果:正 */
            /* 正常時の処理 */
        } else {
            /* チェック結果:誤 */
 
            /* コネクションの強制解放要求 */
            memset(&cnopt, 0, sizeof(cnopt));
            strcpy(cnopt.idnam, termnam);
 
            rtn = dc_mcf_tdctcn(DCMCFLE | DCMCFFRC, &cnopt, NULL, NULL, NULL, NULL);
            if (DCMCFRTN_00000 == rtn){
                /* コネクション強制解放要求の受付:成功 */
 
                while(1){
                    /* コネクションの状態取得 */
                    memset(&cnopt2, 0, sizeof(cnopt2));
                    strcpy(cnopt2.idnam, termnam);
                    memset(&inf, 0, sizeof(inf));
 
                    rtn = dc_mcf_tlscn(DCMCFLE, &cnopt2, NULL, NULL, NULL, &infcnt, &inf, NULL);
                    if (DCMCFRTN_00000 == rtn){
                        if (DCMCF_CNST_DCT == inf.status){
                            /* コネクション解放状態 */
                            break;
                        }
                    } else {
                        /* 障害処理 */
                    }
                    sleep(1);
                }
 
                /* コネクション解放後の処理 */
                /*         :               */
 
            } else {
                /* コネクション強制解放要求の受付:失敗 */
                /* 障害処理 */
            }
        }
 
    } else {
        /* 障害処理 */
    }
    
    return;
}