RDP 프로그램

본 장은 RDP 프로그램 구성, 환경설정 및 컴파일 방법에 대해 기술한다.

1. 개요

RDP는 UCS와 같은 형식의 서버로서 동작한다. RDP는 지속적으로 변하는 데이터를 클라이언트에 효율적이고 빠르게 전달하기 위해 UCS 타입의 프로세스를 커널 수준에서 개량한 프로세스이다.

RDP는 CLH를 거치지 않고 클라이언트로 데이터를 전달하기 때문에 소량의 데이터를 다수의 클라이언트에게 짧은 시간 간격으로 보낼 필요가 있을 때 프로세스 점유율이나 처리 속도의 측면에서 UCS 보다 월등한 성능을 보인다.

2. RDP 서버 프로그램 구성

RDP 서버 프로그램은 기본적으로 UCS 프로그램에서와 같이 usermain()을 통하여 애플리케이션 로직을 구현한다. RDP 서버 프로그램은 다음과 같은 모듈과 라이브러리로 구성된다.

  • $(TMAXDIR)/lib/libsvrrs. so

    프로그램의 main()과 각종 RDP 관련 API 등을 가지고 있는 라이브러리로, RDP 프로그램을 컴파일할 때 항상 링크해야 한다.

  • int tpsvrinit(int argc, char *argv[])

    프로그램을 기동할 때 한 번 수행된다. 대부분 전역 변수 초기화나, Non-XA 경우 데이터베이스 연결 등이 이곳에서 구현된다.

  • int tpsvrdone()

    프로그램 종료할 때 한 번 수행된다. 대부분 사용 리소스 반환이나 Non-XA 경우 데이터베이스 연결 해제 등이 이곳에서 구현된다.

  • int usermain(int argc, char *argv[])

    실제 애플리케이션의 로직이 구현되는 부분으로 대부분 무한 루프 형태로 구현된다. usermain() 모듈에서 반환되면, tpsvrdone()을 수행하고 프로세스가 종료되는 형태이기 때문이다.

    UCS 서버 프로그램과는 달리 RDP 서버 프로그램에서는 tpschedule()이 필요하지 않다. RDP 클라이언트 프로그램은 UCS 클라이언트 프로그램과 같다. tpsetunsol_flag(), tpsetunsol(), tpgetunsol() 등의 API를 사용하여 비요청 메시지를 받을 수 있도록 프로그램을 구현한다. 자세한 사항은 [sect_client_program]을 참조한다.

3. RDP 환경설정 및 컴파일

3.1. 환경설정

RDP를 위한 환경 파일을 생성하기 위해서는 우선 DOMAIN 절의 MINCLH의 개수와 MAXCLH 개수를 동일하게 설정해야 한다. 그리고 NODE 절에 REALSVR 항목에 실제 서버명을 설정하고 rscpc 항목을 설정한다.

실제 서버는 한 노드에 유일하며 노드내의 다른 서버 프로세스도 실제 서버로 데이터를 전송한 후 실제 서버에서 데이터를 클라이언트로 보낸다. 각 서버 프로세스로부터 서비스 결과값은 실제 서버로 보내지게 되는데 사용되는 채널 수를 rscpc에서 설정해야 한다.

SERVER 절에서는 MIN과 MAX의 개수를 DOMAIN 절의 MINCLH와 MAXCLH의 개수보다 보통 2배 정도 많게 설정한다. 그리고 SVRTYPE은 'REALSVR’라 설정한다.

*DOMAIN
tmax1                 SHMKEY =70990, MINCLH=1, MAXCLH=1

*NODE
tmaxi1                TMAXDIR = "/home/navis/tmax",
                      APPDIR  = "/home/navis/tmax/appbin",
                      PATHDIR = "/home/navis/tmax/path",
                      TLOGDIR = "/home/navis/tmax/log/tlog",
                      ULOGDIR = "/home/navis/tmax/log/ulog",
                      SLOGDIR = "/home/navis/tmax/log/slog",
                      REALSVR = “real", rscpc = 16

*SVRGROUP
svg1                  NODENAME = "tmaxi1"
svg2                  NODENAME = "tmaxi1"

*SERVER
deal                  SVGNAME = svg2, MIN=1
real                  SVGNAME = svg1, MIN=2, MAX=2, SVRTYPE = REALSVR

*SERVICE
IN                    SVRNAME = deal
OUT                   SVRNAME = deal

3.2. 컴파일

RDP 서버 프로그램은 컴파일할 때 RDP 라이브러리(libsvrrs.so)와 링크되어야 한다. 프로그램 안에도 $TMAXDIR/usrinc/ucs.h가 include되어야 하고, Makefile의 TMAXLIBS에 반드시 –lsvrrs–lpthread를 포함해야 한다.

다음은 32bit Solaris에서 RDP 서버 프로그램 UCS를 컴파일하기 위한 Makefile의 예이다.

# Server makefile
TARGET  = $(COMP_TARGET)
APOBJS  = $(TARGET).o
SDLFILE  = demo.s

#Solaris의 경우
LIBS      = -lsvrrs -lpthread -lnodb -lsocket -lnsl
OBJS    = $(APOBJS) $(SDLOBJ) $(SVCTOBJ)
SDLOBJ  = ${SDLFILE:.s=_sdl.o}
SDLC    = ${SDLFILE:.s=_sdl.c}
SVCTOBJ = $(TARGET)_svctab.o
CFLAGS  = -O -I$(TMAXDIR)
APPDIR  = $(TMAXDIR)/appbin
SVCTDIR = $(TMAXDIR)/svct
LIBDIR  = $(TMAXDIR)/lib

#
.SUFFIXES : .c
.c.o:
$(CC) $(CFLAGS) -c $<
#
# server compile
#

$(TARGET): $(OBJS)
        $(CC) $(CFLAGS) -L$(LIBDIR) -o $(TARGET) $(OBJS) $(LIBS)
        mv $(TARGET) $(APPDIR)/.
        rm -f $(OBJS)
$(APOBJS): $(TARGET).c
        $(CC) $(CFLAGS) -c $(TARGET).c
$(SVCTOBJ):
        touch $(SVCTDIR)/$(TARGET)_svctab.c
        $(CC) $(CFLAGS) -c $(SVCTDIR)/$(TARGET)_svctab.c
$(SDLOBJ):
        $(TMAXDIR)/bin/sdlc -i ../sdl/$(SDLFILE)
        $(CC) $(CFLAGS) -c ../sdl/$(SDLC)
#
clean:
        -rm -f *.o core $(TARGET)

운영체제에 따라 Makefile의 내용은 다를 수 있다.