Appendix C. Tmax 연동

내용 목차

C.1. Tmax 연동을 위한 클라이언트 프로그램 작성
C.2. 클라이언트 프로그램 컴파일
C.3. Tmax 연동 실행

본 부록에서는 WebtoB와 Tmax 연동을 위한 클라이언트 프로그램의 작성 방법과 컴파일, 연동 실행 방법을 설명한다.

C.1. Tmax 연동을 위한 클라이언트 프로그램 작성

“4.4.1. Tmax 연동을 위한 환경설정”에서 제시한 apsl.m에 대한 클라이언트 프로그램을 아래에 제공한다.

본 예제는 Tmax의 sample 서버 프로그램인 svr2의 TOUPPER 서비스를 이용하는 클라이언트 프로그램으로서 wbsession.c와 wbquery.c로 이루어져 있으며 wbquery.c에 tmax.env의 경로를 지정해야 한다.

참고

Tmax는 별도로 설치해야 하며 Tmax 사용과 sample 서버 svr2의 이용에 대해서는 Tmax 매뉴얼을 참고한다.

다음은 wbsession.c 파일이다.

<wbsession.c>

#include <stdio.h>
#include <string.h>
#include "../usrinc/wbapi.h"

wbsession(WBSVCINFO *rqst) {
 int len;
 char *value, *value2;
 char *name;
 SESSION *session;

 name = wbGetData( rqst, "name" );
 session= wbGetSession( rqst );
 session = wbSessionSetValue( session, "name", name, strlen(name) );
 value = wbSessionGetValue( session , "name", &len );

 wbSendRedirect( rqst, "/svct/query" ); 
 wbReturn( rqst, WBSUCCESS );
}

다음은 wbquery.c 파일이다.

<wbquery.c>

#include <stdio.h>
#include <usrinc/atmi.h>
#include <usrinc/wbapi.h>

int flag=0;

wbSvrInit( int argc, char *argv[] ) {
 fprintf( stdout, "query SERVER Start!\n" );

 if( test_tpstart() == -1 ) {
     fprintf( stdout,"tpstart failed!!! %s \n",tpstrerror(tperrno) );
 }
 return 0;
}

wbSvrDone() {
 fprintf( stdout, "query SVR DONE!\n" );
 tpend();
}

query(WBSVCINFO *rqst) {
  int len;
  char *name;
  SESSION *session;
  session= wbGetSession( rqst );

  name = wbSessionGetValue( session , "name", &len );
  wbPutHdr(rqst,"Content-type","text/html; charset=euc-kr");
  wbPrint( rqst, "<HTML><BODY>" );

  if( query != NULL ) {
      wbPrint(rqst, "<H1>send Data: %s <br></H1>", name);
  }
  else {
      wbPrint( rqst, "<H1>QUERY is null</H1>" );
  }

  if ( test_tpcall(name) == -1 ) {
      wbPrint( rqst, "<H1>tpcall failed : %s</H1>", tpstrerror(tperrno) );
  }
  else {
      wbPrint( rqst, "<H1>recieved Data : %s</H1>",name );
  }

     wbPrint( rqst, "</body></html>" );
     wbReturn( rqst, WBSUCCESS );
}

int test_tpstart() {
  int  rcode;

  rcode = tmaxreadenv( "/data1/gloria/webtob/ap/tmax.env", "TMAX" );

  if ( rcode == -1 ) {
       printf( "tmax readenv failed %s \n", tpstrerror(tperrno));
       return -1;
  }
  rcode = tpstart( (TPSTART_T *)NULL );

  if ( rcode == -1 ){
       printf( "tpstart failed %s \n",tpstrerror(tperrno) );
       return -1;
  }
  return 1;
}

int test_tpcall(char *name) {
  int  rcode;
  char   *sndbuf, *rcvbuf;
  long   rcvlen, sndlen;

  if ((sndbuf = (char *)tpalloc("STRING", NULL, 0)) == NULL){
      printf( "sendbuf alloc failed ! %s \n", tpstrerror(tperrno) );
      tpend();
      return -1;
  }
  if ((rcvbuf = (char *)tpalloc("STRING", NULL, 0)) == NULL){
      printf( "recvbuf alloc failed ! %s \n", tpstrerror(tperrno) );
      tpfree( (char *)sndbuf );
      tpend();
      return -1;
  }
  strcpy(sndbuf, name);

  if(tpcall("TOUPPER", sndbuf, 0, &rcvbuf, &rcvlen, 0)==-1){
      printf("Can't send request to service TOUPPER %s \n", tpstrerror(tperrno));
      tpfree( (char *)sndbuf );
      tpfree( (char *)rcvbuf );
      tpend();
      return -1;
  }
  printf( "[rcvbuf:%s]\n", rcvbuf );
  strcpy( name, rcvbuf );
  tpfree( (char *)sndbuf );
  tpfree( (char *)rcvbuf );
  return 1;
}

위 소스코드에서 Tmax 환경을 참조하는 부분(tmaxreadenv)을 각자 환경에 맞는 경로로 수정한다.

다음은 tmax.env에 대한 예제이다.

<tmax.env>

[TMAX]
TMAXDIR=/data1/gloria/tmax
TMAX_HOST_ADDR=192.168.1.43
TMAX_HOST_PORT=7979
SDLFILE=/data1/gloria/tmax/sample/sdl/tmax.sdl
FDLFILE=/data1/gloria/tmax/sample/fdl/tmax.fdl
TMAX_CONNECT_TIMEOUT=2 [TMAX]
TMAXDIR=/data1/gloria/tmax
TMAX_HOST_ADDR=192.168.1.43
TMAX_HOST_PORT=7979
SDLFILE=/data1/gloria/tmax/sample/sdl/tmax.sdl
FDLFILE=/data1/gloria/tmax/sample/fdl/tmax.fdl
TMAX_CONNECT_TIMEOUT=2

C.2. 클라이언트 프로그램 컴파일

클라이언트 프로그램의 컴파일에 사용하는 Makefile은 다음과 같다.

#Makefile.c
TARGET  = $(COMP_TARGET)
APOBJS  = $(TARGET).o

WEBTOB_INCDIR = $(WEBTOBDIR)/usrinc
WEBTOB_BINDIR = $(WEBTOBDIR)/bin
WEBTOB_LIBDIR = $(WEBTOBDIR)/lib 

###############
# TMAX_LIBDIR #
###############
#32bit Tmax library
TMAX_LIBDIR = $(TMAXDIR)/lib

#64bit Tmax library
#TMAX_LIBDIR = $(TMAXDIR)/lib64

#SDLFILE = demo.s
#SDLDIR = $(WEBTOBDIR)/sdl

##########
# CFLAGS #
##########

#hp 32bit
CFLAGS = -Ae +DA1.1 +DD32 +DS2.0 -O -I$(WEBTOBDIR)
         -L/data1/gloria/tmax/lib

#hp 64bit
#CFLAGS = -Ae +DA2.0W +DD64 +DS2.0 -O -I$(WEBTOBDIR)
          -L/data1/gloria/tmax/lib

#sun 64bit
#CFLAGS = -xarch=v9 -O -I$(WEBTOBDIR)

#Linux
#CFLAGS = -O -I$(WEBTOBDIR)

#ibm 32bit
#CFLAGS = -q32 -O -I$(WEBTOBDIR) -brtl

#ibm 64bit
#CFLAGS = -q64 -O -I$(WEBTOBDIR) -bnoquiet -brtl

########
# LIBS #
########

#hp, sun, linux
LIBS = -laps -lcli 

#ibm
#LIBS = -laps -lcli -lz

OBJS   = $(APOBJS) $(SVCTOBJ) $(SDLOBJ)
SVCTOBJ = $(TARGET)_svctab.o
#SDLOBJ  = ${SDLFILE:.s=_sdl.o}
#SDLC    = ${SDLFILE:.s=_sdl.c}

.SUFFIXES : .v

.c.o: 
 $(CC) $(CFLAGS) -c $<

# Server
$(TARGET): $(APOBJS) $(SVCTOBJ)  
 $(CC) $(CFLAGS) -L$(WEBTOB_LIBDIR) -L$(TMAX_LIBDIR) -o $(TARGET) $(OBJS) $(LIBS) 
 @rm -f *.o
 @rm -f *_svctab.c

$(SVCTOBJ):  
 cp $(WEBTOBDIR)/svct/$(TARGET)_svctab.c .
 $(CC) $(CFLAGS) -I$(WEBTOB_INCDIR) -c $(TARGET)_svctab.c

#
clean:
 -rm -f *.o core

위의 Makefile.c는 다음의 컴파일을 이용하여 사용한다.

#!/bin/ksh
# program compile
#
#main
        Param=$1
        case "$Param" in
                c)       export COMP_TARGET=$2
                         make -f Makefile.c;;
              api)       export COMP_TARGET=$2
                         make -f Makefile.api;;
               pc)       export COMP_TARGET=$2
                         make -f Makefile.pc all;;
            clean)       make -f Makefile.pc clean;;
                *)       echo "Usage: $0 argument";;
        esac

다음은 실행에 대한 예제이다.

$ compile c wbsession
$ compile c wbquery

C.3. Tmax 연동 실행

위 예제를 이용하여 Tmax와의 연동을 실행해 보기 위한 순서는 다음과 같다.

  1. WebtoB 환경 파일을 컴파일한다.

    $ wscfl –i apsl.m

  2. 서비스 테이블을 생성한다.

    $ wsgst

  3. 클라이언트 프로그램을 컴파일한다.

    $ compile c wbsession
    $ compile c wbquery

  4. Tmax의 서버 프로그램을 컴파일한다.

    $ compile c svr2

  5. Tmax를 기동한다.

    $ tmboot

  6. WebtoB를 기동한다.

    $ wsboot

    실행 결과를 보기 위해 다음의 toupper.html과 같은 HTML 페이지를 이용한다.

    <html>
    <head>
     <title>wbGetQueryString</title>
    </head>
    <body>
    <form method=post action="/svct/wbsession">
    <table width=370>
    <br>
    <tr>
              <td> input send Data</td>
                    <td><input type=input name=name></td>
                    <td><input type=submit value="submit"></td>
    </tr>
    </table>
    </form>
    </body>
    </html>

    [그림 C.1] toupper.html

    toupper.html

    [그림 C.2] TOUPPER 서비스 결과 화면

    TOUPPER 서비스 결과 화면