본 부록에서는 WebtoB와 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
클라이언트 프로그램의 컴파일에 사용하는 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
위 예제를 이용하여 Tmax와의 연동을 실행해 보기 위한 순서는 다음과 같다.
WebtoB 환경 파일을 컴파일한다.
$ wscfl –i apsl.m
서비스 테이블을 생성한다.
$ wsgst
클라이언트 프로그램을 컴파일한다.
$ compile c wbsession $ compile c wbquery
Tmax의 서버 프로그램을 컴파일한다.
$ compile c svr2
Tmax를 기동한다.
$ tmboot
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>