Microsoft Word - Tmax TCP IP Gateway Guide.doc

Size: px
Start display at page:

Download "Microsoft Word - Tmax TCP IP Gateway Guide.doc"

Transcription

1 Tmax TCP IP Gateway Guide Copyright 2000 TmaxSoft Co., Ltd. All Rights Reserved

2 Copyright Notice Copyright 2000 TmaxSoft Co., Ltd. All Rights Reserved. TmaxSoft Co., Ltd. 대한민국서울시강남구대치동 글라스타워 18 층우 ) Restricted Rights Legend This software and documents are made available only under the terms of the TmaxSoft License Agreement and may be used or copied only in accordance with the terms of this agreement. No part of this document may be reproduced, transmitted, or translated in any form or by any means, electronic, mechanical, manual, or optical, without the prior written permission of TmaxSoft Co., Ltd. 소프트웨어및문서는오직 TmaxSoft Co., Ltd. 와의사용권계약하에서만이용이가능하며, 사용권계약에따라서사용하거나복사할수있습니다. 또한이매뉴얼에서언급하지않은정보에대해서는보증및책임을지지않습니다. 이매뉴얼에대한권리는저작권에보호되므로발행자의허가없이전체또는일부를어떤형식이나, 사진녹화, 기록, 정보저장및검색시스템과같은그래픽이나전자적, 기계적수단으로복제하거나사용할수없습니다. Trademarks Tmax, WebtoB, WebT, and JEUS are registered trademarks of TmaxSoft Co., Ltd. All other product names may be trademarks of the respective companies with which they are associated. Tmax, WebtoB, WebT, JEUS 는 TmaxSoft Co., Ltd. 의등록상표입니다. 기타모든제품들과회사이름은각각해당소유주의상표로서참조용으로만사용됩니다. Tmax TCP/IP Gateway Guide Document Edition Date Version TMTGW Aug 2, 2005 Tmax 4.00 Tmax 제품은아래표와같습니다. 본서는 Tmax Standard 와옵션중에굵게기울임꼴로인쇄되어있는내용을포함하고있습니다. 1 Tmax TCP IP Gateway Guide

3 Tmax Standard Tmax Options TP Function + 2 Phase Commit Web Admin Console, X.25 Gateway, TCP/IP Gateway, Host-Link, Power Builder Interface Module, SERIAL Gateway, TCP/IP Service Gateway, TCP/IP Thread Gateway 이책에관하여 TCP/IP Gateway Development Guide 는 TCP/IP Gateway 를사용하여 Tmax 시스템을개발하는경우의시스템적인측면과개발자측면에서의요구사항및주의사항에대한내용을언급한다. TCP/IP Gateway 는리모트노드와 Tmax 를연결하면서복잡한프로그래밍은 TCP/IP Gateway 라이브러리에서담당하고, 각사이트마다 customizing 을해야할부분은 TCP/IP Gateway 에서제공하는 custom.h, custom.c 에서수정하면되므로간단하게 TCP/IP Gateway 를작성할수있다. 이에 Tmax 에서 TCP/IP Gateway 를사용할수있도록환경파일을설정하는부분과 custom.h, custom.c 을어떻게수정해야하는지를살펴보고, 실질적인예를제시하여개발자의이해를돕는다. 누구를위한책인가? 이책은 TCP/IP 를통하여타시스템과연결을해야하는시스템을구축하는개발자들을위한책이다. 이를활용하면개발자들이좀더편리하게 TCP/IP 로연결된시스템을손쉽게구축할수있다. 이책의완전한활용을위해서는 TCP/IP, Tmax Server Programming, Unix C 등에관련된프로그래밍능력을필요로한다. 어떻게사용하는가? TCP/IP Gateway 의개요에대해알아본다. TCP/IP Gateway 서비스의유형에대해알아본다. TCP/IP Gateway 를사용하기위한환경파일과 custom.h, custom.c 의작성에대해알아본다. TCP/IP Gateway 의사용예제를알아본다. 관련서 Tmax Administration Guide 규약 규약설명 Tmax TCP IP Gateway Guide 2

4 [ ] ( ) Numeric String Literal 필수항목옵션항목지정된여러개의값중배타적인선택구분자디폴트값숫자 abc 형태의문자열 abc 형태의문자열 3 Tmax TCP IP Gateway Guide

5 차례 1 TCP/IP Gateway 의개요 개요 TCP/IP Gateway 서비스의유형 동기형 TCPGW 서비스블록형방식 서비스 NON 블록형방식 리모트동기형호출방식 비동기형 TCPGW TMAX단에서서비스요청방식 리모트단에서서비스요청방식 서버 TCPGW 클라이언트 TCPGW TCP/IP Gateway 환경설정 Tmax 환경구성 TCPGW의사용옵션 서버 / 클라이언트 TCPGW의환경파일 서비스블록형 TCPGW의환경파일 서비스 NON-블록형 TCPGW의환경파일 리모트동기형과비동기형 TCPGW 환경파일 재연결 TCPGW 환경파일 여러리모트노드와연결을맺는클라이언트 TCPGW 사용자헤더환경설정및사용방법 사용자헤더환경파일 사용자헤더사용방법 Gateway 기타기능 Gateway 헤더 다중응답처리 Tmax TCP IP Gateway Guide 4

6 3.3.3 서비스명을찾는순서 사용자임의의채널지정 코드변환 TCP/IP Gateway 사용자프로그램 (custom.h, custom.c) custom.h 수정 custom.c 수정 register.c 수정 예제 OUTBOUND TCPGW 예제 개요및프로그램내용 프로그램구성 동기 TCPGW 예제 ( INBOUND ) 개요및프로그램내용 NON 블록킹 TCPGW 예제 부록 CUSTOM INFO 구조체 CUSTOM INFO Flags TCPGW 에러코드 Tmax TCP IP Gateway Guide

7 1 TCP/IP Gateway 의개요 1.1 개요 TCP/IP Gateway( 이하 TCPGW 라칭함 ) 는 Tmax 서버와 Non Tamx 서버 ( 리모트노드라칭함 ) 간의 Interface 를담당하는 Tmax 에서제공되는 Gateway 이다. 이 TCPGW 는 Tmax 서버의한종류로써 TCP/IP 로연결되어있는 Unix/Windows 서버등과의 Gateway 역할을한다. TCPGW 는 Tmax 서버의한종류로서 Tmax 환경파일에서버로등록해야만사용할수있다. 하지만일반다른서버들을만드는방식과는다르게생성해주어야한다. 일반서버는 TCS 나 UCS 용서버라이브러리를이용하여서버를생성하나, TCPGW 는외부와통신을담당하는라이브러리 (libtcpgw.a, libtcpgw.so) 와사용자가작성한프로그램 (custom.c) 과 Link 하여서버를생성한다. Non Tmax 에서보내온메세지를 TCPGW 는해당서비스를 tpacall() 하며, 서비스결과는처음요청한 Non Tmax 서버로전송한다. 반대로 Tmax 서비스에서 TCPGW 를 tpcall() 이나기타다른방식으로서비스를요청하면 TCPGW 는 Non Tmax 로요청메시지를보낸후응답이오면자신을 call 한서비스로 tpreturn() 한다. 이와같이복잡하게타시스템과 TCP/IP 로연결하기위해필요한작업들, 예를들어 socket 을열고메시지를주고받는일등은모두 TCP/IP Gateway 에서처리해주고, 개발자는업무로직만을작성하면되므로개발자들은손쉽게타시스템과연결할수있다. TCPGW 의대략적인동작구조는다음과같다. Tmax TCP IP Gateway Guide 6

8 그림 1-1 TCPGW 동작구조 TCPGW 는위의그림에서보듯이리모트노드로부터서비스요청을받아서처리할수있고 ( 그림 1-1 에서실선표시 ), Tmax 클라이언트는서비스로부터서비스요청을받아서리모트노드로서비스요청을할수도있다 ( 그림 1-1 에서점선표시 ). 이와같이리모트노드로부터서비스요청을받아서처리하는것을 OUTBOUND 서비스라하고, Tmax 클라이언트로부터서비스요청을받아서리모트노드로서비스요청을하는것을 INBOUND 서비스라한다. 그림 1-2 동기 / 비동기 TCPGW 동작구조 Tmax 클라이언트나서비스에서 TCPGW 를바로호출하고응답이올때까지기다리는동기적인호출방식 ( 그림 1-2 에서점선표시 ) 이있다. 이와는달리비동기적인호출방식은 Tmax 클라이언트가 Tmax 서비스를호출하면그서비스에서 TCPGW 로제어권이넘어가서해당서비스는다른서비스요청을받을수있게되고, TCPGW 가리모트노드로부터 7 Tmax TCP IP Gateway Guide

9 응답을받게되면응답을처리하는서비스로요청을넘겨주는방식으로동작하게된다 ( 그림 1-2 에서실선표시 ). 이러한여러가지동작방식에대해서는 2 장. TCP/IP Gateway 서비스의유형에서좀더상세히설명하도록한다. 이러한여러가지유형에맞추어 TCPGW 를작성하기위해서는 Tmax 환경을적절히설정하고프로그램 (custom.c, custom.h) 을작성해야하므로더자세한사항은본메뉴얼의 3 장. TCP/IP Gateway 의구성과 4 장. 예제에서더상세히설명하도록한다. Tmax TCP IP Gateway Guide 8

10 2 TCP/IP Gateway 서비스의유형 TCPGW 는 Tmax 에서제공하는라이브러리 (libtcpgw.a, libtcpgw.so) 와개발자가작성하는 custom.c, custom.h 를함께링크하여만들어진다. 이렇게만들어진 TCPGW 는리모트노드와통신을하며, Tmax 클라이언트의요청을리모트노드로보내기도하고리모트노드의요청을 Tmax 서비스에서처리하도록중간역할을해준다. TCPGW 는크게동작하는방식에따라동기형 TCPGW 와비동기형 TCPGW 로나눌수있고, 기동하는방법에따라서버 TCPGW 와클라이언트 TCPGW 로나눌수있다. 여기서설명하는서버와클라이언트모드는리모트노드와 TCPGW 사이에연결시어떤쪽에서먼져연결을시도하는지에따른모드이다. 일단상대방과연결되면서버나클라이언트모드는의미가없다. 어느쪽에서나먼저서비스를요청할수있기때문이다. 이제이 4 가지의 TCPGW 의서비스유형에대해서설명하도록한다. 2.1 동기형 TCPGW 여기서설명하는동기형방식은 Tmax 의클라이언트나서버에서서비스를요청하고응답이서비스를요청한클라이언트나서버로오는방식을말한다. 반대로리모트노드에서서비스를요청하면 TCPGW 는 Tmax 의서비스를요청하고그결과를서비스를요청한리모트노드에되돌려주는방식이다. 전자인경우리모트노드로서비스를요청한 Tmax 서비스가블록되는가, 또는블록되지않는가에따라 TCPGW 는다르게동작한다. 또한, 후자인경우에는리모트노드에서요청한처리결과를돌려줄때요청한채널로돌려주는방식이다. Tmax 단의클라이언트나서버에서리모트노드로동기형방식으로서비스를요청할경우에는반드시 TCPGW 와리모트노드간에 UID(Unique Id.) 를서로공유해야한다. 9 Tmax TCP IP Gateway Guide

11 2.1.1 서비스블록형방식 이방식은 Tmax 의서버나클라이언트에서 TCPGW 로서비스를요청하고, 그결과가올때까지기다리는가장일반적인방식이다. 아래그림처럼 Tmax 클라이언트의요청을받은서비스에서 TCPGW 로서비스로 tpcall 을하면리모트노드에서처리결과를송신할때까지 Tmax 서비스 (SVC1) 가블럭되어있게된다. 그림 2-1 블록형동기 TCPGW TCPGW 와리모트노드는연결되어있는상태이다. Tmax 클라이언트는 Tmax 서비스를 tpcall 한다. Tmax 서비스에서는클라이언트의요청을받아들여 TCPGW 로서비스를 tpcall 한다. TCPGW 는연결되어있는리모트노드에서비스를요청한다. 리모트노드에서결과가오면에러인지아닌지를판단하여 TCPGW 서비스를호출한 Tmax 서비스로 tpreturn 한다. Tmax TCP IP Gateway Guide 10

12 결과를받은 Tmax 서비스는 Tmax 클라이언트로 tpreturn 한다. 이와같은방식으로 TCPGW 를동작시키게되면 Tmax 클라이언트에서호출한 Tmax 서비스는 TCPGW 를호출한후에결과를받을때까지블럭이되어있게된다. (tpacall() 을한경우도 tpgetrply() 로응답을받는곳에서블럭이되기때문에 tpcall() 과마찬가지로블럭이되게된다.) 따라서많은수의요청을받아들이기위해서는블럭이되는시간까지감안하여많은수의서버를실행해야한다. 이는대외기관통신에서는대외기관의장애 ( 머신, 네트워크 ) 에따라서많은수의서버가필요로하기때문이다 서비스 NON 블록형방식 이방식은 Tmax 클라이언트에서직접 TCPGW 를요청하는방식에서는사용할수없고, TCPGW 에서비스를요청하고결과를수신하는서버를중간에두어서처리하는방식이다. 즉, TCPGW 앞에송신서비스와수신서비스를두고 Tmax 클라이언트는송신서비스를호출하고, 송신서비스는 TCPGW 로서비스를 forward 하고서비스를종료한다. TCPGW 는리모트노드로서비스를요청하여그결과를수신하면, 해당결과를수신서비스에게전달한다. 수신서비스는 TCPGW 로부터결과를수신받아클라이언트에게전달하면서비스사이클이종료되는방식이다. 결과적으로클라이언트는서비스를요청하고결과를받는동기방식이나서버는요청을전달하고종료하는비동기방식처럼동작한다. 그림 2-2 NON 블록형동기 TCPGW TCPGW 와리모트노드는연결되어있는상태이다. 11 Tmax TCP IP Gateway Guide

13 Tmax 클라이언트는 Tmax 서비스를 tpcall 한다. Tmax 서비스에서는클라이언트의요청을받아들여 TCPGW 서비스를 tpforward 한다. TCPGW 는연결되어있는리모트노드에메세지를전송한다. 리모트노드에서결과가오면에러인지아닌지를판단하여 tprelay 서비스로 tprelay 한다. 할 TCPGW 서비스로부터결과를받은서비스 (Tmax 클라이언트로부터 tprelay 할서비스로지정된서비스 ) 는 Tmax 클라이언트로 tpreturn 한다. 이와같이동작하는 TCPGW 는블록형방식에서수행하는방식보다도적은서버로도많은처리를할수있다. 블록형방식은서비스가 TCPGW 를호출하고블록되기때문에동시에많은처리를위해서는보다많은서버프로세스를실행해야하나, NON 블록형방식에서는자신의일만처리하고서비스를종료하기때문에적은서버프로세스로도많은일을할수있다. 따라서대외기간간에통신을처리하는경우에는 NON 블록형방식이보다효율적이라고할수있다 리모트동기형호출방식 이방식은리모트노드에서 TCPGW 로먼저서비스를요청하는방식이다. TCPGW 는리모트노드에서요청한서비스를호출하고그결과를받아서해당서비스를요청한채널로결과를전송한다. 리모트노드는동시에 TCPGW 로 Tmax Config 에정의되어있는 MAXSACALL 개수를초과하여호출할수없다. Tmax TCP IP Gateway Guide 12

14 그림 2-3 리모트요청동기형 TCPGW TCPGW 와리모트노드는연결되어있는상태이다. 리모트노드는 TCPGW 와연결된채널로메세지를전송한다. TCPGW 는 tpacall() 로 Tmax 서비스를호출한다. 서비스처리결과를 TCPGW 는받아서메세지를요청한채널을찾는다. 해당채널이정상적으로연결되어있으면결과를전송한다. 이와같은동작방식은리모트노드에서 Tmax 단의서비스를호출하는가장보편적인방식이다. TCPGW 는리모트노드의채널정보를보관하였다가서비스로부터결과를수신받으면, 보관하고있는채널중에서해당채널을찾아서결과를전송한다. 이때해당채널로결과를되돌려주기전에다른요청은얼마든지가능하다. 즉, TCPGW 는리모트노드에서요청한채널은블록시키지않고다음요청을받을수있도록처리하기때문에 TCPGW 를어떻게운영하는방식에따라서다르게처리할수있다. 2.2 비동기형 TCPGW 비동기형호출방식은 Tmax 단의클라이언트나서버, 또는리모트노드에서 TCPGW 서비스를요청만하고, 그결과는받지않거나또는 13 Tmax TCP IP Gateway Guide

15 서비스를요청한곳이아닌다른프로그램에서처리하는방식을말한다. 먼저 Tmax 단의서비스에서 TCPGW 로서비스를요청하고그결과는다른서비스로받을수있다. 그러나클라이언트인경우에는비동기형으로처리할때는 tpacall 로써응답을받지않는경우에만가능하다. 반대로, 리모트노드에서서비스를먼저요청하는경우에위에서와같이서비스만요청하고결과를받지않을수도있고, 서비스를요청하고결과는다른채널로돌려주는방식이비동기형방식이다 TMAX 단에서서비스요청방식 이방식은 Tmax 단의서비스에서 TCPGW 로 tpacall 에 TPNOREPLY 로요청하고해당서비스는종료한다. TCPGW 는리모트노드로요청를보내고해당결과가수신되면 Tmax 단의다른서비스를 tpacall 에 TPNOREPLY 로호출하여결과를처리하게하는방식이다. 그림 2-4 비동기형 TCPGW 1 Tmax 서비스에서 TCPGW 로서비스를요청한다 (tpacall 에 TPNOREPLY) 2 TCPGW 는리모트노드로데이터를전송한다. 3 TCPGW 는리모트노드로부터데이터를수신한다. Tmax TCP IP Gateway Guide 14

16 4 TCPGW 는 Tmax 단의다른서비스를호출한다. (tpacall 에 TPNOREPLY) 리모트단에서서비스요청방식이방식은리모트노드에서먼저서비스를 TCPGW 로요청하면, TCPGW 는 tpacall 로 Tmax 서비스를요청한다. Tmax 단의서비스처리가완료되면 TCPGW 는리모트노드와연결된채널중에서사용가능한채널중아무채널에처리결과를전송한다. 그림 2-5 비동기형 TCPGW 1 리모트노드에서 TCPGW 로서비스를요청한다. 2 TCPGW 는 Tmax 의서비스를 tpacall 로요청한다. 3 Tmax 의서비스를처리결과를 TCPGW 에전달한다. 4 TCPGW 는리모트노드와연결된채널중에서채널테이블에서채널을검색하여결과를전송한다. 15 Tmax TCP IP Gateway Guide

17 2.3 서버 TCPGW 서버 TCPGW 와클라이언트 TCPGW 는연결을맺을때만차이가있고연결이맺어진이후에는기능상차이가없다. 서버 TCPGW 는 TCPGW 에서 Listen 하고있으면리모트노드에서 Connect 하게된다. 서버 TCPGW 는클라이언트 TCPGW 와마찬가지로리모트노드와 Tmax 클라이언트어디서든지서비스요청을할수있다. 그림 2-3 서버 TCPGW TCPGW 는 Tmax boot 시에리모트노드에서연결할수있도록연결을기다리고 (listen 하고 ) 있는다. 리모트노드에서는 TCPGW 로연결 (connect) 을한다. 2.4 클라이언트 TCPGW 클라이언트 TCPGW 는리모트노드에서 listen 하는 port 로 connect 를맺으면서기동된다. 서버 TCPGW 는클라이언트 TCPGW 와마찬가지로리모트노드와 Tmax 클라이언트어디서든지서비스요청을할수있다. Tmax TCP IP Gateway Guide 16

18 그림 2-4 클라이언트 TCPGW 리모트노드에서는 TCPGW 가연결할수있도록연결을기다리고 (listen 하고 ) 있는다. TCPGW 는 Tmax boot 시에리모트노드와연결 (connect) 을한다. 17 Tmax TCP IP Gateway Guide

19 3 TCP/IP Gateway 환경설정 TCPGW 서버가구성되려면다음과같은파일들이존재하여야한다. UNIX Directory 파일명 lib libtcpgw.a, libtcpgw.so libtmaxgw.a libtmaxgw.so lib64 libtcpgw.a, libtcpgw.so libtmaxgw.a libtmaxgw.so Windows Directory bin lib 파일명 tcpgw.dll tmaxgw.dll tcpgw.lib tmaxgw.lib 위의파일 (TCPGW 라이브러리 ) 들은 Tmax 인스톨시에각디렉토리아래에만들어지지만 custom.c 나 custom.h 는따로제공되므로필요시기술지원담당자에게요청해야한다. TCPGW 라이브러리와적절하게구현한 custom.c, custom.h 를컴파일하여 TCPGW 를생성하게된다. Tmax TCP IP Gateway Guide 18

20 3.1 Tmax 환경구성 TCPGW 를사용하기위해서는 Tmax 환경파일에 TCPGW 를서버로서등록해야한다. Tmax 서버중 UCS 형서버와등록방법이비슷한데, 차이점은 SVRTYPE 이 UCS 에서 CUSTOM_GATEWAY 라는차이밖에없다. 등록하는방법은아래와같다. *DOMAIN tmax SHMKEY = 88000, MINCLH = 1, MAXCLH=1, TPORTNO=8800 *NODE tmax1 TMAXDIR="/home/tmax", APPDIR="/home/tmax/appbin" *SVRGROUP svg1 NODENAME=tmax1 *SERVER tcpgw SVGNAME=svg1, MIN=1, MAX=1, 7 CPC=10, SVRTYPE=CUSTOM_GATEWAY, CLOPT="-- -P N 10 -k 71673" *SERVICE TCPGW1 TCPGW2 SVRNAME=tcpgw, SVCTIME=20 SVRNAME=tcpgw, SVCTIME=25 TCPGW 를사용하기위해 Tmax 환경파일을수정할때는 SERVER, SERVICE 절만적절히설정하면된다. MIN : TCPGW의프로세스개수를지정하는항목으로써이항목의값이 1보다클경우에 TCPGW가서버모드인지, 클라이언트모 19 Tmax TCP IP Gateway Guide

21 드인지에따라서사용하는포트번호가다르다. 서버모드 MIN 값이 2 이상이면두개이상의프로세스에서같은포트를 Listen 할수없으므로 TCPGW 는아래에설명하는옵션중 P 옵션으로입력하는포트번호에자신의서버번호를사용한다. 예를들어포트번호가 5050 이면첫번째프로세스는 5050 포트번호를, 두번째프로세스는 5051 를이런식으로 1 씩증가되면서프로세스개수만큼포트를사용한다. 그러므로프로세스수가 2 개이상이면지정한프로세스수만큼포트번호가사용가능한지확인해야한다. 클라이언트모드 클라이언트로동작할경우에는세가지방식으로사용할수있다. 첫번째는리모트노드에서하나의포트번호를 Listen 하고, 모든 TCPGW 프로세스는리모트노드에서 Listen 하고있는포트로연결하는방식이다. 두번째는 C 옵션을사용하여서버모드처럼포트번호를 TCPGW 프로세스별로다르게사용할수있다. p 옵션으로지정한포트번호에서버번호를더해서리모트노드에연결을시도한다. 이경우에리모트노드는여러개의포트번호를 Listen 하고있어야한다. 또한프로세스수만큼지정한포트가사용가능해야한다. 세번째는 f 옵션을사용하여여러개의리모트노드에연결하는방식으로연결하고자하는리모트노드의정보를별도의파일에등록하고 f 옵션을사용하여해당파일명을지정하면 TCPGW 는해당파일의정보를로드하여리모트클라이언트와연결한다. CPC : CPC 항목은 Tmax engine 과 TCPGW 간의채널수를지정 하는항목으로써, Tmax 의클라이언트나서비스에서리모트노드 로요청하는경우에는동시에요청하는수만큼 CPC 수를지정해 Tmax TCP IP Gateway Guide 20

22 야한다. 이경우에도 NON 블록형인경우에는동시요청수만큼 지정할필요가없이적당한수만큼만지정하면된다. 반대인경우 에는 TCPGW 는 Tmax engine 으로 tpacall 로요청하므로많은채 널을사용할필요는없다. CLOPT: 아래설명참조 SVCTIME: TCPGW 는하나의서버프로세스에여러개의서비스를지정하여서비스마다 SVCTIME 값을다르게적용할수있다. 이를위해서 *SERVICE 절에여러개의서비스를지정하고, 서비스마다 SVCTIME 값을다르게지정하면 TCPGW 는해당요청한서비스별로지정한서비스 Time 값을사용한다 TCPGW 의사용옵션 TCPGW 는 Tmax config 파일에등록할수있는항목이제안되어있는관계로 CLOPT 항목에많은옵션을설정할수있다. 아래에설명하는옵션에따라서 TCPGW 이동작방식이다르므로아래의설명을정확히이해해야한다. 서버모드로 TCPGW 가동작할경우에 Listen 하고자하는 IP 주소를지정하는옵션이다. 이항목은지정한 IP 주소에대해서만연결을받아들이고자하는경우에사용한다. R 클라이언트모드로 TCPGW 가동작하는경우 -M 옵션을같이사용하여동작모드를변경하여 TCPGW 가연결하고자하는리모트노드의 IP 를지정할수있다. 예를들어옵션을 -R P 8080 r p 8081 M 1 N 10 n 10 지정하면 TCPGW 는들어오는채널에대해서는 IP 주소에 8080 포트로 10 개의채널을연결하고, 나가는채널에대해서는 IP 주소에 8081 포트로 10 개의채널을연결한다. 이와같이클라이언트로동작하는경우에리모트노드의 IP 주소를따로지정할수있다.. 21 Tmax TCP IP Gateway Guide

23 TCPGW 가클라이언트모드로동작할경우리모트노드의 IP 주소를지정하는옵션이다. 이옵션은클라이언트모드에서백업기능및멀티서버채널정보설정을위해서다음과같이문법이강화되었다. r -r mainaddr[:mainport][/backupaddr[:backupport]][(type)][,...] mainaddr, backupaddr 은 IP 주소이며, mainport, backupport 는포트번호이다. type 은 I(IN CHANNEL), O(OUT CHANNEL), A(ANY CHANNEL) 로설정할수있다. I 일경우는 IN CHANNEL 이 -N 옵션으로지정된수만큼생성되며, O 일경우는 OUT CHANNEL 이 -n 옵션으로지정된수만큼생성되고, A 일경우는 IN CHANNEL 이 -N 옵션, OUT CHANNEL 이 -n 옵션으로지정된수만큼생성된다. P 서버모드인경우에는 Listen 하고자하는포트번호이다. 해당포트번호는다른프로세스에서사용하지않은포트번호이어야한다. 클라이언트모드인경우에는 -R 옵션에서설명한것처럼클라이언트포트번호로도사용할수있다. p 리모트노드가 Listen 하고있는포트번호를설정한다. 해당포트번호는다른프로세스에서 Listen 하지않은포트번호이어야한다. M 서버모드로입력한 IP 주소와포트번호를클라이언트모드로바꾸는옵션이다. -R P 옵션으로입력한값은서버모드의 IP 주소와포트번호인데, 이를리모트노드에연결하고자하는리모트노드의 IP 주소와포트번호로바뀌도록하는옵션이다. -M 0 의미는기본적인 TCPGW 의모드값이다. 그러나 -M 1 로하면서버모드에서클라이언트모드로변경된다. (Default: 0) Tmax TCP IP Gateway Guide 22

24 m TCPGW 와통신하는리모트노드의코드체계가다를경우에데이터를변환하는옵션이다. 이옵션은송수신데이터를 ASCII EBCDIC, 조합형한글 완성형한글로변환한다. 이옵션을사용할경우에사용자는송수신데이터의 map 파일을등록해야한다. 코드변환에대해서는아래의설명을참조하십시오.(Default: 변환하지않음 ) N 리모트노드에서 TCPGW 로들어오는채널수를지정하는옵션이다. 이옵션은서버모드나클라이언트모드에관계없이사용하는옵션이다. n TCPGW 에서리모트노드로나가는채널수를지정하는옵션이다. 이옵션은 TCPGW 가클라이언트로동작하는경우에만의미가있다. k 이옵션은사용자가공유메모리를확보하여위에서설명한 -N n 으로주어진채널의상태를사용자가저장할수있도록공유메모리의키값을입력하는옵션이다. TCPGW 는이옵션으로미리공유메모리를확보하지않고전적으로사용자에게전달하여사용자가임의로사용하도록전달하는역할만한다. 보통이옵션은 TCPGW 가최초실행시사용자 Routine(init_remote_info) 를호출할때넘겨주어서사용자가공유메모리를확보하는데사용한다. F 이옵션은특수용도록사용하는옵션으로 CLOPT 항목의옵션으로위에서설명한 IP 주소나포트번호를입력하지않고 Config 파일에등록하여사용하는옵션이다. 이옵션은특수용도록사용함으로일반사용자는사용할수없다. 23 Tmax TCP IP Gateway Guide

25 f 이옵션은 TCPGW 를 Client 로사용하는경우에사용하는옵션으로 r p 옵션이하나의리모트노드의 ip 와연결하는것이라면 f 옵션은여러리모트노드와의연결을맺기위한옵션이다. 이경우에연결하고자하는리모트정보를별도의파일에등록하고 f 옵션을사용하여해당파일명을지정하면 TCPGW 는해당파일의정보를로드하여리모트노드와연결한다. 이옵션은 r, p 옵션과함께사용할수없으며또한 TCPGW 를서버로사용하는경우에는사용할수없다. 단지클라이언트모드에서만사용가능하다. 그리고매요청시마다리모트노드에연결하는 E 옵션도사용할수없다. f 옵션을사용하면리모트노드와항상연결을맺고있어야한다. C 이옵션은 TCPGW 가클라이언트모드로동작하면서동시에같은 TCPGW 프로세스가 2 개이상 (MIN=2) 실행시리모트노드와연결하는포트번호를지정하는옵션이다. 이옵션을지정하면 TCPGW 는 -p 으로지정한포트번호에서버번호를더한포트번호로리모트노드에연결을시도한다. 예를들어 -p 8080 C 옵션을사용하고 MIN=3 으로했을경우첫번째 TCPGW 프로세스는 8080 포트번호를, 두번째 TCPGW 프로세스는 8081 포트번호를, 세번째는 8082 포트번호를사용한다. 이옵션은리모트노드와통신시 TCPGW 로들어오는채널과나가는채널을분리하여사용하고자하는경우에사용한다. 또는이옵션은요청이 Tmax 단에서리모트노드로발생할경우에만의미가있다. c TCPGW 는이옵션이지정되면 Tmax 단에서들어온요청을나가는채널로전송한다. 그리고리모트노드로부터나가는채널로데이터가수신되면이를이전에전송한데이터의 ACK 응답으로처리하고, 요청에대한응답은들어오는채널로수신한다. 즉, TCPGW 와리모트노드사이에요청한데이터에대해서잘받았다는 ACK 정보를주고받고자하는경우에사용하는옵션이다. 반대로요청에대한 ACK 는보내지않는다. Tmax TCP IP Gateway Guide 24

26 이옵션은 NON 블록킹모드로 TCPGW 를사용하거나또는비동기방식으로사용하고자할때 TCPGW 가요청할서비스명을등록하는옵션이다. S NON 블록킹모드로사용할때 Tmax 단의송신서비스는 TCPGW 로 tpforward 하고, 리모트노드에서수신한응답을 TCPGW 는수신 서비스에게 tprelay 하기위해서 relay 될서비스명을등록한다. 또한, 비동기통신방식에서 Tmax 클라이언트나서비스는 TCPGW 로 서비스를요청 (tpacall with TPNOREPLY) 하고끝난다. 이후에리모트 노드에서 수신받은 응답은 일반적으로는 TPNOREPLY 로 호출했으므로 데이터를 버리게 되는데, 이 옵션에 서비스명을 지정하면 TCPGW 는지정한서비스에 tpacall 로응답데이터를 전달한다. 이옵션으로지정한서비스는반드시등록되어있는서비스명이어야한다. H 이옵션은 Tmax 클라이언트나서비스와 TCPGW 사이에사용자정보데이터를주고받고자하는경우에사용한다. 이옵션으로지정한데이터는리모트노드로전송하지않고임시 TCPGW 에서보관하였다가응답이수신되면사용자정보데이터에응답데이터를붙여서호출한서비스에게전달하고자하는경우에사용하다. 보통이옵션은 NON 블록킹모드로사용할때, 송신서비스와수신서비스가분리되어있어송신서비스에서수신서비스에게데이터를전달하고자하는경우에많이사용한다. (Default: 0) h 위의 -H 옵션과동일한옵션이다. 위의옵션은동기방식이나비동기방식모두에적용하는옵션인데반해이옵션은단지 tpforward 에 tprelay 로사용하는호출에대해서만적용된다. (Default: 0) 25 Tmax TCP IP Gateway Guide

27 d 이옵션은리모트노드에서 Tmax 단의서비스를호출하고응답데이터를리모트노드에전송시전송하는채널을선택하는방법을지정하는옵션이다. 이옵션을지정하면리모트노드에서요청한응답은반드시요청한채널에전송하게된다. 이옵션을지정하지않으면리모트노드와연결된채널중임의의사용가능한채널을선택하여전송한다. 이옵션은추후확장을위하여임의의값을설정해주어야한다. 예를들어 -d 0 와같이사용하며, 현재설정된값은무시된다. E 이옵션은 TCPGW 가클라이언트모드로동작시매요청마다채널을연결하고해제하고자하는경우에사용한다. 이옵션을사용하면리모트노드와의연결된채널이없기때문에리모트노드에서먼저서비스를요청할수없다. 또한이옵션을사용하면매번채널이연결되고해제되므로처리속도가감소된다. a u 이옵션은 TCPGW 사용하는옵션이다. 를비동기통신방식으로사용하고자할때 위에서설명한것처럼비동기통신방식은서비스를요청하고종료하는형태이다. 서비스에대한응답도 TCPGW 는다른서비스에대한요청으로간주한다. Tmax 클라이언트나서비스에 TCPGW 로리모트노드에서비스를요청할때사용자가채널을지정할수있도록사용하는옵션이다. 이옵션을사용하기위해서는사용자는 -k 옵션을사용하여채널에대한상태정보를보관하고있어야한다. 만약사용자가지정한채널이사용할수없으면 TCPGW 는에러를반환한다. Tmax TCP IP Gateway Guide 26

28 w 리모트노드와 TCPGW 간의통신시둘사이에는많은통신장비나또는방어벽이있을수있다. 이경우에특정장비나방어벽에둘사이의채널이일정시간동안사용하지않으면일방적으로채널을끊을수있다. 채널이끊어진경우보통은 TCPGW 나리모트노드의프로세스에서이를감지하여채널을다시연결할수있으나, 그러나끊어진것을감지하지못하는경우가종종발생한다. 이를위해서 TCPGW 에서이옵션으로지정한시간 ( 초 ) 동안해당채널이사용되지않으면무조건채널을끊고다시연결을맺도록설정하고자하는경우에사용하는옵션이다. 이옵션은리모트노드에서 Tmax 단의서비스를요청한이후에서비스는정상적으로처리되었으나결과를리모트노드에전송할수없는경우, 이전에처리한서비스에대해서취소처리를할수있도록복구서비스를지정하는옵션이다. 즉, 리모트노드에서 Tmax 단의서비스를호출한이후에리모트노드와세션이모두끊어지면서비스처리결과는리모트노드로전송하지않고버려지게된다. 이경 Y 우에서비스는정상처리하였으나리모트노드입장에서는오류로보기때문에문 제가발생할수있다. 이런경우에사용자가이옵션에서비스명을지정하면 Gateway 는리모트로결과를전송할수없는경우에리모트노드로전송할데이터를 지정한서비스로호출하게된다. 27 Tmax TCP IP Gateway Guide

29 t TCPGW 가클라이언트모드로동작하는경우에 TCPGW 는먼저리모트노드와연결을맺게되는데만약리모트노드와맺어진연결이끊어지거나또는연결이맺어지지않는경우에이옵션을설정해주지않으면일정시간 (3 초 ) 이나서비스요청이오는경우에다시연결을맺게된다. 이럴경우잦은리모트노드와의연결시도때문에시스템에부하가발생하게된다. 이를해결하기위해리모트노드와의연결을시도하는시간간격 ( 초 ) 을정해준후 t 옵션으로이시간을지정해주면 TCPGW 는이시간간격으로리모트노드와의연결을시도하게된다. i 리모트노드로부터데이터수신시데이터의끝을나타내는특정문자혹은비트스트림이존재할경우에필요한옵션이다. 이옵션을지정하면데이터수신시사용자의 chk_end_msg 가호출된다. x 채널장애여부감지 (TCP 레벨의 PING/PONG) 기능을활성화시킨다. 인자로 0 을줄경우 (-x 0), 메인채널장애복구가감지되면바로메인채널로전환된다. 인자로 1 을줄경우 (-x 1), 메인채널장애복구가감지되더라도안전한시점 ( 채널비사용시 ) 에메인채널로전환된다. (Default: 0) 이옵션은 set_ping_msg 및 chk_pong_msg 함수와함께사용된다. y UID 로활용될수있는메시지번호 (sequence number) 의최대값을설정하는옵션이다. 기본값은 이며최대 까지지정가능하다. Tmax TCP IP Gateway Guide 28

30 3.1.2 서버 / 클라이언트 TCPGW 의환경파일 서버 / 클라이언트 TCPGW 의환경설정은아래와같다. *DOMAIN... *NODE... *SVRGROUP... *SERVER testtcpgw SVGNAME=svg1, MIN=1, MAX=1, CPC=10, SVRTYPE=CUSTOM_GATEWAY, # 클라이언트 TCPGW 의경우 1 CLOPT="-- -r p n 5 -k " # 서버 TCPGW 의경우 2 #CLOPT="-- -P N 5 -k 71673" *SERVICE TESTTCPGW SVRNAME=testtcpgw 위와같이환경파일을작성한경우 testtcpgw 라는이름의 TCPGW 는 1 개가 Tmax boot 시에 boot 되게된다. Testtcpgw 의서비스명은 TESTTCPGW 이고 Timeout 값은설정되어있지않으므로무한대기이다. 1 은 TCPGW 는클라이언트로리모트노드의 IP 주소는 이고, 리모트노드의 Listen 포트번호는 5050 이된다. testtcpgw 는기동시에리모트노드와 5 개의연결을맺는다. 2 의환경설정은서버로동작하는것으로서 Listen 포트번호는 5050 이고리모트노드와 testtcpgw 는 5 개의연결을맺게된다. 29 Tmax TCP IP Gateway Guide

31 -k 옵션으로지정한값은 custom.c 의함수 (init_remote_info()) 의인자로전달되어사용자가저장해야할내용등을이 key 를이용하여공유메모리에저장할수있다 서비스블록형 TCPGW 의환경파일 TCPGW 는일단리모트노드와연결이이루어진이후에는서버 / 클라이언트의미가없이동기형 / 비동기형모두사용할수있으므로여기서는서버 / 클라이언트모드를별도로설명하지않는다. *DOMAIN... *NODE... *SVRGROUP... *SERVER testtcpgw SVGNAME=svg1, MIN=1, MAX=1, CPC=10, SVRTYPE=CUSTOM_GATEWAY, # 클라이언트 TCPGW 의경우 CLOPT="-- -r p n 5 -k d 0" # 서버 TCPGW 의경우 #CLOPT="-- -P N 5 -k d 0" *SERVICE TESTTCPGW SVRNAME=testtcpgw, SVCTIME=30 위와같이환경파일을작성한경우 testtcpgw 라는이름의 TCPGW 는 1 개가 Tmax boot 시에 boot 되게된다. testtcpgw 의서비스명은 TESTTCPGW 이고 Timeout 30 초이므로 30 초이내에응답이없으면 Timeout 을반환한다. 단, Timeout 은 Tmax 의클라이언트나서비스에서리모트노드로요청한것에대해서만 Timeout 을 check 하고, 리모트노드에서요청한서비스에대해서는요청한해당서비스에서 Timeout 을설정해야한다. Tmax TCP IP Gateway Guide 30

32 첫째, Tmax 의클라이언트나서버에서리모트노드에서비스요청시 TCPGW 는 UID 를사용한다. UID 는메세지별유일한값으로써요청에대한응답시반드시 TCPGW 에넘겨주어야해당서비스를요청한서비스나클라이언트에게돌려주게된다. 둘째리모트노드에서서비스요청시 TCPGW 는요청에대한응답을요청한채널에전송한다. 단, 요청한채널이끊어진경우에데이터는소멸된다 서비스 NON- 블록형 TCPGW 의환경파일 이형식의 TCPGW 는일반적으로 Tmax 의서비스에서리모트노드로서비스를요청하는경우에주로사용한다. 그래서일반 Tmax 클라이언트에서는직접이방식으로서비스를호출할수없다. 즉, Tmax 클라이언트에서직접사용할수있는방식은블록형방식이나비동기방식만사용가능하다. *DOMAIN... *NODE... *SVRGROUP... *SERVER testtcpgw SVGNAME=svg1, MIN=1, MAX=1, CPC=5, SVRTYPE=CUSTOM_GATEWAY, # 클라이언트 TCPGW 의경우 CLOPT="-- -r p n 5 -k S RECVSVC -H 20 -d 0" # 서버 TCPGW 의경우 #CLOPT="-- -P N 5 -k S RECVSVC -H 20 d 0" sendsvr MIN=1, MAX=1 secvsvr MIN=1, MAX=1 *SERVICE 31 Tmax TCP IP Gateway Guide

33 TESTTCPGW SENDSVC SVRNAME=sendsvr RECVSVC SVRNAME=recvsvr SVRNAME=testtcpgw, SVCTIME=30 위와같이환경파일을작성한경우 testtcpgw 라는이름의 TCPGW 는 1 개가 Tmax boot 시에 boot 되게된다. testtcpgw 의서비스명은 TESTTCPGW 이고 Timeout 30 초이므로 30 초이내에응답이없으면 Timeout 을반환한다. Tmax 의클라이언트나서버에서먼저 SENDSVC 서비스를호출하면 SENDSVC 에서사전작업을수행한후에 TESTTCPGW 서비스로컨트롤을넘긴다.(tpforward). TCPGW 는일단 Tmax engine 에채널해제메시지를전송한후에리모트노드로서비스를요청하고, 서비스에응답을수신시 -S 옵션에지정한서비스로결과를전달 (tprelay) 한다. RECVSVC 는처리결과에대한작업을수행후리턴하면원래 SENDSVC 를호출한클라이언트나서비스에게로응답이전달된다. 이방식을사용하면적은수의서비스 ( 여기서는 SENDSVC) 를가지고보다많은처리를할수있다. 여기서도블록형처럼반드시 UID 는사용해야한다. 리모트노드의응답이지정한시간 (30 초 ) 를초과하면 TCPGW 는 Timeout 을 RECVSVC 에전달 (tprelay) 한다. 그래서 RECVSVC 서비스에서는반드시 tpurcode 값을확인하여값이 0 보다크면오류가발생한경우이므로이에대한적절한처리를하여야한다. Timeout 뿐만아니라모든오류에대해서 tpurcode 에값이전달됨으로오류의종류는부록에서설명하는오류코드명세를참조하기바랍니다 리모트동기형과비동기형 TCPGW 환경파일 리모트노드에서요청하는서비스에대한동기형비동기형구분은 -d 옵션을사용하느냐에따라서결정되거나, 또는사용자정의함수 (get_msg_info) 에서 flags 에 TPNOREPLY 를설정하면된다. 전자의경우 -d 옵션을사용하지않으면서비스에대한응답은다른채널로전송될수있다. 후자인경우에는리모트노드로응답을전송하지않는다. *DOMAIN... *NODE Tmax TCP IP Gateway Guide 32

34 ... *SVRGROUP... *SERVER testtcpgw SVGNAME=svg1, MIN=1, MAX=1, CPC=5, SVRTYPE=CUSTOM_GATEWAY, # 비동기형 CLOPT=" -- -P N 5 -k 71673" # 동기형 #CLOPT="-- -P N 5 -k d 0" *SERVICE TESTTCPGW SVRNAME=testtcpgw -d 옵션을지정하였을경우에도사용자정의함수 (get_msg_info) 에서 flags 에 TPNOREPLY 를설정하면서비스응답은리모트노드에전송되지않는다. 리모트노드에서 Tmax 의서비스요청시 TCPGW 는 tpacall 를사용함으로응답을받지않고동시에 tpacall 를사용할수있는개수가제한되어있다 (default 8 개 ). 동시에요청이 8 개이상인경우에는 *DOMAIN 절에 MAXSACALL 개수를적당하게지정해야한다 재연결 TCPGW 환경파일 보통리모트노드와통신시두채널사이에는복잡한통신장비를거쳐서통신이이루어지거나또는방어벽을사이에두는경우가많다. 이러한경우에둘사이의채널이일정시간동안사용하지않으면통신장비나또는방어벽에서해당채널을끊어서둘사이에통신이이루어지지않는경우가발생한다. 이를방지하기위해둘사이에일정간격으로 signal 를주고받을수도있으나이를위해서는 TCPGW 뿐만아니라상대방의프로그램을감안해야하기때문에이방법을사용하지않고일정시간동안해당채널을사용하지않으면채널을끊고다시연결하는방법을사용한다. 33 Tmax TCP IP Gateway Guide

35 *DOMAIN... *NODE... *SVRGROUP... *SERVER testtcpgw SVGNAME=svg1, MIN=1, MAX=1, CPC=5, SVRTYPE=CUSTOM_GATEWAY, # 비동기형 CLOPT=" -- -P N 5 -k w 600" # 동기형 #CLOPT="-- -P N 5 -k w 600" *SERVICE TESTTCPGW SVRNAME=testtcpgw 위와같이설정하면 TCPGW 는 600 초 (10 분 ) 간격으로 600 초동안한번도사용하지않은채널은연결을끊고다시연결을맺는다 여러리모트노드와연결을맺는클라이언트 TCPGW 여러노드의 ip 아래와같다. 와연결을맺는클라이언트 TCPGW 의환경설정은 *DOMAIN... *NODE... *SVRGROUP... *SERVER testtcpgw SVGNAME=svg1, Tmax TCP IP Gateway Guide 34

36 MIN=1, MAX=1, CPC=10, SVRTYPE=CUSTOM_GATEWAY, CLOPT="-- -f config -n 5 -k " *SERVICE TESTTCPGW SVRNAME=testtcpgw *config 파일 # tcpgw_no ip_addr port_no in_channel out_channel config 파일의각항목에대한설명은아래와같다. tcpgw_no TCPGW process number. 0 부터시작함 ip_addr remote hostname or ip address port_no remote port number in_channel input channel number out_channel output channel number 3.2 사용자헤더환경설정및사용방법 TCPGW 는서버 / 클라이언트모드, 동기형 / 비동기형방식모두에서사용자헤더를설정하여사용할수있다. 사용자헤더는 Tmax 클라이언트나서비스에서리모트노드로서비스를요청하는경우에만사용가능하고, 그반대인경우에는사용할수없다. 사용자헤더로지정한데이터는리모트노드로전송되지않고임시 TCPGW 에서 UID 별로보관하였다가응답이오면응답데이터에서 UID 를찿아서해당 UID 의사용자헤더데이터와응답데이터를전달하게된다. 사용자헤더데이터의길이는최대 (256 Bytes) 까지만사용할수있다. 35 Tmax TCP IP Gateway Guide

37 3.2.1 사용자헤더환경파일 사용자헤더는어떤모드에서도사용할수있는옵션이다. 사용자헤더는두가지로나누어서지정할수있는데, tpforward 방식으로사용할때 (NON 블록킹 ) 와그외의다른서비스 ( 블록형, 비동기형 ) 를사용하는경우사용자헤더길이를다르게지정할수있다. *DOMAIN... *NODE... *SVRGROUP... *SERVER testtcpgw SVGNAME=svg1, MIN=1, MAX=1, CPC=10, SVRTYPE=CUSTOM_GATEWAY, # 클라이언트 TCPGW 의경우 CLOPT="-- -r p n 5 -H 9 -h 10" # 서버 TCPGW 의경우 2 #CLOPT="-- -P N 5 -H 9 -h 10" *SERVICE TESTTCPGW SVRNAME=testtcpgw -H 옵션은모든종류의서비스요청에대해서사용자헤더를지정할때사용하는옵션이다. 그에반해 -h 옵션은단지 tpforward 방식 (NON 블록킹 ) 에서만사용할수있는옵션이다. TCPGW 는사용자헤더가지정되었을경우리모트노드로전송하는데이터중에서처음부터일반서비스는 9 Bytes, tpforward 인경우에는 10 Bytes 를보관하고나머지데이터만리모트노드에전송한다.( 위의 config 인경우 ) 리모트노드로부터응답을수신받으면보관되어있는사용자헤더와응답데이터를붙여서리턴한다. Tmax TCP IP Gateway Guide 36

38 3.2.2 사용자헤더사용방법 사용자헤더는여러가지방법으로사용할수있다. 사용자헤더는사용자가임의로사용할수있는데이터이므로여기서는여러사이트에서사용하는일반적인방법을설명한다. tprelay 나비동기서비스명지정 사용자헤더에 NON 블록형방식으로사용할경우 tprelay 될서비스를지정할수있다. 이경우에 -S 옵션으로지정한것보다우선한다. 즉사용자헤더에도서비스를지정하고, -S 옵션으로서비스를지정하였을경우 TCPGW 는먼저사용자헤더에서사용자함수 (get_service_name) 를호출하여서비스를찾고, 여기에서서비스를찾지못한경우 -S 옵션으로지정한서비스를사용한다. 비동기형방식 (tpacall 에 TPNOREPLAY) 로호출하였을경우에도응답데이터에대해서위와동일하게처리한다. Key 데이터보관 NON 블록킹모드로사용할경우송신과수신서비스로분리되는데송신서비스에서 DB 에적절한작업을처리하고리모트노드로데이터를전송하고송신서비스는종료된다. 나중에수신서비스에서송신서비스에서처리한 DB 의 Key 정보를알고자하는경우나, 또는수신서비스에리모트노드에서오류가발생한경우 DB 를되돌려놓기위한중요한데이터를보관하고자하는경우에많이사용한다. 3.3 Gateway 기타기능 Gateway 헤더 TCPGW 는 Tmax 클라이언트나서버에서호출시 Gateway 헤더를사용할수있다. 이를사용하기위해서는 TCPGW 의다른라이브러리를사용해야한다. 보통은 (libtcpgw.a, libtcpgw.so) 를사용하나 Gateway 헤더를사용하고자하는경우에는 libtcpgw.gwh.a 나 libtcpgw.gwh.so 를사용해야한다. Gateway 헤더는모든데이터버퍼의가장처음 Offset 에위치해야 37 Tmax TCP IP Gateway Guide

39 한다. 즉, 사용자헤더를사용할경우에 Gateway 헤더다음에사용자헤더가와야한다. Gateway 헤더는여러가지다목적으로사용하는데, TCPGW 에서는여러항목중에서 svc 항목만사용가능하다. 이항목은 NON 블록킹모드로사용하는경우나비동기방식으로사용할때응답데이터에대해처리할서비스명을지정하고자하는경우에사용한다. Gateway 헤더는보통사용자헤더를사용하지않을경우에응답을처리할서비스를메세지별로처리하고자하는경우에사용한다. TCPGW 는응답을처리할서비스를찾는순서는가장먼저 Gateway 헤더, 두번째는사용자헤더, 세번째는 -S 옵션으로지정한순서대로찾는다 다중응답처리 일반적인 TCPGW 처리방식은한번의요청에대해서하나의응답을받는형태이다. 그러나때에따라서여러번의응답이올수있는데이를처리하기위해서 TCPGW 는 custom.c 의 get_msg_info 함수의호출을통해서이를처리한다. 여러번의응답이오는경우에매번 get_msg_info 함수가호출되는데, 사용자는수신받은데이터가마지막데이터인지를판단하여적절한값을리턴해주면된다. 연속데이터인경우에리턴값으로 3 을리턴해주면 TCPGW 는다음데이터가있다고판단하여서비스를요청한클라이언트나서비스에응답을주지않고다음데이터를기다린다. 사용자는마지막데이터를수신한경우에 REPLY 값 (1) 를리턴해주면 TCPGW 는이전에저장한데이터와마지막데이터를서비스를요청한클라이언트나서비스에돌려준다 서비스명을찾는순서 NON 블록형 TCPGW 나또는비동기형 TCPGW 인경우리모트노드에서온요청이나응답을처리할 Tmax 의서비스가있어야한다. TCPGW 는이서비스명을알수가없으므로사용자가적당한서비스명을지정해야하는데 TCPGW 는 3 가지방식으로서비스명을찾는다. 아래에서설명하는서비스명은반드시 Tmax config 파일에등록되어있어야한다. Tmax TCP IP Gateway Guide 38

40 첫째, Gateway 헤더를사용할경우에만가능하다. Tmax 클라이언트나서비스에서 TCPGW 를요청할때 Gateway 헤더에서비스명을넣어서 TCPGW 를호출하면 TCPGW 는가장우선적으로이서비스명을사용한다. 둘째, 사용자헤더에서서비스명을찾는다. Tmax 클라이언트나서비스에서 TCPGW 를요청할때사용자헤더에서비스명을넣은후에사용자함수 get_service_name 에서서비스명을얻을수있다. 셋째, CLOPT 의 -S 옵션에지정한서비스를이용한다. 이런경우에는모든메시지에대해서동일한서비스가적용된다. 이와같은순서로 TCPGW 는서비스명을찾는다. 단, 리모트노드에서최초로서비스를요청할경우에는위의방식을따르지않고사용자가 get_msg_info 에서서비스명을지정해야한다 사용자임의의채널지정 완전한비동기방식으로 TCPGW 를구성한경우에사용자는리모트노드로전송할채널을지정할수있다. CLOPT 절에 -a 를사용한다. 완전한비동기방식은서로간에응답이없다. 응답데이터도서비스요청형식으로전달되어야한다. 예를들어 Tmax 의클라이언트나서비스에서 TCPGW 로 tpacall 에 TPNOREPLY 로호출하면 TCPGW 는서비스요청에대한 UID 와어떤정보데이터도보관하지않고리모트노드로데이터를전송하고해당서비스를종료한다. 나중에리모트노드로부터응답에대한메시지를수신받았을경우에도이를서비스요청으로처리한다. 반대인경우에 ( 리모트노드에서먼저요청 ) 도동일하게처리한다. 위와같은경우에사용자는리모트노드로전송할채널번호를지정할수있다. CLOPT 절에 -u 옵션을사용한다. 채널지정은두가지경우가있는데첫째, Tmax 에서먼저서비스를리모트노드로요청한경우 TCPGW 는 get_channel_num 함수를호출하는데사용자는전송데이터를분석하여채널을지정할수있다. 두번째는리모트노드에서먼저요청한경우인데, 리모트노드에서서비스요청시 get_msg_info 함수에서리모트노드에서요청한채널을데이터에보관하여 Tmax 서비스를호출한다. Tmax 서비스는결과를리모트노드로전송하기위해 tpacall 에 TPNOREPLY 로다시 TCPGW 로서비스를보낸다. 사용자는 get_channel_num 에서이전에보관한채널을사용하여리모트노드로 39 Tmax TCP IP Gateway Guide

41 응답을전송할수있다. 이방식을사용함으로써 TCPGW 와 Tmax engine 간의채널이블록되지않고서비스를요청한채널로응답을전송할수있다 코드변환 TCPGW 가실행되는 Machine 는모두 ASCII 코드 ( 한글은완성형 ) 를사용한다. 그러나리모트노드는사용하는코드가다른 Machine 에있어이들과메시지를주고받기위해서는코드를일치시켜야한다. 이러한코드변환은리모트에서할수도있고, 아니면 TCPGW 에서할수도있다. TCPGW 는모든코드를변환하지않고 ASCII EBCDIC, 조합형 완성형코드만을서로변환한다. TCPGW 에서리모트노드로메시지를전송하는경우에는 ASCII 에서 EBCDIC, 완성형에서조합형으로코드를변환하고, 리모트에서수신하는경우에는 EBCDIC 에서 ASCII, 조합형에서완성형으로코드를변환한다. TCPGW 는코드변환을서비스처리단위별로변환한다. 다시말해, TCPGW 는서비스단위별로송수신 Format 를등록 (Map 파일 ) 하여변환한다. 사용자는 TCPGW 와리모트노드간에코드를변환하려면모든서비스에대해서 Map 파일을등록해야한다. 또한 TCPGW 에서코드변환기능을이용하려면반드시 Gateway 헤더를사용해야만한다. 왜냐하면리모트로전송하는서비스에대해서 TCPGW 는서비스명을알수가없으므로 Gateway 헤더를사용하여 TCPGW 에리모트서비스명을전달해야하기때문이다. Gateway 헤더중 pgmname 항목에리모트서비스명을주고, TCPGW 는이항목의값으로 Map 파일을로드하여코드를변환한다. TCPGW 는 Tmax 클라이언트나서비스에서리모트로서비스요청시에는 Gateway 헤더의 pgmname 항목의값으로 Map 파일을로드하고, 리모트노드에서 Tmax 로서비스를요청하는경우에는 get_msg_info 함수에서지정한서비스명으로 Map 파일을로드한다. 여기서는사용자가 Map 파일을등록하는방법에대해서설명한다. Map 파일은사용자가텍스트파일로지정한형식에맞게등록해주면된다. # COMMSIZE 는 INPUT/OUTPUT 에서같이사용해야함으로 INPUT/OUTPUT 중 # 큰 size 의값을입력해야합니다. *COMMSIZE Tmax TCP IP Gateway Guide 40

42 1024 *INPUT # # item-name length data-type # data-type: CHAR, NUMERIC(UNPACK), KOREAN, BINARY, USER-TYPE # a 10 CHAR b 10 KOREAN c 5 NUMERIC d 10 BINARY *OUTPUT a 10 CHAR b 10 KOREAN c 5 NUMERIC d 10 BINARY e 3 USER1 e1 6 CHAR e2 10 KOREAN /e3 8 BINARY COMMSIZE 이항목은리모트노드와송수신하는데이터의길이를지정하는항목이다. 이항목은모든서비스메시지 ( 송수신포함 ) 중가장큰메시지의길이를입력해야한다. INPUT 이항목은 TCPGW 에서리모트노드로전송하는메시지에대해서등록하는항목이다. TCPGW 에서리모트노드로서비스를요청하는경우에이항목에리모트노드로요청하는메시지의 Format 를등록하고, 반대로리모트노드에서 Tmax 로서비스를요청하는경우에는 Tmax 서비스의처리결과에대한 Format 을등록한다. OUTPUT 41 Tmax TCP IP Gateway Guide

43 이항목은리모트노드에서 TCPGW 로수신받은메시지에대해서등록하는항목이다. TCPGW 에서리모트노드로서비스를요청하는경우에는리모트노드에서처리한결과를수신받는메시지의 Format 를등록하고, 반대로리모트노드에서 Tmax 로서비스를요청하는경우에는 Tmax 로서비스를요청하는메시지에대해서 Format 을등록한다. 항목명 이이름은단순히사용자가참조용으로만사용하는이름이다. TCPGW 는항목명으로인식하고내부에서는사용하지않는다. 항목길이 송수신데이터의각항목의실제길이를나타낸다. 각항목의길이만표현하면 TCPGW 내부에서 Offset 로변환하여사용한다. Offset 는항상 0 부터시작한다. 데이터타입 송수신각항목의데이터타입을지정한다. CHAR : 이타입은데이터가모든문자 ( 영문자, 숫자, 한글 ) 을포함할수있는항목을나타낸다. NUMERIC : 이타입은데이터가숫자만을나타내는경우이다. 이타입의코드변환은 CHAR 타입과동일하게코드를변환한다. 타입 NUMERIC 라해서 Integer 를나타내는것은아니다. KOREAN: 이타입의데이터는모두한글을경우에사용한다. TCPGW 는이타입의데이터는항상 2 Bytes 단위로코드를변환한다. CHAR 에서한글이포함된경우에한글과다른코드 ( 영문자, 숫, 특수문자 ) 사이에한글의시작과끝문자가포함되는데반해이타입의데이터는모두한글문자로인식하기때문에처음과끝에만한글시작과끝문자가포함된다. Tmax TCP IP Gateway Guide 42

44 BINARY: 이타입의데이터는코드를변환하지않는다. 사용자는데이터중코드를변환하지않고자하는경우에는이타입으로지정하면된다. USER-TYPE: 이타입의데이터는 Array 형식의데이터타입을지정하고자할경우에사용한다. 예를들어화면에여러개의항목이반복하서여러번나올경우에각항목을반복횟수만큼등록해야하는번거로움이있다. 또는반복횟수를데이터로표현하는경우에는몇번의반복이되는지를알수없어코드변환이어렵다. 이를위해서사용자는사용자정의타입을지정하여 Array 형태의데이를쉽게변환할수있다. 위의 Map 파일에서 USER1 는사용자가지정한사용자정의타입이다. 타입이름은사용자가임의로지정하면된다. 사용자정의타입의데이터는 Array 데이터의반복을나타내는항목이므로반드시숫자로이루어져야한다. TCPGW 는사용자정의타입을만나면이를 Array 의횟수로인식한다. Array 의끝은마지막항목의이름을 / 로시작하면된다. 위의경우에는 e1, e2, e3 을 Array 항목으로인식해서 e 항목으로지정한횟수만큼코드를변환한다. Array 횟수는 Map 파일에등록하지않고 TCPGW 와리모트노드사이에데이터전문에표현한다. 3.4 TCP/IP Gateway 사용자프로그램 (custom.h, custom.c) Tmax 의환경을설정하여 TCPGW 를등록한후에 TCPGW 를사용하기위해해야할일은 custom.h, custom.c 를적절히수정하는일이다. 먼저 custom.h 에서해야할일은 msg_header_t 구조체를 TCPGW 를사용하고자하는목적에맞게수정하는일이다. TCP/IP 는가변길이의데이터를처리하기가곤란하다. 왜냐하면데이터의끝을알수가없으므로언제데이터수신을종료해야할지모르기때문이다. 그래서 TCPGW 는 msg_header_t 구조체를사용하여리모트노드와메세지헤더를설정하여실데이터의길이를구할수있는구조로되어있다. 이구조체의정보는 43 Tmax TCP IP Gateway Guide

45 TCPGW 와리모트노드사이에메세지헤더를지정하는구조체이므로해당리모트노드와통신시사용하는메세지헤더를등록해주면된다. TCPGW 는리모트노드로부터데이터수신시먼저 msg_header_t 의길이만큼데이터를수신받고 msg_header_t 의구조체에서실데이터의길이를얻은후에실데이터를수신받는다. 그러므로 msg_header_t 는정확하게등록해야만둘사이의통신이원활히이루어진다. 사용자가정의한 msg_header_t 의정보는 TCPGW 와리모트노드의통신에서만사용하고서비스호출시에는전달되지않는다. custom.h 를수정한이후에는 custom.c 를적절하게수정해야한다. custom.c 에는여러가지사용자정의함수가있는데각각에대해서는아래설명을참조하기바란다. 이렇게수정한 custom.h, custom.c 와 TCPGW 라이브러리및 register.c 를링크하여컴파일하면 TCPGW 가완성된다. 이때생성된실행파일명은 Tmax 환경파일의 SERVER 절에등록된이름과동일해야한다 custom.h 수정 custom.h 는 TCPGW 에서사용되는 msg_info_t 구조체를포함하는파일로서사용자가리모트노드와 TCPGW 간에통신해야할기타메시지구조체나헤더들을수정할수있다. 그러나 msg_info_t 구조체는 TCPGW 라이브러리내부와사용자함수사이에사용하므로멤버변수나타입, 길이등을수정해서는안된다. TCPGW 에서사용되는 msg_info_t 구조체는다음과같다. typedef struct msg_info char svc[20]; int err; int len; int uid; int flags; /* flags 를설정한다. (TPNOREPLY 등 ) */ int msgtype; int channel_id; msg_info_t; Tmax TCP IP Gateway Guide 44

46 이구조체는 TCPGW 라이브러리내부와사용자가수정해야하는 custom.c 파일의함수에서사용된다. custom.c 파일에서는리모트노드로부터메시지를수신한직후불리우는 get_msg_info() 함수에서이구조체에값을적절히설정을해야한다. 또한리모트노드로메시지를송신하기직전에불리우는함수인 put_msg_info() 함수에서이구조체의값으로리모트노드로송신한데이터를적절히구성해야한다. get_msg_info() 와 put_msg_info() 의수정사항에대한좀더자세한내용은 custom.c 수정에서설명하도록한다. 또한 custom.h 에는리모트노드와 TCPGW 사이에서메세지헤더데이터구조를정의해주어야한다. TCPGW 에서일반적으로사용되는메세지헤더 (msg_header_t) 구조체는다음과같다 typedef struct msg_header int length; msg_header_t; custom.c 수정 custom.c 는개발자가리모트노드와 TCPGW 가통신하기위해구현해야하는것으로 TCPGW 라이브러리 (libtcpgw.a, libtcpgw.so) 와함께컴파일해서사용해야한다. 이 custom.c 는정의된형식에맞게구현해야하며그형식은다음과같다. custom.c 에는아래와같은변수를정의해주어야한다. 변수명 : msg_header_size 설명 : 이변수는라이브러리내부에서사용자가정의한메시지헤더의사이즈로인식되어사용된다. 따라서이변수는아래의사용법처럼사용자정의메시지헤더사이즈로설정해주어야한다. 45 Tmax TCP IP Gateway Guide

47 사용법 : int msg_header_size = sizeof(msg_header_t); 변수명 : comm_header_size 설명 : 사용법 : 이변수는만약 msg_header_size 가 0 으로설정된경우이변수가 msg_header_size 와같은용도로쓰이게된다. 만약 msg_header_size 변수와함께정의가된경우는 msg_header_size 값을사용하게된다. int comm_header_size = 0; 또한 custom.c 에는아래와같은함수를구현해주어야한다. 함수명 : init_remote_info 설명 : 사용법 : 이함수는리모트노드와연결을맺기에앞서호출된다. 즉 TCPGW 가자신의초기화작업을마친후에곧바로호출되는함수이다. 이함수는한번만호출된다. Tmax 환경파일의 CLOPT 절에 k 옵션으로공유메모리키를설정한경우연결에대한정보등을저장하기위해공유메모리를생성하는로직을구현할수있다. 이부분은경우에따라내부로직을구현하지않아도된다. int init_remote_info(char *myname, int mynumber, int num_channel, int key) myname TCPGW 서버명이다. mynumber 같은 TCPGW 가동시에여러개실행될경우에각각의프로세스를구분할수있는 TCPGW 프로세스번호이다. Tmax TCP IP Gateway Guide 46

48 이값은 0 부터시작한다. num_channel TCPGW 가연결하고있는 max 채널수이다. Tmax 환경파일에 -n, -N 옵션으로설정한값의합이다. key Tmax 환경파일에서 k 옵션으로설정한공유메모리키값이다. 함수명 : remote_connected 설명 : 사용법 : 이함수는리모트노드와연결을맺은후호출되는함수이다. 만약리모트노드와연결을맺은후해야할작업이있다면이함수에서하도록한다. 이함수는채널수만큼호출된다. 또한도중에채널이해제되었다가다시연결될때도호출된다. int remote_connected(int index, int addr, int type, int fd) index TCPGW 가 -n 또는 -N 옵션으로여러개의 channel 을연결하고있는경우각각의채널에대한자신의 index 값이다. addr 리모트노드의주소이다. type 리모트노드와연결된채널타입이다. IN_CHANNEL 또는 OUT_CHANNEL 인지를나타낸다. fd 리모트노드와연결된 socket 번호이다. 47 Tmax TCP IP Gateway Guide

49 함수명 : remote_closed 설명 : 사용법 : 이함수는리모트노드와연결을종료한후호출되는함수이다. 만약리모트노드와연결이끊어진후에해야할작업이있다면이함수에서하도록한다. init_remote_info 함수에서 shared memory 를생성하는로직을구현한경우이함수에서해제하는작업로직을구현한다. 이함수도채널수만큼호출된다. int remote_closed(int index, int type) index TCPGW 가 -n 또는 -N 옵션으로여러개의채널을연결하고있는경우각각의채널에대한자신의 index 값이다. type 리모트노드와연결된채널타입이다. IN_CHANNEL 또는 OUT_CHANNEL 인지를나타낸다. 함수명 : get_msg_length 설명 : 사용법 : 이함수는리모트노드으로부터요청이나응답이도착하여, 해당채널에서 msg_header_t 부분만을 recv(msg_header_size 또는 comm_header_size 에서지정한값만큼을읽는다.) 한후호출하는함수로여기에서 return 된값만큼, 실데이터를다시 read 하게된다. int get_msg_length(msg_header_t *hp) hp 개발자가 custom.h 에정의할수있는 msg_header_t 구조체의포인터이다. 일반적으로, 해당채널로부터 Tmax TCP IP Gateway Guide 48

50 데이터를읽는경우, 정해진헤더의크기만큼데이터를읽은후에헤더에설정되어있는데이터길이값을얻어서이를바탕으로다음실데이터를읽을수있도록되어있다. 이 hp 는 TCPGW 가리모트노드로부터읽은헤더데이터를넘겨준다. 리턴값 : 리모트노드로부터실데이터의길이를리턴한다. 이함수의리턴값으로 TCPGW 는실데이터를리모트노드에서읽게된다. 함수명 : get_msg_info 설명 : 사용법 : 이함수는리모트노드으로부터요청이나응답이도착하여데이터를읽은후이데이터를 Tmax 서비스프로그램으로다시요청이나응답를전송하기전에해당데이터값을가공하거나, 정보전송을위한여러정보 (uid, len, flags, service 명등 ) 들을 TCP/IP Gateway library 와 custom.c 와의 interface 역할을하는 info 를참조, 또는가공하는함수이다. int get_msg_info(msg_header_t *hp, char *data,msg_info_t *info) hp 리모트노드로부터읽어온메시지헤더데이터대한포인터이다. get_msg_length 에서사용한구조체와동일하다. data 리모트노드로부터읽은데이터부분이다. info TCP/IP Gateway library(libtcpgw.a, libtcpgw.so) 와 custom.c 와 interface 역할을해주는 structure 구조이다. 사용자가수신받은데이터를기초로해서 info 49 Tmax TCP IP Gateway Guide

51 구조체의항목에각종정보를이함수에서설정한다. 리턴값 : Tmax 서비스로보낼 type 을정의한다. TCPGW 는이값을바탕으로 Tmax 로어떤처리를할것인지를판단한다. 예를들어, REMOTE_REQUEST 는리모트노드로부터 Request 가발생한것으로판단하며, REMOTE_REPLY 는 Tmax 서비스로부터 Request 가발생하여리모트노드로부터 Response 가오는경우리턴하는값이다. REMOTE_REPLY_CONT 는 Response 메시지가이어서올경우리턴하는값이며, REMOTE_SENDTOCLI 는비요청메시지일경우리턴하는값이다. 리모트노드로부터응답을수신한경우에는반드시 UID 값을 info 구조체의 uid 항목에지정해주어야한다. 그리고기타다른값들상황에맞게주어야한다. 함수명 : get_channel_num 설명 : 사용법 : Tmax 서비스나클라이언트로부터요청한데이터를리모트노드에전송할때사용자가채널을선택할수있도록하는함수이다. 사용자는주어진데이터의특성에따라서전송할채널을지정할수있다. 단여기서지정하는것은리모트노드와연결된 socket 번호가아니라단순한채널번호이다. TCPGW 는사용자가지정한채널을사용할수없으면오류를반환한다. int get_channel_num(char *data) data 리모트노드로보내기위한데이터이다. 리턴값 : 채널번호를반환한다. Tmax TCP IP Gateway Guide 50

52 함수명 : put_msg_info 설명 : 사용법 : 이함수는리모트노드로메시지를전송하고자할때호출되는함수이다. 동기형통신인경우에는사용자가이함수에서 UID 를메시지에 Save 하여야한다. UID 는 info 구조체의 uid 항목의값을사용해도되고, 또는사용자가임의의 UID 를만들어서사용한후에 info 의 uid 항목에넣어주면된다. 또한, 사용자는이함수에서 msg_header_t 의구조체의각각의항목에적절한값을저장해야한다. 이구조체는사용자가임으로설정할수있는항목이기때문에 TCPGW 에서는 msg_header_t 의구조체항목에어떤값도저장하지않는다. int put_msg_info(msg_header_t *hp, char *data, msg_info_t *info) hp 리모트노드로보낼메시지의헤더이다. data 리모트노드로보낼데이터이다. info 리모트노드로보낼데이터의정보이다. 리턴값 : 사용자는이함수에서실제적으로리모트노드에전송할데이터의전체길이를반환해야한다. 즉메시지헤더와실데이터를더한길이를반환한다. 함수명 : put_msg_complete 설명 : 51 Tmax TCP IP Gateway Guide

53 사용법 : 이함수는리모트노드로메시지를전송한후에호출되는함수이다. 데이터가완전히리모트노드에전송되었다는것을알려주기위해서호출되는함수이다. int put_msg_complete(msg_header_t *hp, char *data, msg_info_t *info) hp 리모트노드로보낸메시지의헤더이다. data 리모트노드로보낸데이터이다. info 리모트노드로보낸데이터의정보이다. 함수명 : get_service_name 설명 : Tmax에서리모트노드로요청을보낼때요청을보내는서버와결과를받는서버를달리하는 NON 블록형이나비동기형 TCPGW를구성하는경우, tpreply() 나 tpacall() 을할서비스의이름을오류코드에따라서설정한다. 사용법 : int get_service_name(char *header, int err, char *svc) header -H 또는 -h 옵션으로설정한, TCPGW 에서저장하고있는사용자헤더의포인터이다. err 오류코드이다. svc tpreply() 나 tpacall() 를받는서비스의이름을설정한다. Tmax TCP IP Gateway Guide 52

54 함수명 : prepare_shutdown 설명 : 이함수는이 TCPGW가종료하기직전에 call되는함수로서, 일반적으로 init_remote_info() 함수에서생성한공유메모리를해제하는일등을이함수에서한다. 사용법 : int prepare_shutdown(int code) code shutdown code 로써현재는사용되지않는다. 함수명 : set_service_timeout 설명 : 사용법 : 이함수는서비스타임아웃이발생하였을경우사용자가호출할수있는함수이다. int set_service_time_out(int uid, char *header) uid header 서비스타임아웃이발생한거래의 unique id 서비스타임아웃이발생한거래의 header 함수명 : chk_end_msg 설명 : 53 Tmax TCP IP Gateway Guide

55 사용법 : 이함수는리모트노드로부터데이터수신시데이터의끝을나타내는특정문자혹은비트스트림이존재할경우사용자가호출할수있는함수이다. int chk_end_msg(int len, char *data) len 리모트노드로부터읽은데이터길이이다. data 리모트노드로부터읽은데이터부분이다. 함수명 : inmsg_recovery 설명 : 사용법 : 이함수는리모트노드로부터요청을 tpacall(..., TPBLOCK) 로처리했을경우서버가떠있지않으면에러가돌아오게되는데, 이러한때에호출된다. 사용자는함수내에서적당히새로운데이터를만들고, 데이터의크기를반환한다. int inmsg_recovery(char *data, msg_info_t *info) data 리모트노드로부터읽은데이터부분이다. info 리모트노드로부터읽은데이터의정보이다. 이중의미있는값은다음과같다. info->svc : tpacall() 했었던서비스이름 info->len : tpacall() 한데이터길이 info->err : 에러시 tperrno Tmax TCP IP Gateway Guide 54

56 info->uid : 이전 get_msg_info() 시에생성되었던 UID 값 리턴값 : 사용자는이함수에서새로운데이터의길이를반환해야한다. 데이터의길이가 0 보다클경우, info->svc 에값이존재하면해당서비스로 tpacall(..., TPNOREPLY) 하고, 그외에는리모트노드로응답을보낸다. 데이터의길이가음수일경우데이터를버린다. 함수명 : outmsg_recovery 설명 : 이함수는리모트노드로요청을보낼때에러가발생할경우호출된다. 사용자는함수내에서적당히새로운데이터를만들고원하는서비스이름및 UID 등을설정하고, 데이터의크기를반환한다. 사용법 : int outmsg_recovery(char *data, msg_info_t *info) data 리모트노드로보낼데이터이다. info 리모트노드로보낼데이터의정보이다. 이중의미있는값은다음과같다. info->len : 데이터길이 info->uid : TCPGW 가임의로생성한 UID 값 info->msgtype : 1000 이상이면외부로응답을보내다에러발생 에러발생 1000 미만이면외부로요청을보내다 55 Tmax TCP IP Gateway Guide

57 info->err : TPECLOSE 이면응답을기다리다채널이끊어진경우 그외에는요청을보내려다에러가발생한경우 리턴값 : 사용자는이함수에서새로운데이터의길이를반환해야한다. 데이터의길이가 0 보다클경우, info->svc 에값이존재하면해당서비스로 tpacall(..., TPNOREPLY) 하고, 그외에는 info->msgtype 이 1000 이상이면데이터를버리고 info->msgtype 이 1000 미만이면데이터를 call 한쪽으로되돌려준다. 함수명 : get_extmsg_info 설명 : 사용법 : 이함수는 get_msg_info 와기본적으로기능은동일하다. 단, 데이터버퍼를더블포인터형으로넘겨서사용자가버퍼의메모리를재할당 (realloc) 할수있다. 이함수는 get_msg_info 와동시에사용될수없으며, 사용을위해서는 TCPGW 컴파일시 -D_TCPGW_USE_EXTMSG 플래그를설정해야한다. int get_extmsg_info(msg_header_t *hp, char **data, int asize, msg_info_t *info) hp 리모트노드로부터읽어온메시지헤더데이터대한포인터이다. get_msg_length 에서사용한구조체와동일하다. data 리모트노드로부터읽은데이터버퍼의주소값이다. asize 리모트노드로부터읽은데이터버퍼에할당된메모리 Tmax TCP IP Gateway Guide 56

58 크기이다. info TCP/IP Gateway library(libtcpgw.a, libtcpgw.so) 와 custom.c 와 interface 역할을해주는 structure 구조이다. 사용자가수신받은데이터를기초로해서 info 구조체의항목에각종정보를이함수에서설정한다. 리턴값 : Tmax 서비스로보낼 type 을정의한다. TCPGW 는이값을바탕으로 Tmax 로어떤처리를할것인지를판단한다. 예를들어, REMOTE_REQUEST 는리모트노드로부터 Request 가발생한것으로판단하며, REMOTE_REPLY 는 Tmax 서비스로부터 Request 가발생하여리모트노드로부터 Response 가오는경우리턴하는값이다. REMOTE_REPLY_CONT 는 Response 메시지가이어서올경우리턴하는값이며, REMOTE_SENDTOCLI 는비요청메시지일경우리턴하는값이다. 리모트노드로부터응답을수신한경우에는반드시 UID 값을 info 구조체의 uid 항목에지정해주어야한다. 그리고기타다른값들상황에맞게주어야한다. 함수명 : put_extmsg_info 설명 : 사용법 : 이함수는 put_msg_info 와기본적으로기능은동일하다. 단, 데이터버퍼를더블포인터형으로넘겨서사용자가버퍼의메모리를재할당 (realloc) 할수있다. 이함수는 put_msg_info 와동시에사용될수없으며, 사용을위해서는 TCPGW 컴파일시 -D_TCPGW_USE_EXTMSG 플래그를설정해야한다. int put_extmsg_info(msg_header_t *hp, char **data, int asize, msg_info_t *info) 57 Tmax TCP IP Gateway Guide

59 hp 리모트노드로보낼메시지의헤더이다. data 리모트노드로보낼데이터버퍼의주소값이다. asize 리모트노드로보낼데이터버퍼에할당된메모리크기이다. info 리모트노드로보낼데이터의정보이다. 리턴값 : 사용자는이함수에서실제적으로리모트노드에전송할데이터의전체길이를반환해야한다. 즉메시지헤더와실데이터를더한길이를반환한다. 함수명 : set_ping_msg 설명 : 사용법 : 이함수는채널장애감시를위해서보내어질메시지설정및주기, 타임아웃등을설정할수있는사용자함수이다. x 옵션을지정할경우반드시설정해주어야한다. int set_ping_msg(msg_header_t *hp, int *interval, int *binterval, int *timeout, int *mode) hp 채널장애감시를위해서주기적으로보내지는메시지이다. 사용자는이메시지를설정해야한다. interval 채널장애감시주기이다. ( 단위 : 초 ) 0 일경우, 채널장애감지기능은비활성화된다. Tmax TCP IP Gateway Guide 58

60 binterval 백업채널모드일때, 메인채널의상태를체크주기이다. ( 단위 : 초 ) 0 일경우, 메인채널의상태체크기능은비활성화된다. timeout 채널장애감시타임아웃이다. 타임아웃내에응답이오지않으면채널은끊어진다. ( 단위 : 초 ) 0 일경우, PING 메시지만보내고 PONG 메시지에대해서는신경쓰지않는다. (Half Duplex 장애감지 ) mode 장애감시할채널종류를지정한나. 0 은 OUT 채널, 1 은 IN 채널, 2 는모든채널을의미한다. 리턴값 : 에러발생시음수값을반환해야하며, 이경우장애감시기능은비활성화된다. 함수명 : chk_pong_msg 설명 : 사용법 : 이함수는채널장애감시응답메시지여부를체크하는사용자함수이다. int chk_pong_msg(msg_header_t *hp) hp 리모트단으로부터수신된메시지이다. 리턴값 : 59 Tmax TCP IP Gateway Guide

61 채널장애감시응답메시지이면서정상적일경우양수값을반환하며, 비정상적일경우음수값을반환한다. 채널장애감시응답메시지가아닐경우는 0 을반환한다. 음수값을반환할경우, 채널은끊어진다. 이절에서설명한함수들의사용예제는 4 장. 예제에서설명하도록한다 register.c 수정 사용자함수등록파일로서, 사용자가등록한함수들만게이트웨이라이브러리에서호출된다. 게이트웨이컴파일시, 반드시 register.c 를포함시켜야한다. 사용하지않는함수는 NULL 등록하면된다. <register.c> #include <stdio.h> #include "custom.h" extern int init_remote_info(char *myname, int mynumber, int num_channel, int key); extern int prepare_shutdown(int code); extern int remote_connected(int index, int addr, int portno, int type, int fd); extern int remote_closed(int index, int type); extern int get_msg_length(msg_header_t *hp); extern int get_msg_info(msg_header_t *hp, char *data, msg_info_t *info); extern int put_msg_info(msg_header_t *hp, char *data, msg_info_t *info); extern int put_msg_complete(msg_header_t *hp, char *data, msg_info_t *info); extern int get_channel_num(char *data); extern int get_service_name(char *header, int err, char *svc); extern int set_service_timeout(int uid, char *header); extern int get_msg_security(char **data, int asize, int len); extern int put_msg_security(char **data, int asize, int len); Tmax TCP IP Gateway Guide 60

62 extern int chk_end_msg(int len, char *data); extern int get_extmsg_info(msg_header_t *hp, char **data, int asize, msg_info_t *info); extern int put_extmsg_info(msg_header_t *hp, char **data, int asize, msg_info_t *info); extern int inmsg_recovery(char *data, msg_info_t *info); extern int outmsg_recovery(char *data, msg_info_t *info); extern int set_ping_msg(msg_header_t *hp, int *interval, int *bintrval, int *timeout, int *mode); extern int chk_pong_msg(msg_header_t *hp); /*************************************************************** * int * _register_custom() * * returns no used * [function number] * 1. init_remote_info * 2. prepare_shutdown * 3. remote_connected * 4. remote_closed * 5. get_msg_length * 6. get_msg_info * 7. put_msg_info * 8. put_msg_complete * 9. get_channel_num * 10. get_service_name * 11. set_service_timeout * 12. get_msg_security * 13. put_msg_security * 14. chk_end_msg * 15. get_extmsg_info * 16. put_extmsg_info * 17. inmsg_recovery * 18. outmsg_recovery * 19. set_ping_msg * 20. chk_pong_msg 61 Tmax TCP IP Gateway Guide

63 ***************************************************************/ int _register_custom() _tcpgw_regfn(1, init_remote_info); _tcpgw_regfn(2, prepare_shutdown); _tcpgw_regfn(3, remote_connected); _tcpgw_regfn(4, remote_closed); _tcpgw_regfn(5, get_msg_length); _tcpgw_regfn(6, get_msg_info); _tcpgw_regfn(7, put_msg_info); _tcpgw_regfn(8, put_msg_complete); _tcpgw_regfn(9, get_channel_num); _tcpgw_regfn(10, get_service_name); _tcpgw_regfn(11, set_service_timeout); _tcpgw_regfn(12, get_msg_security); _tcpgw_regfn(13, NULL); _tcpgw_regfn(14, chk_end_msg); _tcpgw_regfn(15, NULL); _tcpgw_regfn(16, NULL); _tcpgw_regfn(17, NULL); _tcpgw_regfn(18, NULL); _tcpgw_regfn(19, NULL); _tcpgw_regfn(20, NULL); return 1; Tmax TCP IP Gateway Guide 62

64 4 예제 본장에서는 2 장에서설명한 TCPGW 의각역할에대한예제에대해설명하도록한다. 4.1 OUTBOUND TCPGW 예제 개요및프로그램내용 TCPGW 가 Tmax 기동시에 boot 되어있다가리모트노드의요청이수신되면, 사용자가지정한서비스를호출한후에다시리모트노드로처리결과를주는예제이다. TCPGW 의클라이언트 / 서버방식에관계가없다. 그리고리모트노드의상황에맞게 custom.c 를수정하여 TCPGW 를구성한다. 그림 4-1 OUTBOUND TCP/IP Gateway 63 Tmax TCP IP Gateway Guide

65 4.1.2 프로그램구성 Config file TCPGW Server Remote Node : tcpgw.m : custom.c, custom.h : svr.c : rclient.c, custom.h <tcpgw.m> *DOMAIN res SHMKEY = 88000, MINCLH = 1, MAXCLH = 1, TPORTNO = 8888 *NODE node1 TMAXDIR="/home/tmax", APPDIR="/home/tmax/appbin" *SVRGROUP svg1 NODENAME = node1 *SERVER tcpgw SVGNAME = svg1, MIN = 1, MAX = 1, CPC = 5, SVRTYPE = CUSTOM_GATEWAY, CLOPT = "-- -P N 2 d 0" svr SVGNAME = svg1, MIN = 1, MAX = 1 *SERVICE TOUPPER SVRNAME = svr Tmax TCP IP Gateway Guide 64

66 <custom.h> #ifndef _CUSTOM_H_ #define _CUSTOM_H_ /* */ /* Fixed structures and macros */ #define MSG_MAGIC "Tmax" #define REMOTE_REQUEST 0 #define REMOTE_REPLY 1 #define SVC_NAME_LENGTH 20 /* 이 msg_info_t 는개발자가재정의하면안되는구조체이다. */ typedef struct msg_info char svc[svc_name_length]; int err; int len; int uid; int flags; int msgtype; int channel_id; msg_info_t; /* */ /* Modifiable structures and macros */ /* 이 msg_header_t 와 msg_body_t 는개발자가재정의가능한구조체이다. */ typedef struct msg_header int len; msg_header_t; typedef struct msg_body char name[16]; char data[100]; msg_body_t; 65 Tmax TCP IP Gateway Guide

67 #endif <custom.c> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <sys/types.h> #include <sys/timeb.h> #include "custom.h" /* msg_header_size 와 comm_header_size 는 TCPGW 라이브러리내에서사용되기때문에정의해주어야한다. */ int msg_header_size = sizeof(msg_header_t); int comm_header_size = 0; /* 아래의함수들은필요하지않은경우내부로직은구현하지않아도된다. */ /* 그러나 TCPGW 라이브러리내에서사용되기때문에정의는해주어야한다. */ int init_remote_info(char *myname, int mynumber, int num_channel, int key) return 1; int remote_connected(int index, int addr, int type, int fd) return 1; int get_msg_length(msg_header_t *hp) if (hp == NULL hp->len <= 0) return -1; /* 실제데이터의길이를리턴한다. */ /* 여기서리턴하는값으로리모트노드에서오는데이터를읽는다. */ Tmax TCP IP Gateway Guide 66

68 return ntohl(hp->len); int get_msg_info(msg_header_t *hp, char *data, msg_info_t *info) msg_body_t *body; if ((info == NULL) (hp == NULL) (data == NULL)) return -1; body = (msg_body_t *)data; info->len = ntohl(hp->len); info->err = 0; info->flags = 0; memset(info->svc, 0x00, SVC_NAME_LENGTH); strncpy(info->svc, body->name, 8); /* 리모트노드에서요청이들어오므로 REMOTE_REQUEST 를반환한다. */ return REMOTE_REQUEST; int get_service_name(char *header, int err, char *svc) return -1; int put_msg_info(msg_header_t *hp, char *data, msg_info_t *info) msg_body_t *body; if ((info == NULL) (hp == NULL) (data == NULL)) return -1; hp->len = htonl(info->len); body = (msg_body_t *)data; 67 Tmax TCP IP Gateway Guide

69 /* body->name 을이용하여에러유무전송 */ if (info->err) /* error */ strcpy(body->name, "Fail"); else strcpy(body->name, "Success"); /* 리모트노드로요청에대한결과를전송하기위한데이터길이를반환한다. */ return (info->len + sizeof(msg_header_t)); int get_channel_num(char *data) return -1; int put_msg_complete(char *hp, char *data, msg_info_t *info) return 1; int remote_closed(int index, int type) return 1; int prepare_shutdown(int code) return 1; int set_service_timeout(int uid, char *header) return 1; Tmax TCP IP Gateway Guide 68

70 int chk_end_msg(int len, char *data) return len; int outmsg_recovery(char *data, msg_info_t *info) return -1; int inmsg_recovery(char *data, msg_info_t *info) return -1; 69 Tmax TCP IP Gateway Guide

71 <Makefile> # 이 Makefile 은 ibm 32bit 용이다. #TARGET 은 Tmax 환경파일에서정의한 SERVER 이름과같아야한다. TARGET = tcpgw APOBJS = $(TARGET).o #TCPGW 를생성하기위해서는 libtcpgw.a 혹은 libtcpgw.so 를링크시켜야한다. LIBS = -ltcpgw -ltmaxgw OBJS = custom.o register.o CFLAGS = -q32 -O -I$(TMAXDIR) -D_DBG LDFLAGS = -brtl APPDIR = $(TMAXDIR)/appbin LIBDIR = $(TMAXDIR)/lib.SUFFIXES :.c.c.o: $(CC) $(CFLAGS) $(LDFLAGS) -c $< $(TARGET): $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -L$(LIBDIR) -o $(TARGET) $(OBJS) $(LIBS) mv $(TARGET) $(APPDIR)/. rm -f $(OBJS) $(APOBJS): $(TARGET).c $(CC) $(CFLAGS) $(LDFLAGS) -c $(TARGET).c Tmax TCP IP Gateway Guide 70

72 <svr.c> #include <stdio.h> #include <string.h> #include <usrinc/atmi.h> TOUPPER(TPSVCINFO *msg) int i; printf("toupper service is started!\n"); printf("input : len=%d, data='%s'\n", msg->len, msg->data); for (i = 0; i < msg->len; i++) msg->data[i] = toupper(msg->data[i]); printf("output: len=%d, data='%s'\n", strlen(msg->data), msg- >data); tpreturn(tpsuccess,0,(char *)msg->data, msg->len, 0); 71 Tmax TCP IP Gateway Guide

73 <rclient.c> ( 이예제프로그램은테스트를위한리모트노드의클라이언트프로그램이다. 테스트를위해서는 TCPGW 가기동된후이프로그램을기동시켜야한다.) #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include "custom.h" #define SERV_ADDR " " #define SERV_PORT 5050 int main(int argc, char *argv[]) int n, i, fd, ilen, olen; msg_header_t *header; msg_body_t *body, *result; /* 1 TCPGW 로연결을맺는다. */ if ( (fd = network_connect()) < 0 ) perror("network connect error:"); return -1; #ifdef _DBG printf("connected to TCP/IP Gateway: fd = %d \n", fd); #endif /* 2 전문을구성한다. */ /* Message Header */ header = (msg_header_t *)malloc(sizeof(msg_header_t)); memset(header, 0x00, sizeof(msg_header_t)); header->len = sizeof(msg_body_t); #ifdef _DBG printf("dbg : header->len = %d\n", header->len); Tmax TCP IP Gateway Guide 72

74 #endif /* Message Body */ body = (msg_body_t *)malloc(sizeof(msg_body_t)); memset(body, 0x00, sizeof(msg_body_t)); strncpy(body->name,"toupper", 16); for (i = 0; i < 1; i++) /* 3 TCPGW 로데이터를송신한다. */ if ( (n = send(fd, (char *)header, sizeof(msg_header_t), 0)) < 0 ) perror("network write error:"); close(fd); return -1; printf("msg header send!\n"); /* Message Body */ strncpy(body->data, argv[1], 100); #ifdef _DBG printf("name = %s\n", body->name); printf("msg body sending! [name:'%s', data='%s']\n", body- >name, body->data); #endif if ( (n = send(fd, (char *)body, sizeof(msg_body_t), 0)) <= 0 ) perror("network write error:"); close(fd); return -1; /* 4 TCPGW 로데이터를수신한다. */ if ( (n = recv(fd, (char *)&olen, 4, 0)) < 0 ) perror("network read error:"); close(fd); return -1; 73 Tmax TCP IP Gateway Guide

75 #ifdef _DBG printf("\n\nreturn len = %d \n", olen); #endif result = (msg_body_t *)malloc(olen); memset((char *)result, 0x00, olen); if ( (n = recv(fd, (char *)result, olen, 0)) <= 0 ) perror("network read error:"); close(fd); return -1; #ifdef _DBG printf("return [name = '%.*s', data = '%.*s']\n\n", sizeof(result->name), result->name, sizeof(result->data), result- >data); #endif /* 5 TCPGW 와연결을끊는다. */ close(fd); return 1; int network_connect() struct sockaddr_in serv_addr; int fd; memset((char *)&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(serv_addr); serv_addr.sin_port = htons((unsigned short)serv_port); if ((fd = socket(af_inet, SOCK_STREAM, 0)) < 0) #ifdef _DBG Tmax TCP IP Gateway Guide 74

76 printf("socket init error"); #endif return -1; if (connect(fd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) >= 0) return fd; close(fd); return -1; 75 Tmax TCP IP Gateway Guide

77 4.2 동기 TCPGW 예제 ( INBOUND ) 개요및프로그램내용 Tmax 클라이언트에서 ( 또는 Tmax 서비스에서 ) TCPGW 의서비스인 TCPGW 를 tpcall 하면 TCPGW 는리모트노드로데이터를전송한다. 리모트노드에서처리결과가수신되면해당클라이언트에게결과를리턴한다. Tmax 클라이언트에서리모트노드로서비스를요청할때중요한점은 UID 를설정하는일이다. 이 UID 는 TCPGW 라이브러리내부에서지정하는값 (info->uid) 을 put_msg_info 에서전문내용에저장하거나또는사용자가 UID 를만들어서전문내용에저장한후에 UID 값을 uid 항목에넣어주면된다. 이렇게 UID 를전문에저장하고리모트노드로요청을보내면리모트노드에서는해당 UID 를변경하지말고그대로되돌려주어야한다. TCPGW 는응답을수신한후에 get_msg_info 함수를호출하여 UID 값을가져와누가 TCPGW 를호출했는지를판단하여응답을리턴한다. 아래의예제는 TCPGW 가클라이언트로기동되는것이므로 Tmax 환경파일의 CLOPT 절에 -r, -p, -n 옵션을설정해준다. 그리고리모트노드의상황에맞게 custom.c 를수정하여 TCPGW 를구성한다. Tmax TCP IP Gateway Guide 76

78 그림 4-1 동기 INBOUND TCP/IP Gateway 프로그램구성 Config file TCPGW Remote Node Client : tcpgw.m : custom.c, custom.h : rserver.c, network.c, custom.h : cli_tcpgw.c, custom.h 77 Tmax TCP IP Gateway Guide