테스트 환경

클라이언트  Oracle Linux 6.6 

서버            IBM AIX 7.2   

 

 

 

테스트 내용 

client --------> AP Server1 -------->  AP Server2  순서로 서비스 호출

AP Server1 서비스 함수 TOUPPER (소문자 -> 대문자 호출 서비스)

AP Server2 서비스 함수 TOLOWER (대문자 -> 소문자 호출 서비스)

 

 

로직 

Client --------> AP Server1 (client) --------> AP Server2 (server)

          (tpcall)                                (tpcall)

 

즉, AP Server1은 AP Server2의 클라이언트가 된다.

이 로직을 완성시키기 위해서는 AP Server1의 simpserv.c 파일을 클라이언트로 컴파일 해주어야한다.

(클라이언트의 simpcl.c  파일을 참고하여 코딩한다) 

 

 

컴파일된 simpcl(Client) 실행모듈이 TOUPPER 서비스를 호출을 요청하게되면 서버로 보내지게 되고, TOUPPER 서비스를 가지고 있는 AP server인 simpserv 실행모듈은 TOUPPER 서비스를 리턴하지않고 다시 TOLOWER 서비스를 가지고 있는 AP server인 simpserv2 실행모듈이 simpserv(클라이언트)의 호출을 받아 TOLOWER 서비스를 Client에게 return하게 된다.

 

따라서

1. simpcl(클라이언트)이 TOUPPER 서비스를 호출하여도 return 받는 것은  TOLOWER 서비스이다.

2. simpcl(클라이언트)이 TOLOWER 서비스를 호출하여도 return 받는 것은 TOLOWER  서비스이다.

 

 

테스트 결과 

# TOLOWER 호출 -> TOUPPER 리턴 -> TOLOWER 호출 ->  TOLOWER 리턴 
$ ./simpcl thisislowercasetotouppercase
Returned string is: thisislowercasetotouppercase

# TOUPPER 호출 -> TOUPPER 리턴 -> TOLOWER 호출 -> TOLOWER 리턴
$ ./simpcl THISISLOWERCASETOTOUPPERCASE
Returned string is: thisislowercasetotouppercase

 


 

 

 

 

<simpcl.c>

#include <stdio.h>
#include "atmi.h"             


#if defined(__STDC__) || defined(__cplusplus)
main(int argc, char *argv[])
#else
main(argc, argv)
int argc;
char *argv[];
#endif

{

        char *sendbuf, *rcvbuf;
        long sendlen, rcvlen;
        int ret;

        if(argc != 2) {
                (void) fprintf(stderr, "Usage: simpcl string\n");
                exit(1);
        }

        if (tpinit((TPINIT *) NULL) == -1) {
                (void) fprintf(stderr, "Tpinit failed\n");
                exit(1);
        }

        sendlen = strlen(argv[1]);


        if((sendbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
                (void) fprintf(stderr,"Error allocating send buffer\n");
                tpterm();
                exit(1);
        }

        if((rcvbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
                (void) fprintf(stderr,"Error allocating receive buffer\n");
                tpfree(sendbuf);
                tpterm();
                exit(1);
        }

        (void) strcpy(sendbuf, argv[1]);

        ret = tpcall("TOUPPER", (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, (long)0);

        if(ret == -1) {
                (void) fprintf(stderr, "Can't send request to service TOUPPER\n");
                (void) fprintf(stderr, "Tperrno = %d\n", tperrno);
                tpfree(sendbuf);
                tpfree(rcvbuf);
                tpterm();
                exit(1);
        }

        (void) fprintf(stdout, "Returned string is: %s\n", rcvbuf);

        /* Free Buffers & Detach from System/T */
        tpfree(sendbuf);
        tpfree(rcvbuf);
        tpterm();
        return(0);
}

 

 

<simpserv.c>

#include <stdio.h>
#include <ctype.h>
#include <atmi.h>       /* TUXEDO Header File */
#include <userlog.h>    /* TUXEDO Header File */

#if defined(__STDC__) || defined(__cplusplus)
tpsvrinit(int argc, char *argv[])
#else
tpsvrinit(argc, argv)
int argc;
char **argv;

#endif
{
        argc = argc;
        argv = argv;

        userlog("Welcome to the simple server");
        return(0);
}


#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
TOUPPER(TPSVCINFO *rqst)
#else
TOUPPER(rqst)
TPSVCINFO *rqst;
#endif
{
	#변수선언
        int ret;
        char *sendbuf, *rcvbuf;
        long sendlen, rcvlen;
        #구조체연산자
        sendlen = strlen(rqst->len); 


        if((sendbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
                (void) fprintf(stderr,"Error allocating send buffer\n");
                tpterm();
                exit(1);
                tpterm();
                exit(1);
        }

        if((rcvbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
                (void) fprintf(stderr,"Error allocating receive buffer\n");
                tpfree(sendbuf);
                tpterm();
                exit(1);
        }
		
        (void) strcpy(sendbuf, rqst->data);


      
        
        ret = tpcall("TOLOWER", (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, (long)0);


         if(ret == -1) {
                (void) fprintf(stderr, "Can't send request to service TOUPPER\n");
                (void) fprintf(stderr, "Tperrno = %d\n", tperrno);
                tpfree(sendbuf);
                tpfree(rcvbuf);
                tpterm();
                exit(1);

}

        tpreturn(TPSUCCESS, 0, rcvbuf, 0L, 0);


}

 

<simpserv2.c>

 

# vi simpserv2.c

#include <stdio.h>
#include <ctype.h>
#include <atmi.h>       /* TUXEDO Header File */
#include <userlog.h>    /* TUXEDO Header File */


#if defined(__STDC__) || defined(__cplusplus)
tpsvrinit(int argc, char *argv[])
#else
tpsvrinit(argc, argv)
int argc;
char **argv;
#endif
"simpserv2.c" 85 lines, 2155 characters
char **argv;
#endif
{
        argc = argc;
        argv = argv;

        userlog("Welcome to the simple server");
        return(0);
}

#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
TOLOWER(TPSVCINFO *rqst)
#else
TOLOWER(rqst)
TPSVCINFO *rqst;
#endif
{

        int i;

        for(i = 0; i < rqst->len-1; i++)
                rqst->data[i] = tolower(rqst->data[i]);

        tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);

#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
TOLOWER(TPSVCINFO *rqst)
#else
TOLOWER(rqst)
TPSVCINFO *rqst;
#endif
{

        int i;

        for(i = 0; i < rqst->len-1; i++)
                rqst->data[i] = tolower(rqst->data[i]);

        tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);
}

 

 

참고자료 

 

https://mc529.tistory.com/1098?category=979773 

 

Server 프로그램 내에서 여러 개의 서비스를 작성하였을 경우

server 내의 한 서비스에서 동일한 server 내의 다른 서비스를 tpcall()하면 protocol error(TPEPROTO) 발생.  -> TUXEDO가 아직까지 multi-thread를 지원하지 못하기 때문.    이를 해결하기 위한 방법은 다음..

mc529.tistory.com

 

+ Recent posts