주식회사 누리아이티

정보자산의 보안강화를 위한 다계층 인증SW (BaroPAM) 전문기업.

▶ Tuxedo/기술자료

Buffer Size 및 Broadcasting

누리아이티 2011. 11. 7. 14:59

문의하신 내용은 다음 두가지 입니다.

 

l   Tuxedo Service buffer memory allocation 대한 의문사항.

l   Tuxedo shutdown시에 client notify하는 방법.

 

 

1. Tuxedo buffer(carray,string,fml,view) memory allocation.

 

l  Carray, String, View buffer 사용할때는 tpalloc/tprealloc으로 할당된 memory 모두 Data 채워서 전송한다.

l 

fldid

Length

(optional)

Data

FML Buffer

FML Header

FML Data

FML Data

FML Data

FML Data

FML Field


FML Buffer 경우는 다음 그림과 같은 구조를 가지므로 tpalloc/tprealloc으로 할당한 buffer FML header Field별로 header정보가 포함된다.

FML Buffer 구조

 

l  field 자신의 필드에 대한 정보를 header로써 가지고 있기 때문에 순수한 Data외의 필드 정보가 buffer 일부분을 점유한다.

l  FML Buffer 최대 64Kbyte 넘지 못한다. ( 16 bit )

l  64Kbyte 넘는 데이터를 전송할때는 FML32 사용하면 4Gbyte까지의 데이터를 전송할 있다.

l  Client Interface Module(PowerBuilder, VB, Delphi, etc)에서 tpcall시에 Service에서 return하는 Data 담는 buffer size 어떻게 할당하도록 되어 있는냐에 따라서 FML32 사용하더라도 64Kbyte이상 받지 못할 있다.

l  E-mail에서 보내주신 내용중 많은 양의 Data 보낼때 데이터를 받지 못하는 이유는 FML 사용할때 계산식에서 나온 Buffer size 64Kbyte 넘었거나 FML header정보들 때문에 원하는 양의 Data 전달되지 않는다.

l  참고로 필드별 header size 다음과 같습니다.

Filed Type

Size

String

Header 4bytes, Null 1 byte

Carray

Header 4bytes

Char

Header 2bytes, Data 2 bytes

Short

Header 2bytes, Data 2 bytes

Long

Header 2bytes, Data 4 bytes

Float

Header 2bytes, Data 4 bytes

Double

Header 2bytes, Data 8 bytes

 

l  많은 양의 Data 주고 받아야 할때는 적당한 size 쪼개서 여러 번으로 나누어서 받는 방법을 사용하십시요.

 

Tuxedo System Shutdown Client 알려주는 방법

 

l   턱시도에서 제공하는 Event Broker 사용하여 Tuxedo System에서 발생하는 Event Client에서 Check 있다.

l   턱시도에서 가지 형태의 Event Broker 제공하는데 System에서 발생하는 event 처리하는 TMSYSEVT(5) Event server 사용자 정의 Event 처리하는 TMUSREVT(5) Event Broker Server 제공된다.

l  

*SERVERS

TMSYSEVT        SRVGRP=GROUP1  SRVID=20


Tuxedo Configuration 파일에 system event broker TMSYSEVT 추가한다.

 

l   Tuxedo Client에서는 tpinit() 시에 flags flags = TPU_DIP 첨가하고, tpsetunsol 호출하여 event handler 설치한다. 그후 tpsubscribe 호출하여 받고자 하는 event subscribe한다.

l  

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>

#include <stdlib.h>

#include "atmi.h"

#include "fml.h"

#include "fml32.h"

 

char *msg;

long msglen;

void msghand(char *, long, long);

void (*msghptr)() = msghand;

 

main(argc, argv)

int argc;

char *argv[];

{

        int ret, i;

        int done=0;

        long subhnd;

        uid_t myid;

        char myname[100];

        char myinit[5];

        char *dummy, answ[2];

        TPINIT *initbuf;

 

        if ( (initbuf = ( TPINIT * ) tpalloc("TPINIT", NULL, 0) ) == ( TPINIT *) NULL ) {

                printf("tpalloc fail on tpinit , %d\n", tperrno);

                exit(1);

        }

 

        initbuf->flags = TPU_DIP;

        getpw(getuid(), myname);

        initbuf->usrname[3] = NULL;

 

        printf("usrname %s cltname %s\n", initbuf->usrname, initbuf->cltname);

 

        if ( tpinit(initbuf) == -1 ) {

                printf("tpinit fialed... %d\n", tperrno);

                exit(1);

        }

 

        (*tpsetunsol) (msghptr);

 

        if ( (subhnd = tpsubscribe("\\.Sys.*", NULL, NULL, 0 )) < 0 )

        {

                printf("subscribe failed %s\n", tpstrerror(tperrno));

                exit(1);

        }

 

        while (!done)

 


구체적인 Client Sample 다음과 같다.

{

                if ( tpchkunsol() < 0 )

                {

                        printf("tpchkunsol failed %d\n", tperrno);

                        exit(1);

                }

                printf("sleep 5 sec...\n");

                sleep(5);

                printf("continue y or n ?\n");

                dummy = gets(answ);

                if ( answ[0] == 'n' || answ[0] == 'N')

                {

                        done = 1;

                }

        }

 

        tpunsubscribe(subhnd, 0);

        tpterm();

}

 

void msghand(char *msg, long msglen, long flags)

{

        char workstr[200];

        char btype[20], stype[20];

        FBFR *transf=(FBFR *)msg;

 

        tptypes(msg, btype, stype);

        printf("====== < %s > entering message handler =========\n", btype);

        Fprint32(transf);

        printf("rec msg : %s \n", msg);

        return;

}