ここでは,コネクションを再確立・強制解放する場合の,コーディング例を示します。
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;
}
受信したメッセージに形式誤りがあったときにコネクションを強制解放する場合の例を,次の図およびコーディング例に示します。
図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;
}