Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プロトコル TP1/NET/User Datagram Protocol編


付録H.1 コーディング例

使用するメッセージの種類ごとにUAPのコーディング例を示します。

〈この項の構成〉

(1) メッセージ受信処理とユニキャストメッセージ送信(UAP1)

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <dcmcf.h>
#include <dcmudpu.h>
 
#define SEND_ADDR   0xC20B2A15   /* 0xC20B2A15 == 194.11.42.21 */
#define BRD_PORT    0x4E2A       /* 0x4E2A     == 20010        */
#define MLT_PORT    0x4E2B       /* 0x4E2B     == 20011        */
#define UNI_PORT    0x4E2C       /* 0x4E2C     == 20012        */
#define SRV_MSGSIZE    480
typedef struct srvmsg_s{
    char    mcfarea[8];             /*   8bytes == DCMCFBUF1   */
    dcmudp_dc_header dchead;        /*  24bytes                */
    char    srv_msg[SRV_MSGSIZE];   /* 480bytes == SRV_MSGSIZE */
} srvmsg_def;                       /* 512bytes                */
 
void    ex_uap1() {
    DCLONG          action;
    static DCLONG   commform   = DCNOFLAGS;
    char            termnam[16];
    static   char   resv01[16] = "\0";
    static   char   resv02[16] = "\0";
    srvmsg_def      srvdata_area;
    char            *recvdata;
    char            *senddata;
    DCLONG          sdataleng;
    DCLONG          rdataleng;
    DCLONG          inbufleng;
    static DCLONG   opcd       = DCNOFLAGS;
    static DCLONG   watchtime  = -1;
    DCLONG          time;
    int             rtn;
 
    recvdata = (char *)&srvdata_area;
    senddata = (char *)&srvdata_area;
 
    (void)memset((void *)&srvdata_area,
                 0x00,
                 sizeof(srvdata_area));
 
    action   = DCMCFFRST;
 
    inbufleng = sizeof(srvdata_area);
 
    rtn = dc_mcf_receive(action,
                         commform,
                         termnam,
                         resv01,
                         recvdata,
                         &rdataleng,
                         inbufleng,
                         &time);
 
    if( DCMCFRTN_00000 == rtn ) {
        if( SEND_ADDR == ntohl(srvdata_area.dchead.r_ipaddr) ) {
            switch( ntohs(srvdata_area.dchead.r_portno) ) {
            case BRD_PORT:
                /***********************************************/
                /*  User Service Part.                         */
                /***********************************************/
                break;
 
            case MLT_PORT:
                /***********************************************/
                /*  User Service Part.                         */
                /***********************************************/
                break;
 
            case UNI_PORT:
                /***********************************************/
                /*  User Service Part.                         */
                /***********************************************/
                action   = DCMCFEMI;
                sdataleng = rdataleng;
                rtn = dc_mcf_sendsync(action,
                                      commform,
                                      termnam,
                                      resv01,
                                      senddata,
                                      sdataleng,
                                      resv02,
                                      opcd,
                                      watchtime);
 
                if( DCMCFRTN_00000 == rtn) {
                    /*******************************************/
                    /*  User Service Part.                     */
                    /*******************************************/
                } else {
                    /*******************************************/
                    /*  User Service Part.                     */
                    /*******************************************/
                }
                break;
 
            default:
                /***********************************************/
                /*  User Service Part.                         */
                /***********************************************/
                break;
            }
        } else {
                /***********************************************/
                /*  User Service Part.                         */
                /***********************************************/
        }
    } else {
        /************************************************/
        /*  User Service Part.                          */
        /************************************************/
    }
    return;
}

(2) ユニキャストメッセージ送信(UAP2)

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <dcmcf.h>
#include <dcmudpu.h>
 
#define SEND_ADDR   0xC20B2A16   /* 0xC20B2A16 == 194.11.42.22 */
#define SEND_PORT   0x4E2D       /* 0x4E2D     == 20013        */
#define SRV_MSGSIZE    480
typedef struct srvmsg_s{
    char    mcfarea[8];             /*   8bytes == DCMCFBUF1   */
    dcmudp_dc_header dchead;        /*  24bytes                */
    char    srv_msg[SRV_MSGSIZE];   /* 480bytes == SRV_MSGSIZE */
} srvmsg_def;                       /* 512bytes                */
 
void    ex_uap2() {
    static DCLONG   action     = DCMCFEMI;
    static DCLONG   commform   = DCNOFLAGS;
    static   char   *termnam   = "leid04";
    static   char   resv01[16] = "\0";
    static   char   resv02[16] = "\0";
    static DCLONG   opcd       = DCNOFLAGS;
    static DCLONG   watchtime  = -1;
    char            *senddata;
    srvmsg_def      senddata_area;
    DCLONG          sdataleng;
    int             rtn;
 
    senddata = (char *)&senddata_area;
    (void)memset((void *)&senddata_area,
                 0x00,
                 (size_t)sizeof(senddata_area));
 
    /************************************************/
    /*  User Service Part.                          */
    /************************************************/
 
    sdataleng = sizeof(senddata_area) 
                - sizeof(senddata_area.mcfarea);
 
    senddata_area.dchead.r_ipaddr = htonl(SEND_ADDR);
 
    senddata_area.dchead.r_portno = htons(SEND_PORT);
 
    rtn = dc_mcf_sendsync(action,
                          commform,
                          termnam,
                          resv01,
                          senddata,
                          sdataleng,
                          resv02,
                          opcd,
                          watchtime);
 
    if( DCMCFRTN_00000 == rtn) {
        /************************************************/
        /*  User Service Part.                          */
        /************************************************/
    } else {
        /************************************************/
        /*  User Service Part.                          */
        /************************************************/
    }
    return;
}

(3) ブロードキャストメッセージ送信(UAP3)

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <dcmcf.h>
#include <dcmudpu.h>
 
#define SEND_PORT      0x4E2E       /* 0x4E2E     == 20014     */
#define SRV_MSGSIZE    480
typedef struct srvmsg_s{
    char    mcfarea[8];             /*   8bytes == DCMCFBUF1   */
    dcmudp_dc_header dchead;        /*  24bytes                */
    char    srv_msg[SRV_MSGSIZE];   /* 480bytes == SRV_MSGSIZE */
} srvmsg_def;                       /* 512bytes                */
 
void    ex_uap3(){
    static DCLONG   action     = DCMCFEMI;
    static DCLONG   commform   = DCNOFLAGS;
    static   char   *termnam   = "leid05";
    static   char   resv01[16] = "\0";
    static   char   resv02[16] = "\0";
    static DCLONG   opcd       = DCNOFLAGS;
    static DCLONG   watchtime  = -1;
    char            *senddata;
    srvmsg_def      senddata_area;
    DCLONG          sdataleng;
    int             rtn;
 
    senddata = (char *)&senddata_area;
    (void)memset((void *)&senddata_area,
                 0x00,
                 sizeof(senddata_area));
 
    /************************************************/
    /*  User Service Part.                          */
    /************************************************/
 
    sdataleng = sizeof(senddata_area) 
                - sizeof(senddata_area.mcfarea);
 
    senddata_area.dchead.r_ipaddr = htonl(INADDR_BROADCAST);
 
    senddata_area.dchead.r_portno = htons(SEND_PORT);
 
    rtn = dc_mcf_sendsync(action,
                          commform,
                          termnam,
                          resv01,
                          senddata,
                          sdataleng,
                          resv02,
                          opcd,
                          watchtime);
    if( DCMCFRTN_00000 == rtn) {
        /************************************************/
        /*  User Service Part.                          */
        /************************************************/
    } else {
        /************************************************/
        /*  User Service Part.                          */
        /************************************************/
    }
    return;
}

(4) マルチキャストメッセージ送信(UAP4)

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <dcmcf.h>
#include <dcmudpu.h>
 
#define SEND_ADDR     0xE0010203   /* 0xE0010203 == 224.1.2.3  */
#define SEND_PORT     0x4E2F       /* 0x4E2F     == 20015      */
#define SRV_MSGSIZE   480
typedef struct srvmsg_s{
    char    mcfarea[8];             /*   8bytes == DCMCFBUF1   */
    dcmudp_dc_header dchead;        /*  24bytes                */
    char    srv_msg[SRV_MSGSIZE];   /* 480bytes == SRV_MSGSIZE */
} srvmsg_def;                       /* 512bytes                */
 
void    ex_uap4() {
    static DCLONG   action     = DCMCFEMI;
    static DCLONG   commform   = DCNOFLAGS;
    static   char   *termnam   = "leid06";
    static   char   resv01[16] = "\0";
    static   char   resv02[16] = "\0";
    static DCLONG   opcd       = DCNOFLAGS;
    static DCLONG   watchtime  = -1;
    char            *senddata;
    srvmsg_def      senddata_area;
    DCLONG          sdataleng;
    int             rtn;
 
    senddata = (char *)&senddata_area;
    (void)memset((void *)&senddata_area,
                 0x00,
                 (size_t)sizeof(senddata_area));
 
    /************************************************/
    /*  User Service Part.                          */
    /************************************************/
 
    sdataleng = sizeof(senddata_area) 
                - sizeof(senddata_area.mcfarea);
 
    senddata_area.dchead.r_ipaddr = htonl(SEND_ADDR);
 
    senddata_area.dchead.r_portno = htons(SEND_PORT);
 
    rtn = dc_mcf_sendsync(action,
                          commform,
                          termnam,
                          resv01,
                          senddata,
                          sdataleng,
                          resv02,
                          opcd,
                          watchtime);
 
    if( DCMCFRTN_00000 == rtn) {
        /************************************************/
        /*  User Service Part.                          */
        /************************************************/
    } else {
        /************************************************/
        /*  User Service Part.                          */
        /************************************************/
    }
    return;
}