주식회사 누리아이티

정보자산의 보안강화를 위한 3단계 인증 보안SW(BaroPAM) 전문기업인 누리아이티

▶ Tuxedo/기술자료

TUXEDO 서버 프로그램 작성시 주의사항

누리아이티 2012. 3. 16. 13:07

1) 항상 기동되어 있는 Server 프로그램이기 때문에, 프로그램 내에 malloc() 함수를 사용할 경우에는 반드시 free() 함수를 사용 할 것.

-    가급적 malloc() 함수를 사용하지 말 것.

-    C Library 함수 중에 ascftime()과 같은 함수는 내부적으로 malloc() 함수를 사용하고free() 함수를 사용하지 않으므로 사용하지 말 것.

 

2) tpalloc() 혹은 tprealloc() 함수를 사용할 경우에 반드시 tpfree() 함수를 사용할 것.

-> tpreturn() 함수 사용시에는 내부적으로 tpfree() 함수를 사용 함.

 

3) 서버 프로그램 내에서 필요시 fopen() 함수를 사용할 경우에는 반드시 fclose() 함수를 사용하여야 함.

 

4)  Client에서 N Byte 만큼 FML 버퍼를 tpalloc() 하였을 경우, Server에서는 FML 버퍼에 대하여 반드시 동일한 Size 만큼 할당되지 않음.

-    Client에서 FML 버퍼 Size 10 Kbyte 할당하고, FML 버퍼에 실 데이터를 500 Byte 저장하고 Server로 보내면, Server에서는 4 Kbyte 만큼 FML 버퍼 Size가 할당 됨.

          -> FML 버퍼에 저장된 데이터의 Size(Fsizeof32() 함수 이용) 4 Kbyte 미만이면 내부적으로 4 Kbyte 만큼 할당되고, 그 이상일 경우에는 반드시 tprealloc() 하여야 함.

- FML 버퍼 사이즈는 최소 단위가 4 Kbyte !!

- FML 버퍼 구조 

Header

Data

 Index

  Fused32()   함수 : Index 부분을 제외한 Header Data의 사이즈

        Fsizeof32() 함수 : Header, Data Index의 사이즈

 

        Fused() 함수를 이용하여 FML 사이즈를 계산하여 메모리를 Allocation하고 Memcpy()             함수를 사용하면 Index 부분의 영역이 빠지고 Header 정보에는 Index가 있는 것으로            Setting되어 있다. 따라서 새로 할당된 버퍼에 데이터를 넣을 경우, Index를 갱신할 때 할당되지 않은 메모리를 건드리게 된다.

        => 반드시 Fsizeof32() 함수를 이용하여 메모리 Allocation 할 것 !

     - 만약, 64 Kbyte FML Buffer를 선언했다면 Fused() 함수를 이용해 40Kbyte 가 넘는 경우는 field-id 혹은 size 등으로 인하여 실제 데이터는 40Kbyte 까지만 전송된다.

(실제 데이터는 할당된 FML Buffer size 2/3 정도만 전송됨.)

 

5) PC 혹은 UNIX 머신에 따라 타입의 사이즈가 다르므로 확인하여 코딩을 하여야 함.

 

 

PC (Win 3.1)

PC (win95/NT)

  32 Bit UNIX

64 Bit UNIX

(DEC Alpha 기준)

int

2 Byte

4 Byte

4 Byte

long

4 Byte

4 Byte

8 Byte

double

8 Byte

8 Byte

8    Byte

 

    - 서버 프로그램에서 FML Buffer와 관련된 변수(GET, GETVAR, PUT, PUTVAR) 중에 Host variable int type의 변수를 사용하지 말고 long type의 변수를 사용할 것.

 

6) 프로그램 내에서 Host Variable 선언 시 Size는 반드시 Table Column Size + 1로 설정.

       

char    col_2[8];

varchar col_1[10+1], col_3[20+1];

 

7)  프로그램 내에서 에러 처리는 반드시 할 것.

- tpalloc() 혹은 tprealloc() 사용시 “NULL” Check하여 에러 처리.

- SQL 사용시 “SQLCODE != SQL_OK” Check하여 에러 처리.

- tpcommit(), tpcall() TUXEDO ATMI 사용시 “-1 : FAIL” Check하여 에러 처리.

 

8) GET()/GETVAR(), PUT()/PUTVAR()등의 Macro 함수를 사용할 경우 Occurrence를 변수로 선언하여 Looping시킬 때, 반드시 Occurrence에 대한 변수는 초기화 되어 있어야 함.

 

9) 서버 프로그램 내에서 에러 처리를 하기 위하여 fprintf(stderr, ....) 함수를 사용하지 말 것.

--> “stderr” 화일에 결과가 쓰여지기 때문에 “txrpt” 명령어를 사용하여 서비스의 수행건수, 수행시간 등을 정확히 파악할 수 없음.

 

 10) 서버 프로그램 내에서 디버깅하기 위해 printf 함수를 사용하지 말고, 디버깅 함수를 사용할 것.

(컴파일시 옵션(CFLAG -D DEBUG로 내정)의 지정에 따라 디버그 코드의 추가 및 삭제가 가능하게 하여 차후 프로그램 디버그 및 유지보수를 원활히 하기 위해 사용.)

    - debug.h

/*#define DEBUG 1*/

 

#ifdef DEBUG

 

#define FMLLOOK(func)            { printf("%s FML buffer-----\n",func);\

                                   Fprint32(transf);\

                                   printf("------------------------\n"); \

                                   fflush(stdout); }

#define STRLOOK(func,var,val)    { printf("%s : %s === %s\n",func,var,val); \

                                   fflush(stdout); }

#define INTLOOK(func,var,val)    { printf("%s : %s === %d\n",func,var,val); \

                                   fflush(stdout); }

#define LONGLOOK(func,var,val)   { printf("%s : %s === %ld\n",func,var,val); \

                                   fflush(stdout); }

#define FLOATLOOK(func,var,val)  { printf("%s : %s === %f\n",func,var,val); \

                                   fflush(stdout); }

#define DOUBLELOOK(func,var,val) { printf("%s : %s === %lf\n",func,var,val); \

                                   fflush(stdout); }

#define LINELOOK(func,val)       { printf("%s : %s \n",func,val); \

                                   fflush(stdout); }

 

#else

 

#define FMLLOOK(func)

#define INTLOOK(func,var,val)

#define STRLOOK(func,var,val)

#define LONGLOOK(func,var,val)

#define FLOATLOOK(func,var,val)

#define DOUBLELOOK(func,var,val)

#define LINELOOK(func,val)

 

#endif

 

    - FMLOOK(func) : FML Buffer 내용을 출력하기 위한 함수.

      func : 서비스명

    - INTLOOK(func,var,val) : int type의 변수를 출력하기 위한 함수.

      func : 함수명

      var : 출력할 변수 명이나 구분자.

      val :출력할 값

    - STRLOOK(func,var,val) : string type의 변수를 출력하기 위한 함수.

      func : 함수명

      var : 출력할 변수 명이나 구분자.

      val :출력할 값

    - LONGLOOK(func,var,val) : long type의 변수를 출력하기 위한 함수.

      func : 함수명

      var : 출력할 변수 명이나 구분자.

      val :출력할 값

    - FLOATLOOK(func,var,val) : float type의 변수를 출력하기 위한 함수.

      func : 함수명

      var : 출력할 변수 명이나 구분자.

      val :출력할 값

    - DOUBLELOOK(func,var,val) : double type의 변수를 출력하기 위한 함수.

      func : 함수명

      var : 출력할 변수 명이나 구분자.

      val :출력할 값

    - LINELOOK(func,val) : 프로그램 내의 처리 위치를 출력하기 위한 함.

      func : 함수명

      val :출력할 값이나 구분자.

 

11) 전역변수(Global variable) 사용은 자제하고, 지역변수(Local variable)를 사용할 것.

    변수는 선언 뒤 사용하기 전에 반드시 macro에 정의된 함수를 사용하여 초기화 할 것.

 

12) 서버 프로그램 내에서 업무 로직의 추가 및 삭제가 가능하게 하여 차후 프로그램의 유지보수를 원활히 하기 위하여 SQL 한 문장 당 하나의 local function으로 나누어 개발할 것.

 

13) 서버 프로그램에서 Service를 호출하는 경우 tpforward() 함수를 사용할 것