본 장은 RDP 프로그램 구성, 환경설정 및 컴파일 방법에 대해 기술한다.
RDP는 UCS와 같은 형식의 서버로서 동작한다. RDP는 지속적으로 변하는 데이터를 클라이언트에 효율적이고 빠르게 전달하기 위해 UCS 타입의 프로세스를 커널 수준에서 개량한 프로세스이다.
RDP는 CLH를 거치지 않고 클라이언트로 데이터를 전달하기 때문에 소량의 데이터를 다수의 클라이언트에게 짧은 시간 간격으로 보낼 필요가 있을 때 프로세스 점유율이나 처리 속도의 측면에서 UCS 보다 월등한 성능을 보인다.
RDP 서버 프로그램은 기본적으로 UCS 프로그램에서와 같이 usermain()을 통하여 애플리케이션 로직을 구현한다. RDP 서버 프로그램은 다음과 같은 모듈과 라이브러리로 구성된다.
int usermain(int argc, char *argv[])
실제 애플리케이션의 로직이 구현되는 부분으로 대부분 무한 루프 형태로 구현된다. usermain() 모듈에서 반환되면, tpsvrdone()을 수행하고 프로세스가 종료되는 형태이기 때문이다.
UCS 서버 프로그램과는 달리 RDP 서버 프로그램에서는 tpschedule()이 필요하지 않다. RDP 클라이언트 프로그램은 UCS 클라이언트 프로그램과 같다. tpsetunsol_flag(), tpsetunsol(), tpgetunsol() 등의 API를 사용하여 비요청 메시지를 받을 수 있도록 프로그램을 구현한다. 자세한 사항은 “2.2.2. 클라이언트 프로그램”을 참조한다.
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
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의 내용은 다를 수 있다.