OpenTP1 Version 7 Programming Guide
This subsection provides coding examples for re-establishing or forcibly releasing a connection.
The figure and coding example below show an example of automatically re-establishing a connection after CERREVT (connection error) is reported.
Figure 3-3 UAP example for automatically re-establishing a connection
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){
/* Processing during connection release */
/* : */
/* Connection re-establishment request */
memset(&cnopt, 0, sizeof(cnopt));
strcpy(cnopt.idnam, termnam);
rtn = dc_mcf_tactcn(DCMCFLE, &cnopt, NULL, NULL,
NULL, NULL);
if (DCMCFRTN_00000 == rtn){
/* Acceptance of connection */
/* re-establishment request: Successful */
while(1){
/* Connection status acquisition */
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){
/* Connection established */
break;
}
} else {
/* Error processing */
}
sleep(1);
}
/* Processing following connection establishment */
/* : */
} else {
/* Acceptance of connection */
/* re-establishment request: Failed */
/* Error processing */
}
} else {
/* Error processing */
}
return;
}
The figure and coding example below show an example of forcibly releasing a connection when the received message contains a format error.
Figure 3-4 UAP example for forcibly releasing a connection
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){
/* Checking of the received message */
/* : */
if (0 == check){
/* Checking result: Valid */
/* Processing when the result is normal */
} else {
/* Checking result: Invalid */
/* Request to forcibly release the connection */
memset(&cnopt, 0, sizeof(cnopt));
strcpy(cnopt.idnam, termnam);
rtn = dc_mcf_tdctcn(DCMCFLE | DCMCFFRC, &cnopt,
NULL, NULL, NULL, NULL);
if (DCMCFRTN_00000 == rtn){
/* Acceptance of forcible */
/* connection release request: Successful */
while(1){
/* Connection status acquisition */
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){
/* Connection released */
break;
}
} else {
/* Error processing */
}
sleep(1);
}
/* Processing following connection release */
/* : */
} else {
/* Acceptance of forcible */
/* connection release request: Failed */
/* Error processing */
}
}
} else {
/* Error processing */
}
return;
}
All Rights Reserved. Copyright (C) 2006, 2010, Hitachi, Ltd.