付録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; }