Tmax
Gateway Guide (X.25)
Tmax v5.0 SP1
Copyright © 2009 TmaxSoft Co., Ltd. All Rights Reserved.
Copyright Notice
Copyright © 2009 TmaxSoft Co., Ltd. All Rights Reserved.
대한민국 경기도 성남시 분당구 서현동 263 분당스퀘어(AK프라자) 12층
Restricted Rights Legend
All TmaxSoft Software (Tmax®) and documents are protected by copyright laws and the Protection Act of Com
puter Programs, and international convention. TmaxSoft software and documents are made available under the
terms of the TmaxSoft License Agreement and may only be used or copied in accordance with the terms of this
agreement. No part of this document may be transmitted, copied, deployed, or reproduced in any form or by any
means, electronic, mechanical, or optical, without the prior written consent of TmaxSoft Co., Ltd.
이 소프트웨어(Tmax®) 사용설명서의 내용과 프로그램은 저작권법, 컴퓨터프로그램보호법 및 국제 조약에 의해
서 보호받고 있습니다. 사용설명서의 내용과 여기에 설명된 프로그램은 TmaxSoft Co., Ltd.와의 사용권 계약 하에
서만 사용이 가능하며, 사용권 계약을 준수하는 경우에만 사용 또는 복제할 수 있습니다. 이 사용설명서의 전부 또
는 일부분을 TmaxSoft의 사전 서면 동의 없이 전자, 기계, 녹음 등의 수단을 사용하여 전송, 복제, 배포, 2차적 저
작물작성 등의 행위를 하여서는 안 됩니다.
Trademarks
Tmax®, Tmax WebtoB® and JEUS® are registered trademark of TmaxSoft Co., Ltd. Other products, titles or
services may be registered trademarks of their respective companies.
Tmax®, Tmax WebtoB® 와 JEUS®는 TmaxSoft Co., Ltd.의 등록 상표입니다. 기타 모든 제품들과 회사 이름은 각
각 해당 소유주의 상표로서 참조용으로만 사용됩니다.
Open Source Software Notice
This product includes various open source software that has been developed and/or licensed by “OpenSSL”, “RSA
Data Security, Inc.”, “Apache Foundation”, or “Jean-loup Gailly and Mark Adler.” TmaxSoft fully respects the
aforementioned parties and the open source software used in this product. More details can be found within the
directory “${INSTALL_PATH}/license/oss_licenses”
본 제품은 “OpenSSL”, “RSA Data Security, Inc.”, “Apache Foundation” 및 “Jean-loup Gailly와 Mark Adler”에 의
해 개발 또는 라이선스된 오픈 소스 소프트웨어를 포함합니다. 오픈 소스 소프트웨어와 개발자에 대해 경의를 표
합니다. 관련 상세 정보는 제품의 디렉터리 “${INSTALL_PATH}/license/oss_licenses”에 기재된 사항을 참고해 주
십시오.
안내서 정보
안내서 제목: Tmax Gateway Guide (X.25)
발행일: 2009-08-10
소프트웨어 버전: Tmax v5.0 SP1
안내서 버전: v2.1.1
내용 목차
안내서에 대하여 .......................................................................................................................... vii
제1장
소개 ................................................................................................................................. 1
1.1.
개요 ............................................................................................................................ 1
1.2.
서비스의 유형 .............................................................................................................. 2
제2장
동기형 X25GW .................................................................................................. 2
1.2.2.
비동기형 X25GW .............................................................................................. 6
환경 설정 .......................................................................................................................... 9
2.1.
2.2.
2.3.
2.4.
2.5.
제3장
1.2.1.
Tmax 환경 구성 ............................................................................................................ 9
2.1.1.
X25GW의 사용 옵션 ........................................................................................ 10
2.1.2.
서비스 블록형 X25GW의 환경파일 ................................................................... 12
2.1.3.
서비스 NON-블록형 X25GW의 환경파일 ........................................................... 13
2.1.4.
리모트 동기형과 비동기형 X25GW 환경파일 ..................................................... 14
X25GW 채널 환경 설정 ............................................................................................... 15
2.2.1.
기본적인 채널 환경파일 ................................................................................... 15
2.2.2.
머신별 채널 환경파일 ....................................................................................... 16
사용자 헤더 환경 설정 및 사용 방법 ............................................................................. 17
2.3.1.
사용자 헤더 환경파일 ....................................................................................... 17
2.3.2.
사용자 헤더 사용 방법 ...................................................................................... 18
게이트웨이 기타 기능 ................................................................................................. 18
2.4.1.
게이트웨이 헤더 .............................................................................................. 18
2.4.2.
서비스명을 찾는 순서 ....................................................................................... 19
2.4.3.
사용자 임의의 채널 지정 .................................................................................. 19
2.4.4.
RESET 처리 방법 ............................................................................................ 20
사용자 프로그램 ......................................................................................................... 20
2.5.1.
custom.h 수정 ................................................................................................. 20
2.5.2.
custom.c 수정 .................................................................................................. 21
2.5.3.
register.c 수정 ................................................................................................. 27
예제 ................................................................................................................................ 29
3.1.
OUTBOUND X25GW 예제 .......................................................................................... 29
3.1.1.
3.2.
동기 INBOUND X25GW 예제 ...................................................................................... 34
3.2.1.
3.3.
프로그램 구성 .................................................................................................. 29
프로그램 구성 .................................................................................................. 35
NON 블록킹 X25GW 예제 ........................................................................................... 41
3.3.1.
Appendix A.
프로그램 구성 .................................................................................................. 42
CUSTOM INFO .................................................................................................... 51
A.1.
구조체 ....................................................................................................................... 51
A.2.
CUSTOM INFO Flags ................................................................................................. 52
Appendix B.
X25GW 에러 코드 ................................................................................................ 53
Tmax iii
그림 목차
[그림 1.1]
X25GW 동작 구조 ........................................................................................................ 1
[그림 1.2]
동기 / 비동기 X25GW 동작 구조 ................................................................................... 2
[그림 1.3]
블록형 동기 X25GW .................................................................................................... 3
[그림 1.4]
NON 블록형 동기 X25GW ............................................................................................ 4
[그림 1.5]
리모트 요청 동기형 X25GW ......................................................................................... 5
[그림 1.6]
비동기형 X25GW ......................................................................................................... 6
[그림 1.7]
비동기형 X25GW ......................................................................................................... 7
[그림 3.1]
OUTBOUND X.25 게이트웨이 .................................................................................... 29
[그림 3.2]
동기 INBOUND X.25 게이트웨이 ................................................................................ 35
[그림 3.3]
NON 블록킹 X25GW .................................................................................................. 42
Tmax v
안내서에 대하여
안내서의 대상
®
본 안내서는 Tmax (이하 Tmax)에서 제공하는 X.25 게이트웨이를 사용하는 개발자를 위해 기술되었다.
본 안내서는 Tmax 서버와 Non Tmax 서버의 인터페이스를 담당하는 Tmax에서 제공되는 X.25 게이트웨
이에 대해서 기술한 안내서이다.
안내서의 전제 조건
본 안내서는 Tmax 시스템에 대한 전반적인 이해와 Tmax 시스템이 제공하는 각종 기능 및 특성에 대한 습
득을 위한 기본서이다.
본 안내서를 원활하게 이해하기 위해서는 다음과 같은 사항을 미리 알고 있어야 한다.
● 미들웨어(Middleware) 및 UNIX 시스템에 대한 이해
● Tmax의 기본 개념 이해
● Java , C 프로그래밍의 이해
안내서의 제한 조건
본 안내서를 읽기 전에 Tmax의 기본 개념을 숙지하고 있어야 한다. 실무에서의 구체적인 사용방법이나
관리 및 운용에 관한 사항은 각 제품의 안내서를 참고한다.
참고
Tmax 시스템 개발에 대한 기본적인 내용은 "Tmax Administration Guide"나 "Tmax Application Devel
oment Guide"를 참고한다. Tmax에서 제공하는 명령어와 C API에 대한 설명은 “Tmax Reference
Guide”를 참고한다.
안내서에 대하여 vii
안내서 구성
Tmax Gateway Guide (X.25)는 총 3개의 장과 Appendix로 구성되어 있다.
각 장의 주요 내용은 다음과 같다.
● 제1장: 소개
본 안내서에서 설명하는 X.25 게이트웨이의 개요 및 서비스 유형에 대해 기술한다.
● 제2장: 환경설정
Tmax 에서 제공되는 X.25 게이트웨이의 환경 구성 및 설정 방법에 대해 기술한다.
● 제3장: 예제
서비스 유형에 따른 예제를 기술한다.
● Appendix A.: CUSTOM INFO
CUSTOM INFO 구조체 및 Flags에 대해 기술한다.
● Appendix B.: X25GW 에러 코드
X25 게이트웨이의 에러 코드에 대해 기술한다.
viii Tmax Gateway Guide (X.25)
안내서 규약
표기
의미
<AaBbCc123>
프로그램 소스 코드의 파일명
<Ctrl>+C
Ctrl과 C를 동시에 누름
[Button]
GUI의 버튼 또는 메뉴 이름
진하게
강조
" "(따옴표)
다른 관련 안내서 또는 안내서 내의 다른 장 및 절 언급
'입력항목'
화면 UI에서 입력 항목에 대한 설명
하이퍼링크
메일계정, 웹 사이트
>
메뉴의 진행 순서
+----
하위 디렉터리 또는 파일 있음
|----
하위 디렉터리 또는 파일 없음
참고
참고 또는 주의사항
[그림 1.1]
그림 이름
[표 1.1]
표 이름
AaBbCc123
명령어, 명령어 수행 후 화면에 출력된 결과물, 예제코드
[]
옵션 인수 값
|
선택 인수 값
안내서에 대하여 ix
시스템 사용 환경
요구 사항
Platform
IBM AIX 5.x
HP-UX 11.xx
Solaris 7~9 (SunOS 5.7~5.9)
Hardware
최소 120MB 하드디스크 공간
256MB 이상 메모리 공간
1GB 이상 하드디스크와 512MB 이상 메모리 공간 권장
Database
x Tmax Gateway Guide (X.25)
Oracle 9i 또는 10g
관련 안내서
안내서
설명
Tmax
Tmax를 이용하기 위한 환경설정을 하는 방법과 시스템 운영방식을
Administration Guide
기술한 안내서이다.
안내서에 대하여 xi
연락처
Korea
TmaxSoft Co., Ltd
263 BundangSquare (AK Plaza) 12th floor, Seohyeon-dong, Bundang-gu,
Seongnam-si, Gyeonggi-do, 463-824
South Korea
Tel: +82-31-8018-1000
Fax: +82-31-8018-1115
Email: [email protected]
Web (Korean): http://www.tmax.co.kr
기술지원: http://technet.tmaxsoft.com
USA
TmaxSoft, Inc.
560 Sylvan Avenue Englewood Cliffs, NJ 07632
U.S.A
Tel: 1-201-567-8266
Fax: 1-201-567-7339
Email: [email protected]
Web (English): http://www.tmaxsoft.com
Japan
TmaxSoft Japan Co., Ltd.
5F Sanko Bldg, 3-12-16 Mita, Minato-Ku, Tokyo, 108-0073
Japan
Tel: +81-3-5765-2550
Fax: +81-3-5765-2567
Email: [email protected]
Web (Japanese): http://www.tmaxsoft.co.jp
xii Tmax Gateway Guide (X.25)
China
TmaxSoft China Co., Ltd.
Beijing Silver Tower, RM 1508, 2# North Rd Dong San Huan,
Chaoyang District, Beijing, China, 100027
China
Tel: +86-10-6410-6145~8
Fax: +86-10-6410-6144
Email: [email protected]
Web (Chinese): http://www.tmaxsoft.com.cn
ASEAN Office
TmaxSoft Pte. Ltd.
30 Cecil Street, Level 15 Unit 05 Prudential Tower, Singapore 049712
Singapore
Tel: +65-6232-2889
Fax: +65-6232-2919
Email: [email protected]
Web (English): http://asean.tmaxsoft.com
안내서에 대하여 xiii
제1장 소개
1.1. 개요
X.25 게이트웨이(이하 X25GW)는 Tmax 서버와 Non Tamx 서버(이하 리모트 노드)간의 인터페이스를 담
당하는 Tmax에서 제공되는 게이트웨이이다. X25GW는 Tmax 서버의 한 종류로써 X.25로 연결되어 있는
UNIX/Windows 서버 등과의 게이트웨이 역할을 한다.
Tmax 환경파일에 서버로 등록해야만 사용할 수 있다. 하지만 일반 다른 서버들을 만드는 방식과는 다르
게 생성해 주어야 한다. 일반 서버는 TCS나 UCS용 서버 라이브러리를 이용하여 서버를 생성하나 X25GW
는 외부와 통신을 담당하는 라이브러리(libx25gw.a, libx25gw.so)와 사용자가 작성한 프로그램(custom.c)
과 Link하여 서버를 생성한다.
Non Tmax에서 보내온 메시지를 X25GW는 해당 서비스를 tpacall()하며, 서비스 결과는 처음 요청한 Non
Tmax 서버로 전송한다. 반대로 Tmax 서비스에서 X25GW를 tpcall()이나 기타 다른 방식으로 서비스를 요
청하면 X25GW는 Non Tmax로 요청 메시지를 보낸 후 응답이 오면 자신을 call한 서비스로 tpreturn()한다.
복잡하게 타 시스템과 X.25로 연결하기 위해 필요한 작업들, 예를 들어 Attach, Detach, 메시지를 주고 받
는 일 등은 모두 X.25 게이트웨이에서 처리해 주고, 개발자는 업무 로직만을 작성하면 되므로 개발자들은
손쉽게 타 시스템과 연결할 수 있다.
X25GW의 대략적인 동작 구조는 다음과 같다.
[그림 1.1] X25GW 동작 구조
X25GW는 위의 그림에서 보듯이 리모트 노드로부터 서비스 요청을 받아서 처리할 수 있고(그림 1.1 에서
실선 표시), Tmax 클라이언트나 서비스로부터 서비스 요청을 받아서 리모트 노드로 서비스 요청을 할 수
도 있다.(그림 1.1에서 점선 표시) 리모트 노드로 부터 서비스 요청을 받아서 처리하는 것을 OUTBOUND
서비스라 하고, Tmax 클라이언트로부터 서비스 요청을 받아서 리모트 노드로 서비스 요청을 하는 것을
INBOUND 서비스라 한다.
제1장 소개 1
[그림 1.2] 동기 / 비동기 X25GW 동작 구조
Tmax 클라이언트나 서비스에서 X25GW를 바로 호출하고 응답이 올때까지 기다리는 동기적인 호출 방식
(그림 1.2 에서 점선 표시)이 있다. 이와는 달리 비동기적인 호출 방식은 Tmax 클라이언트가 Tmax 서비스
를 호출하면 그 서비스에서 X25GW로 제어권이 넘어가서 해당 서비스는 다른 서비스 요청을 받을 수 있
게 되고, X25GW가 리모트 노드로부터 응답을 받게 되면 응답을 처리하는 서비스로 요청을 넘겨주는 방
식으로 동작하게 된다.(그림 1.2 에서 실선 표시)
여러가지 동작 방식에 대해서는 “1.2. 서비스의 유형” 에서 좀 더 상세히 설명하도록 한다.
이러한 여러가지 유형에 맞추어 X25GW를 작성하기 위해서는 Tmax 환경을 설정하고 프로그램(custom.c,
custom.h)을 작성해야 하므로 더 자세한 사항은 본 안내서의 “2.5. 사용자 프로그램” 과 “제3장 예제”에서
더 상세히 설명하도록 한다.
1.2. 서비스의 유형
X25GW는 Tmax에서 제공하는 라이브러리(libx25gw.a, libx25gw.so)와 개발자가 작성하는 custom.c,
custom.h를 함께 링크하여 만들어진다. 이렇게 만들어진 X25GW는 리모트 노드와 통신을 하며, Tmax 클
라이언트의 요청을 리모트 노드로 보내기도 하고 리모트 노드의 요청을 Tmax 서비스에서 처리하도록 중
간역할을 해 준다.
X25GW는 크게 동작하는 방식에 따라 동기형 X25GW와 비동기형 X25GW로 나눈다.
1.2.1. 동기형 X25GW
동기형 방식은 Tmax의 클라이언트나 서버에서 서비스를 요청하고 응답이 서비스를 요청한 클라이언트
나 서버로 오는 방식이다. 반대로 리모트 노드에서 서비스를 요청하면 X25GW는 Tmax의 서비스를 요청
하고 그 결과를 서비스를 요청한 리모트 노드에 되돌려주기도 한다. 전자인 경우 리모트 노드로 서비스를
요청한 Tmax 서비스가 블록되는가, 또는 블록되지 않는가에 따라 X25GW는 다르게 동작한다. 또한, 후자
인 경우에는 리모트 노드에서 요청한 처리 결과를 돌려줄 때 요청한 채널로 돌려주는 방식이다.
2 Tmax Gateway Guide (X.25)
Tmax의 클라이언트나 서버에서 리모트 노드로 동기형 방식으로 서비스를 요청할 경우에는 반드시 X25GW
와 리모트 노드간에 UID(Unique ID.)를 서로 공유해야 한다.
서비스 블록형 방식
서비스 블록형 방식 방식은 Tmax의 서버나 클라이언트에서 X25GW로 서비스를 요청하고 그 결과가 올
때까지 기다리는 가장 일반적인 방식이다. 아래 그림 처럼 Tmax 클라이언트의 요청을 받은 서비스에서
X25GW로 서비스를 tpcall을 하면 리모트 노드에서 처리 결과를 송신할 때까지 Tmax 서비스(SVC1)가 블
록되어 있게 된다.
[그림 1.3] 블록형 동기 X25GW
블록형 동기 X25GW는 다음과 같은 흐름으로 동작한다.
1. X25GW와 리모트 노드는 연결되어 있는 상태이다.
2. Tmax 클라이언트는 Tmax 서비스를 tpcall한다.
3. Tmax 서비스에서는 클라이언트의 요청을 받아들여 X25GW로 서비스를 tpcall한다.
4. X25GW는 연결되어 있는 리모트 노드에 서비스를 요청한다.
5. 리모트 노드에서 결과가 오면 에러인지 아닌지를 판단하여 X25GW 서비스를 호출한 Tmax 서비스로
tpreturn한다.
6. 결과를 받은 Tmax 서비스는 Tmax 클라이언트로 tpreturn한다.
이와 같은 방식으로 X25GW를 동작시키게 되면 Tmax 클라이언트에서 호출한 Tmax 서비스는 X25GW를
호출한 후에 결과를 받을 때까지 블록이 되어 있게 된다. (tpacall()을 한 경우도 tpgetrply()로 응답을 받는
곳에서 블록이 되기 때문에 tpcall()과 마찬가지로 블록이 되게 된다.) 따라서 많은 수의 요청을 받아들이기
제1장 소개 3
위해서는 블록이 되는 시간까지 감안하여 많은 수의 서버를 실행해야 한다. 이는 대외기관 통신에서는 대
외기관의 장애(머신, 네트워크)에 따라서 많은 수의 서버가 필요로 하기 때문이다.
서비스 NON 블록형 방식
서비스 NON 블록형 방식은 Tmax 클라이언트에서 직접 X25GW를 요청하는 방식에서는 사용할 수 없고,
X25GW에 서비스를 요청하고 결과를 수신하는 서버를 중간에 두어서 처리하는 방식이다. X25GW 앞에
송신 서비스와 수신 서비스를 두고 Tmax 클라이언트는 송신 서비스를 호출하고, 송신 서비스는 X25GW
로 서비스를 전달하고 서비스를 종료한다. X25GW는 리모트 노드로 서비스를 요청하여 그 결과를 수신하
면, 해당 결과를 수신 서비스에게 전달한다. 수신 서비스는 X25GW로부터 결과를 수신받아 클라이언트에
게 전달하면 서비스 사이클이 종료되는 방식이다. 결과적으로 클라이언트는 서비스를 요청하고 결과를
받는 동기방식이나 서버는 요청을 전달하고 종료하는 비동기방식처럼 동작한다.
[그림 1.4] NON 블록형 동기 X25GW
NON 블록형 동기 X25GW는 다음과 같은 흐름으로 동작한다.
1. X25GW와 리모트 노드는 연결되어 있는 상태이다.
2. Tmax 클라이언트는 Tmax 서비스를 tpcall한다.
3. Tmax 서비스에서는 클라이언트의 요청을 받아들여 X25GW 서비스를 tpforward한다.
4. X25GW는 연결되어 있는 리모트 노드에 메시지를 전송한다.
5. 리모트 노드에서 결과가 오면 에러인지 아닌지를 판단하여 tprelay할 서비스로 tprelay한다.
6. X25GW 서비스로부터 결과를 받은 서비스(Tmax클라이언트로 부터 tprelay할 서비스로 지정된 서비스)
는 Tmax 클라이언트로 tpreturn한다.
이와 같이 동작하는 X25GW는 블록형 방식에서 수행하는 방식보다도 적은 서버로도 많은 처리를 할 수
있다. 블록형 방식은 서비스가 X25GW를 호출하고 블록되기 때문에 동시에 많은 처리를 위해서는 보다
많은 서버 프로세스를 실행 해야하나, NON 블록형 방식에서는 자신의 일만 처리하고 서비스를 종료하기
4 Tmax Gateway Guide (X.25)
때문에 적은 서버 프로세스로도 많은 일을 할 수 있다. 따라서 대외기간 간에 통신을 처리 하는 경우에는
NON 블록형 방식이 보다 효율적이라고 할 수 있다.
리모트 동기형 호출 방식
리모트 동기형 호출 방식은 리모트 노드에서 X25GW로 먼저 서비스를 요청하는 방식이다. X25GW는 리
모트 노드에서 요청한 서비스를 호출하고 그 결과를 받아서 해당 서비스를 요청한 채널로 결과를 전송한
다. 리모트 노드는 동시에 X25GW로 Tmax Config에 정의되어 있는 MAXSACALL 개수를 초과하여 호출
할 수 없다.
[그림 1.5] 리모트 요청 동기형 X25GW
리모트 요청 동기형 X25GW는 다음과 같은 흐름으로 동작한다.
1. X25GW와 리모트 노드는 연결되어 있는 상태이다.
2. 리모트 노드는 X25GW와 연결된 채널로 메시지를 전송한다.
3. X25GW는 tpacall()로 Tmax 서비스를 호출한다.
4. 서비스 처리 결과를 X25GW는 받아서 메시지를 요청한 채널을 찾는다.
5. 해당 채널이 정상적으로 연결되어 있으면 결과를 전송한다.
이와 같은 동작 방식은 리모트 노드에서 Tmax의 서비스를 호출하는 가장 보편적인 방식이다. X25GW는
리모트 노드의 채널 정보를 보관하였다가 서비스로부터 결과를 수신받으면, 보관하고 있는 채널중에서
해당 채널을 찾아서 결과를 전송한다. 이때 해당 채널로 결과를 되돌려 주기전에 다른 요청은 얼마든지 가
능하다. 즉, X25GW는 리모트 노드에서 요청한 채널은 블록시키지 않고 다음 요청을 받을 수 있도록 처리
하기 때문에 X25GW를 운영하는 방식에 따라서 다르게 처리할 수 있다.
제1장 소개 5
1.2.2. 비동기형 X25GW
비동기형 호출 방식은 Tmax의 클라이언트나 서버 또는 리모트 노드에서 X25GW 서비스를 요청만 하고,
그 결과는 받지 않거나 또는 서비스를 요청한 곳이 아닌 다른 프로그램에서 처리하는 방식이다. 먼저 Tmax
의 서비스에서 X25GW로 서비스를 요청하고 그 결과는 다른 서비스로 받을 수 있다. 그러나 클라이언트
인 경우에는 비동기형으로 처리할때는 tpacall로써 응답을 받지 않는 경우에만 가능하다. 반대로, 리모트
노드에서 서비스를 먼저 요청하는 경우에 위에서와 같이 서비스만 요청하고 결과를 받지 않을수도 있고,
서비스를 요청하고 결과는 다른 채널로 돌려주는 방식이 비동기형 방식이다.
Tmax에서 서비스 요청 방식
Tmax의 서비스에서 X25GW로 tpacall에 TPNOREPLY로 요청하고 해당 서비스는 종료한다. X25GW는
리모트 노드로 요청를 보내고 해당 결과가 수신되면 Tmax의 다른 서비스를 tpacall에 TPNOREPLY로 호
출하여 결과를 처리하게 하는 방식이다.
[그림 1.6] 비동기형 X25GW
Tmax에서 서비스 요청을 하면 다음과 같은 흐름으로 동작한다.
1. Tmax 서비스에서 X25GW로 서비스를 요청한다.(tpacall에 TPNOREPLY)
2. X25GW는 리모트 노드로 데이터를 전송한다.
3. X25GW는 리모트 노드로 부터 데이터를 수신받는다.
4. X25GW는 Tmax의 다른 서비스 호출한다.(tpacall에 TPNOREPLY)
6 Tmax Gateway Guide (X.25)
리모트에서 서비스 요청 방식
리모트 노드에서 먼저 서비스를 X25GW로 요청하면, X25GW는 tpacall로 Tmax 서비스를 요청한다. Tmax
의 서비스 처리가 완료되면 X25GW는 리모트 노드와 연결된 채널중에서 사용가능한 채널중 아무 채널에
처리 결과를 전송한다.
[그림 1.7] 비동기형 X25GW
리모트에서 서비스 요청을 하면 다음과 같은 흐름으로 동작한다.
1. 리모트 노드에서 X25GW로 서비스를 요청한다.
2. X25GW는 Tmax의 서비스를 tpacall로 요청한다.
3. Tmax의 서비스를 처리 결과를 X25GW에 전달한다.
4. X25GW는 리모트 노드와 연결된 채널중에서 채널 테이블에서 채널을 검색하여 결과를 전송한다.
제1장 소개 7
제2장 환경 설정
X25GW 서버가 구성되려면 다음과 같은 파일들이 존재하여야 한다.
다음은 UNIX에서 사용되는 파일이다.
디렉터리
파일명
lib
lbx25gw.a, libx25gw.so libtmaxgw.a libtmaxgw.so
lib64
lbx25gw.a, libx25gw.so libtmaxgw.a libtmaxgw.so
다음은 Windows에서 사용되는 파일이다.
디렉터리
파일명
lib
x25gw.dll tmaxgw.dll
lib64
x25gw.lib tmaxgw.lib
위의 파일(X25GW 라이브러리)들은 Tmax 설치시에 각 디렉터리 아래에 만들어지지만 custom.c나 custom.h
는 따로 제공되므로 필요할 경우 기술지원 담당자에게 요청해야 한다.
X25GW 라이브러리와 적절하게 구현한 custom.c, custom.h를 컴파일하여 X25GW를 생성하게 된다.
2.1. Tmax 환경 구성
X25GW를 사용하기 위해서는 Tmax 환경파일에 X25GW를 서버로서 등록 해야 한다. 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
제2장 환경 설정 9
*SERVER
x25gw
SVGNAME = svg1,
MIN = 1,
MAX = 1,
CPC = 10,
SVRTYPE=CUSTOM_GATEWAY,
CLOPT=”-- -F /home/tmax/config/x25gw.cfg –N 4096 –h 20”
*SERVICE
X25GW1
SVRNAME=x25gw, SVCTIME=20
X25GW2
SVRNAME=x25gw, SVCTIME=25
X25GW를 사용하기 위해 Tmax 환경파일을 수정할 때는 SERVER, SERVICE 절만 설정하면 된다.
항목
설명
MIN
X25GW의 프로세스 개수를 지정하는 항목으로써 이 항목의 값이 1보다 클 경우에는
X25GW 환경파일에 프로세스 별로 채널 정보를 다르게 정의해야 한다. (“2.2. X25GW
채널 환경 설정” 내용을 참고한다.)
CPC
CPC 항목은 Tmax 엔진과 X25GW간의 채널 수를 지정하는 항목으로써, Tmax의 클
라이언트나 서비스에서 리모트 노드로 요청하는 경우에는 동시에 요청하는 수만큼
CPC 수를 지정해야 한다. NON 블록형인 경우에는 동시 요청 수만큼 지정할 필요가
없이 적당한 수만큼만 지정하면 된다. 반대인 경우에는 X25GW는 Tmax 엔진으로
tpacall로 요청하므로 많은 채널을 사용할 필요는 없다.
CLOPT
“2.1.1. X25GW의 사용 옵션” 내용을 참고한다.
SVCTIME
X25GW는 하나의 서버 프로세스에 여러 개의 서비스를 지정하여 서비스마다 SVCTIME
값을 다르게 적용할 수 있다. 이를 위해서 *SERVICE 절에 여러 개의 서비스를 지정
하고, 서비스마다 SVCTIME 값을 다르게 지정하면 X25GW는 해당 요청한 서비스별
로 지정한 서비스 Time 값을 사용한다.
2.1.1. X25GW의 사용 옵션
X25GW는 Tmax config 파일에 등록할 수 있는 항목이 제한되어 있는 관계로 CLOPT 항목에 많은 옵션을
설정할 수 있다. 아래에 설명하는 옵션에 따라서 X25GW이 동작 방식이 다르므로 아래의 설명을 정확히
이해해야 한다.
옵션
설명
r
리모트 노드와 채널이 끊어졌을 때 재 연결 재 연결 횟수를 지정하는 옵션이다. X25GW
는 리모트 노드와 채널별로 지정한 횟수를 초과하여 끊어진 경우에는 재 연결을 시도
하지 않는다.(기본값: 무한)
10 Tmax Gateway Guide (X.25)
옵션
설명
N
X25GW와 리모트 노드간에 송수신하는 가장 큰 메시지의 사이즈이다. X25GW에서
는 옵션에서 지정한 사이즈 만큼 메모리를 확보하여 수신받기 때문에 넉넉한 사이즈
를 지정해야 한다.
n
X25GW와 리모트 노드간에 한번에 송수신 할 수 있는 사이즈를 지정한다. “-N” 옵션
으로 지정한 전체 메시지를 이 옵션에서 지정한 사이즈 단위로 송수신한다. 옵션의 사
이즈는 “-N” 옵션의 값보다 클 수 없다.(기본값: “-N” 옵션과 같다.)
t
X25GW에서 사용하는 채널 중 리모트 노드와 연결이 끊어진 경우 즉시 리모트 노드
와 채널을 연결하지 않고 설정 시간마다 연결할 수 있도록 시간(초)를 지정하는 옵션
이다. X25GW는 주어진 시간 간격으로 채널이 끊어진 경우 재 연결을 시도한다.(기본
값: 3초)
k
사용자가 공유메모리를 확보하여 X25GW 환경파일에서 정의한 채널의 상태를 사용
자가 저장할 수 있도록 공유메모리의 키 값을 입력하는 옵션이다. X25GW는 미리 공
유메모리를 확보하지 않고 전적으로 사용자에게 전달하여 사용자가 임의로 사용하도
록 전달하는 역할만 한다. X25GW가 최초 실행시 사용자 Routine(init_remote_info)를
호출할 때 넘겨주어서 사용자가 공유메모리를 확보하는데 사용한다.
F
X25GW의 채널 정보가 등록되어 있는 환경파일명을 지정하는 항목이다. X25GW 환
경파일 등록 방법은 아래 설명을 참고한다.
S
NON 블록킹 모드로 X25GW를 사용하거나 또는 비동기 방식으로 사용하고자 할 때
X25GW가 요청할 서비스명을 등록하는 옵션이다. NON 블록킹 모드로 사용할 때
Tmax의 송신 서비스는 X25GW로 tpforward하고, 리모트 노드에서 수신한 응답을
X25GW는 수신 서비스에게 tprelay하기 위해서 relay될 서비스명을 등록한다. 또한,
비동기 통신방식에서 Tmax 클라이언트나 서비스는 X25GW로 서비스를 요청(tpacall
with TPNOREPLY)하고 끝난다. 이 후에 리모트 노드에서 수신받은 응답은 일반적으
로는 TPNOREPLY로 호출했으므로 데이터를 버리게 되는데, 이 옵션에 서비스명을
지정하면 X25GW는 지정한 서비스에 tpacall로 응답 데이터를 전달한다. 이 옵션으로
지정한 서비스는 반드시 등록되어있는 서비스명이어야 한다.
H
Tmax 클라이언트나 서비스와 X25GW 사이에 사용자 정보 데이터를 주고 받고자 하
는 경우에 사용한다. 옵션으로 지정한 데이터는 리모트 노드로 전송하지 않고 임시
X25GW에서 보관하였다가 응답이 수신되면 사용자 정보 데이터에 응답 데이터를 붙
여서 호출한 서비스에게 전달하고자 하는 경우에 사용한다. NON 블록킹 모드로 사용
할 때, 송신 서비스와 수신 서비스가 분리되어 있어 송신 서비스에서 수신 서비스에게
데이터를 전달하고자 하는 경우에 많이 사용한다.
h
위의 “-H” 옵션과 동일한 옵션이다. 위의 옵션은 동기 방식이나 비동기 방식 모두에 적
용하는 옵션인데 반해 이 옵션은 단지 tpforward에 tprelay로 사용하는 호출에 대해서
만 적용된다.
a
X25GW를 비동기 통신 방식으로 사용하고자 할 때 사용하는 옵션이다. 비동기 통신
방식은 서비스를 요청하고 종료하는 형태이다. 서비스에 대한 응답도 X25GW는 다른
서비스에 대한 요청으로 간주한다.
제2장 환경 설정 11
옵션
설명
u
Tmax 클라이언트나 서비스에 X25GW로 리모트 노드에 서비스를 요청할 때 사용자
가 채널를 지정할 수 있도록 사용하는 옵션이다. 옵션을 사용하기 위해서는 사용자는
“-k” 옵션을 사용하여 채널에 대한 상태 정보를 보관하고 있어야 한다. 사용자가 지정
한 채널이 사용할 수 없으면 X25GW는 에러를 반환한다.
리모트 노드에서 Tmax의 서비스를 요청한 이후에 서비스는 정상적으로 처리되었으
Y
나 결과를 리모트 노드에 전송할 수 없는 경우, 이전에 처리한 서비스에 대해서 취소
처리를 할 수 있도록 복구 서비스를 지정하는 옵션이다. 리모트 노드에서 Tmax의 서
비스를 호출한 이후에 리모트 노드와 세션이 모두 끊어지면 서비스 처리 결과는 리모
트 노드로 전송하지 않고 버려지게 된다. 이 경우에 서비스는 정상 처리 하였으나 리
모트 노드 입장에서는 오류로 보기 때문에 문제가 발생할 수 있다. 이런 경우에 사용
자가 이 옵션에 서비스명을 지정하면 게이트웨이는 리모트로 결과를 전송할 수 없는
경우에 리모트 노드로 전송할 데이터를 지정한 서비스로 호출하게 된다.
UID로 활용될 수 있는 메시지 번호(sequence number)의 최대값을 설정하는 옵션이
y
다. 기본값은 50000이며 최대 268435455까지 지정 가능하다.
2.1.2. 서비스 블록형 X25GW의 환경파일
X25GW는 리모트 노드와 연결이 이루어지면 동기형/비동기형 모두 사용할 수 있다.
*DOMAIN
…
*NODE
…
*SVRGROUP
…
*SERVER
x25gw
SVGNAME=svg1,
MIN=1,
MAX=1,
CPC=10,
SVRTYPE=CUSTOM_GATEWAY,
CLOPT=”-- -F /home/tmax/config/x25gw.cfg”
*SERVICE
X25GW
SVRNAME=x25gw, SVCTIME=30
위와 같이 환경파일을 작성한 경우 x25gw라는 이름의 X25GW는 1개가 Tmax boot할 때 기동된다. X25GW
의 서비스명은 X25GW이고 Timeout이 30초이므로 30초 이내에 응답이 없으면 Timeout을 반환한다.
12 Tmax Gateway Guide (X.25)
단, Timeout은 Tmax의 클라이언트나 서비스에서 리모트 노드로 요청한 것에 대해서만 Timeout을 체크하
고, 리모트 노드에서 요청한 서비스에 대해서는 요청한 해당 서비스에서 Timeout을 설정해야 한다.
첫째, Tmax의 클라이언트나 서버에서 리모트 노드에 서비스 요청시 X25GW는 UID를 사용한다. UID는
메시지별 유일한 값으로써 요청에 대한 응답시 반드시 X25GW에 넘겨주어야 해당 서비스를 요청한 서비
스나 클라이언트에게 돌려주게 된다.
둘째, 리모트 노드에서 서비스 요청시 X25GW는 요청에 대한 응답을 요청한 채널에 전송한다. 단, 요청한
채널이 끊어진 경우에 데이터는 소멸된다.
2.1.3. 서비스 NON-블록형 X25GW의 환경파일
일반적으로 Tmax의 서비스에서 리모트 노드로 서비스를 요청하는 경우에 주로 사용한다. 그래서 일반
Tmax 클라이언트에서는 직접 이 방식으로 서비스를 호출할 수 없다. Tmax 클라이언트에서 직접 사용할
수 있는 방식은 블록형 방식이나 비동기 방식만 사용 가능하다.
*DOMAIN
…
*NODE
…
*SVRGROUP
…
*SERVER
x25gw
SVGNAME=svg1,
MIN=1,
MAX=1,
CPC=5,
SVRTYPE=CUSTOM_GATEWAY,
CLOPT=”-- -F /home/tmax/config/x25gw.cfg –S RECVSVC –H 20”
sendsvr
MIN=1, MAX=1
secvsvr
MIN=1, MAX=1
*SERVICE
X25GW
SVRNAME=x25gw, SVCTIME=30
SENDSVC
SVRNAME=sendsvr
RECVSVC
SVRNAME=recvsvr
위와 같이 환경파일을 작성한 경우 x25gw라는 이름의 X25GW 1개가 Tmax boot시에 기동된다. x25gw의
서비스명은 X25GW이고 Timeout이 30초이므로 30초 이내에 응답이 없으면 Timeout을 반환한다.
Tmax의 클라이언트나 서버에서 먼저 SENDSVC 서비스를 호출하면 SENDSVC에서 사전 작업을 수행한
후에 X25GW 서비스로 컨트롤을 넘긴다.(tpforward)
X25GW는 일단 Tmax 엔진에 채널 해제 메시지를 전송한 후에 리모트 노드로 서비스를 요청하고, 서비스
에 응답을 수신시 “-S” 옵션에 지정한 서비스로 결과를 전달(tprelay)한다. RECVSVC는 처리 결과에 대한
제2장 환경 설정 13
작업을 수행후 반환하면 원래 SENDSVC를 호출한 클라이언트나 서비스에게로 응답이 전달된다. 이 방식
을 사용하면적은 수의 서비스(SENDSVC)를 가지고 보다 많은 처리를 할 수 있다. 블록형처럼 반드시 UID
는 사용해야 한다.
리모트 노드의 응답이 지정한 시간(30초)를 초과하면 X25GW는 Timeout을 RECVSVC에 전달(tprelay)한
다. 그래서 RECVSVC 서비스에서는 반드시 tpurcode값을 확인하여 값이 0보다 크면 에러가 발생한 경우
이므로 이에 대한 적절한 처리를 하여야 한다.
Timeout 뿐만 아니라 모든 에러에 대해서는 tpurcode에 값이 전달됨으로 더 자세한 내용은 “Ap
pendix B. X25GW 에러 코드”를 참고한다.
2.1.4. 리모트 동기형과 비동기형 X25GW 환경파일
리모트 노드에서 요청하는 서비스에 대한 동기형 비동기형 구분은 X25GW 환경파일의 Reply 타입에 따
라서 결정되거나, 또는 사용자 정의 함수(get_msg_info)에서 flags에 TPNOREPLY를 설정하면 된다. 전자
의 경우에는 Reply 타입을 “no”로 설정하면 서비스에 대한 응답은 다른 채널로 전송될 수 있다. 후자인 경
우에는 리모트 노드로 응답을 전송하지 않는다.
*DOMAIN
…
*NODE
…
*SVRGROUP
…
*SERVER
x25gw
SVGNAME=svg1,
MIN=1,
MAX=1,
CPC=5,
SVRTYPE=CUSTOM_GATEWAY,
CLOPT=”-- -F /home/tmax/config/x25gw.cfg”
*SERVICE
X25GW
SVRNAME=x25gw
사용자 정의 함수(get_msg_info)에서 flags에 TPNOREPLY를 설정하면 서비스 응답은 리모트 노드에 전
송되지 않는다.
리모트 노드에서 Tmax의 서비스 요청시 X25GW는 tpacall를 사용함으로 응답을 받지 않고 동시에 tpacall
를 사용할 수 있는 개수가 제한 되어있다.(기본값 8개) 동시에 요청이 8개 이상인 경우에는 *DOMAIN 절
에 MAXSACALL 개수를 적당하게 지정해야 한다.
14 Tmax Gateway Guide (X.25)
2.2. X25GW 채널 환경 설정
X25GW는 리모트 노드와 통신하기 위한 채널 정보를 별도의 파일에 등록하고, 해당 파일의 이름을 “-F”
옵션에 등록해 주어야 한다. X25GW 채널 정보 파일에 등록하는 방법은 X25GW를 시용하는 머신(Machine)
에 따라 조금씩 차이가 있다. 그러므로 사용자는 머신별 채널 정보를 정확히 등록해야만 리모트 노드와 원
할한 통신이 이루어 짐으로 채널 정보 등록의 각각의 항목에 대해서 명확히 이해해야 한다.
먼저, 각 항목에 대해서 설명한 후에 각 머신별로 차이점을 설명할 것이다.
2.2.1. 기본적인 채널 환경파일
################################################################
################################################################
# x25gw_no | link_no | start_LCN_no | num_LCN | dir | reply_dedicated |
devpath [| group_id]
#
# x25gw_no : x25gw process number. 0부터 시작함.
# link_no : x25 link number
# start_LCN_no : LCN (LU) 시작 번호
# num_LCN :
LCN (LU) 갯수
# (start_LCN_no ~ (start_LCN_no + num_LCN))
# dir : LCN 채널 방향
#
in - 대외기관 to tmax request 전용 (Send)
#
out - tmax to 대외기관 request 전용 (Receive)
#
any - any direction
# reply_dedicated : yes이면 이 LCN으로 request된 메시지의 응답은 반드시 이 LCN으로 나감.
no 이면 아무거나 빈 LCN으로 나감
# devpath : x25 device path
# group_id : 채널 그룹명 (생략 가능)
################################################################
0 0 3 2 out no /dev/x25pkt
0 0 1 2 in
no /dev/x25pkt
다음은 기본적인 채널 환경파일 항목에 대한 설명이다.
항목명
설명
게이트웨이 번호
Tmax Config 파일의 MIN 항목이 2이상인 경우 하나의 X25GW 채널 정보 파
일에 모두 등록할 수 있다. X25GW 프로세스를 구분하기 위한 게이트웨이 번
호이다. 0부터 시작해서 MIN 항목의 값 – 1까지 표현한다. X25GW 프로세스
는 자신의 게이트웨이 번호에 해당하는 채널 정보를 로드하여 리모트 노드와
연결한다.
Link 번호
아래의 LCN이 속해 있는 Link 번호를 등록한다. 하나의 Link에는 많은 LCN(LU)
를 가질수 있다. 즉, 많은 LCN이 하나의 Link를 공유하여 리모트 노드와 통신
한다.
제2장 환경 설정 15
항목명
설명
시작 LCN번호
논리적인 번호로, 하나의 물리적인 Link를 많은 Logical LU로 분할하여 리모
트 노드와 LU별로 통신할 수 있다. LU의 시작 번호를 입력한다.
LCN 개수
시작 LCN 번호부터 Logical LU의 개수를 지정하는 항목이다. X25GW는 시
작 LCN 부터 LCN 개수 만큼의 채널을 리모트 노드와 연결한다.
채널타입
위에서
지정한
채널이
IN_CHANNEL인지
OUT_CHANNEL,
또는
ANY_CHANNEL인지를 구분하는 항목이다.
- IN_CHANNEL: 리모트 노드에서 X25GW로 요청이 들어오는 채널을 의미
한다.
- OUT_CHANNEL: X25GW에서 리모트 노드로 요청이 나가는 채널을 의미
한다.
- ANY_CHANNEL: 지정하면 IN/OUT 모두 사용할 수 있는 채널이다. 사용할
수 있는 값은 in, out, any 이다.
응답타입
리모트 노드에서 Tmax 서비스를 호출한 이후에 응답이 어느 채널로 나가는
지를 지정하는 항목이다.
- “yes”: 요청이 들어온 채널로 응답이 전송된다.
- “no”: OUT_CHANNEL이나 ANY_CHANNEL로 지정한 채널중 사용가능한
아무 채널로나 응답이 전송된다.
디바이스 명
X25GW의 디바이스 이름을 지정하는 항목이다. 머신마다 약간씩 다르다.
채널그룹명
채널을 그룹별로 구분해서 사용해야할 때 등록하여 사용할 수 있다.
2개 이상의 채널이 같은 그룹에 속하면, Round-Robin 방식의 로드 분산을 지
원한다.
2.2.2. 머신별 채널 환경파일
다음은 머신별 채널 환경파일에 대한 설명이다.
머신
항목명
설명
위의 “2.2.1. 기본적인 채널 환경파일”에서 설명한 방법대
IBM SUN
로 등록하면 된다.
HP
디바이스명
HP 머신에서는 디바이스명 항목에 디바이스명을 입력하
지 않고 인터페이스명을(Link 이름)을 입력한다. 나머지
항목은 IBM이나 SUN과 동일한다.
16 Tmax Gateway Guide (X.25)
머신
항목명
설명
NCR
시작 LCN 번호
NCR 머신은 LCN(LU)별로 로컬명이 따로 존재하기 때문
에 LCN별로 로컬명을 따로 지정해야만 한다. 항상 1로 한
다.
LCN 개수
항상 1을 입력한다.
디바이스 명
NCR는 로컬명과 리모트 이름으로 서로 연결함으로 로컬
명과 리모트명을 LCN별로 등록해 주어야 한다. 각 LCN에
해당하는 로컬 이름을 등록하는 항목이다.
디바이스 명 2
NCR인 경우만 사용하는 항목으로 리모트 LCN명을 입력
한다.
2.3. 사용자 헤더 환경 설정 및 사용 방법
X25GW는 사용자 헤더를 설정하여 사용할 수 있다. 사용자 헤더는 Tmax 클라이언트나 서비스에서 리모
트 노드로 서비스를 요청하는 경우에만 사용 가능하고, 그 반대인 경우에는 사용할 수 없다. 사용자 헤더
로 지정한 데이터는 리모트 노드로 전송되지 않고 임시 X25GW에서 UID 별로 보관하였다가 응답이 오면
응답 데이터에서 UID를 찿아서 해당 UID의 사용자 헤더 데이터와 응답 데이터를 전달하게 된다. 사용자
헤더 데이터의 길이는 최대(256 Bytes)까지만 사용할 수 있다.
2.3.1. 사용자 헤더 환경파일
사용자 헤더는 어떤 모드에서도 사용할 수 있는 옵션이다. 사용자 헤더는 2가지로 나누어서 지정할 수 있
는데, tpforward 방식으로 사용할 때(NON 블록킹)와 그 외의 다른 서비스(블록형, 비동기형)를 사용하는
경우 사용자 헤더 길이를 다르게 지정할 수 있다.
*DOMAIN
…
*NODE
…
*SVRGROUP
…
*SERVER
x25gw
SVGNAME=svg1,
MIN=1,
MAX=1,
CPC=10,
SVRTYPE=CUSTOM_GATEWAY,
CLOPT=”-- -F /home/tmax/config/x25gw.cfg –H 9 –h 10”
제2장 환경 설정 17
*SERVICE
X25GW
SVRNAME=x25gw
“-H” 옵션은 모든 종류의 서비스 요청에 대해서 사용자 헤더를 지정할 때 사용하는 옵션이다. 그에 반해 “h” 옵션은 단지 tpforward 방식(NON 블록킹)에서만 사용할 수 있는 옵션이다. X25GW는 사용자 헤더가
지정되었을 경우 리모트 노드로 전송하는 데이터 중에서 처음부터 일반 서비스는 9 Bytes, tpforward 인
경우에는 10 Bytes를 보관하고 나머지 데이터만 리모트 노드에 전송한다.(위의 config인 경우)
리모트 노드로부터 응답을 수신받으면 보관되어있는 사용자 헤더와 응답 데이터를 붙여서 반환한다.
2.3.2. 사용자 헤더 사용 방법
사용자 헤더는 여러가지 방법으로 사용할 수 있다. 사용자 헤더는 사용자가 임의로 사용할 수 있는 데이터
이므로 여기서는 여러 사이트에서 사용하는 일반적인 방법을 설명한다.
● tprelay나 비동기 서비스명 지정
사용자 헤더에 NON 블록형 방식으로 사용할 경우 tprelay될 서비스를 지정할 수 있다. 이 경우에 “-S”옵
션으로 지정한 것보다 우선한다. 사용자 헤더에도 서비스를 지정하고, “-S” 옵션으로 서비스를 지정하
였을 경우 X25GW는 먼저 사용자 헤더에서 사용자 함수(get_service_name)를 호출하여 서비스를 찾고,
여기에서 서비스를 찾지 못한 경우 “-S” 옵션으로 지정한 서비스를 사용한다.
비동기형 방식(tpacall에 TPNOREPLAY)로 호출하였을 경우에도 응답 데이터에 대해서 위와 동일하게
처리한다.
● Key 데이터 보관
NON 블록킹 모드로 사용할 경우 송신과 수신 서비스로 분리되는데 송신 서비스에서 데이터베이스에
적절한 작업을 처리하고 리모트 노드로 데이터를 전송하고 송신 서비스는 종료된다. 나중에 수신 서비
스에서 송신 서비스에서 처리한 데이터베이스의 Key 정보를 알고자 하는 경우나, 또는 수신 서비스에
리모트 노드에서 오류가 발생한 경우 데이터베이스를 되돌려 놓기 위한 중요한 데이터를 보관하고자
하는 경우에 많이 사용한다.
2.4. 게이트웨이 기타 기능
2.4.1. 게이트웨이 헤더
X25GW는 Tmax 클라이언트나 서버에서 호출할 경우 게이트웨이 헤더를 사용 할 수 있다. 이를 사용하기
위해서는 X25GW의 다른 라이브러리를 사용해야 한다. 보통은 (libx25gw.a, libx25gw.so)를 사용하나 게
이트웨이 헤더를 사용하고자 하는 경우에는 libx25gw.gwh.a나 libx25gw.gwh.so를 사용해야 한다. 게이트
웨이 헤더는 모든 데이터 버퍼의 가장 처음 Offset에 위치해야 한다. 사용자 헤더를 사용할 경우에 게이트
웨이 헤더 다음에 사용자 헤더가 와야한다.
18 Tmax Gateway Guide (X.25)
게이트웨이 헤더는 여러가지 다목적으로 사용하는데, X25GW에서는 여러 항목 중에서 svc 항목만 사용
가능하다. NON 블록킹 모드로 사용하는 경우나 비동기 방식으로 사용할 때 응답 데이터에 대해 처리할
서비스명을 지정하고자 하는 경우에 사용한다. 게이트웨이 헤더는 보통 사용자 헤더를 사용하지 않을 경
우에 응답을 처리할 서비스를 메시지별로 처리하고자 하는 경우에 사용한다
2.4.2. 서비스명을 찾는 순서
NON 블록형 X25GW나 또는 비동기형 X25GW인 경우 리모트 노드에서 온 요청이나 응답을 처리할 Tmax
의 서비스가 있어야 한다. X25GW는 서비스명을 알 수가 없으므로 사용자가 적당한 서비스명을 지정해야
하는데 X25GW는 다음과 같이 3가지 방식으로 서비스명을 찾는다.
1. 게이트웨이 헤더를 사용할 경우에만 가능하다. Tmax 클라이언트나 서비스에서 X25GW를 요청할 때
게이트웨이 헤더에 서비스명을 넣어서 X25GW를 호출하면 X25GW는 가장 우선적으로 이 서비스명을
사용한다.
2. 사용자 헤더에서 서비스명을 찾는다. Tmax 클라이언트나 서비스에서 X25GW를 요청할 때 사용자 헤
더에 서비스명을 넣은 후에 사용자 함수 get_service_name에서 서비스명을 얻을 수 있다.
3. CLOPT의 “-S” 옵션에 지정한 서비스를 이용한다. 이런 경우에는 모든 메시지에 대해서 동일한 서비스
가 적용된다.
이와 같은 순서로 X25GW는 서비스명을 찾는다. 단, 리모트 노드에서 최초로 서비스를 요청할 경우에는
위의 방식을 따르지 않고 사용자가 get_msg_info에서 서비스명을 지정해야 한다.
주의
서비스명은 반드시 Tmax config 파일에 등록되어 있어야 한다.
2.4.3. 사용자 임의의 채널 지정
완전한 비동기 방식으로 X25GW를 구성한 경우에 사용자는 리모트 노드로 전송할 채널을 지정할 수있다.
CLOPT 절에 “-a”를 사용한다. 완전한 비동기 방식은 서로간에 응답이 없다. 응답 데이터도 서비스 요청
형식으로 전달 되어야 한다. 예를 들어 Tmax의 클라이언트나 서비스에서 X25GW로 tpacall에 TPNOREPLY
로 호출하면 X25GW는 서비스 요청에 대한 UID와 어떤 정보 데이터도 보관하지 않고 리모트 노드로 데이
터를 전송하고 해당 서비스를 종료한다. 나중에 리모트 노드로부터 응답에 대한 메시지를 수신받았을 경
우에도 이를 서비스 요청으로 처리한다. 반대인 경우에(리모트 노드에서 먼저 요청)도 동일하게 처리한다.
위와 같은 경우에 사용자는 리모트 노드로 전송할 채널번호를 지정할 수 있다. CLOPT 절에 “-u” 옵션을
사용한다. 채널 지정은 다음과 같이 2가지 경우가 있다.
1. Tmax에서 먼저 서비스를 리모트 노드로 요청한 경우 X25GW는 get_channel_num 함수를 호출하는데
사용자는 전송 데이터를 분석하여 채널을 지정할 수 있다.
제2장 환경 설정 19
2. 리모트 노드에서 먼저 요청한 경우인데, 리모트 노드에서 서비스 요청시 get_msg_info 함수에서 리모
트 노드에서 요청한 채널을 데이터에 보관하여 Tmax 서비스를 호출한다. Tmax 서비스는 결과를 리모
트 노드로 전송하기 위해 tpacall에 TPNOREPLY로 다시 X25GW로 서비스를 보낸다. 사용자는
get_channel_num에서 이전에 보관한 채널을 사용하여 리모트 노드로 응답을 전송할 수 있다. X25GW
와 Tmax 엔진사이의 채널이 블록되지 않고 서비스를 요청한 채널로 응답을 전송할 수 있다.
2.4.4. RESET 처리 방법
X25GW에서는 리모트와 임의의 reset를 주고 받을 수 있다. 그러나 시스템 장애나 프로그램 버그, 또는 리
모트와 Config를 잘못 지정하여 비 정상적으로 많은 reset를 주고 받는 문제가 종종 발생한다. 이렇게 비
정상적으로 많은 reset이 발생하면 게이트웨이는 루핑이 돌게 되어 업무 처리를 할 수가 없게된다. 이러한
문제를 미연에 방지하기 위해 게이트웨이에서는 연속해서 reset이 지정된 횟수(100회)를 초과하면 자동
적으로 해당 채널의 세션을 해제하고 다시 연결을 맺도록하여 reset의 비 정상적인 문제를 해결하고 있다.
정상적으로 리모트에서 읽게되면 reset 횟수는 Clear된다.
2.5. 사용자 프로그램
Tmax의 환경을 설정하여 X25GW를 등록한 후에 X25GW를 사용하기 위해 해야 할 일은 custom.h, custom.c
를 적절히 수정하는 일이다. custom.c에는 여러가지 사용자 정의 함수가 있는데 각각에 대해서는 아래 설
명을 참조한다.
사용자 프로그램을 수정한 custom.h, custom.c와 X25GW 라이브러리 및 register.c를 링크하여 컴파일 하
면 X25GW가 완성된다. 이때 생성된 실행 파일명은 Tmax 환경파일의 SERVER 절에 등록된 이름과 동일
해야한다.
2.5.1. custom.h 수정
custom.h는 X25GW에서 사용되는 msg_info_t 구조체를 포함하는 파일로서 사용자가 리모트 노드와
X25GW간에 통신해야 할 기타 메시지 구조체나 헤더들을 수정할 수 있다. 그러나 msg_info_t 구조체는
X25GW 라이브러리 내부와 사용자 함수 사이에 사용하므로 멤버 변수나 타입, 길이등을 수정해서는 안된
다.
X25GW에서 사용되는 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;
20 Tmax Gateway Guide (X.25)
char sys_id[20];
/* 채널 그룹명 */
} msg_info_t;
구조체는 X25GW 라이브러리 내부와 사용자가 수정해야 하는 custom.c파일의 함수에서 사용된다. custom.c
파일에서는 리모트 노드로부터 메시지를 수신한 직후 불리우는 get_msg_info() 함수에서 이 구조체에 값
을 적절히 설정을 해야 한다. 또한 리모트 노드로 메시지를 송신하기 직전에 불리우는 함수인
put_msg_info() 함수에서 이 구조체의 값으로 리모트 노드로 송신한 데이터를 적절히 구성해야 한다.
get_msg_info()와 put_msg_info()의 수정사항에 대한 좀 더 자세한 내용은 “2.5.2. custom.c 수정” 에서 설
명하도록 한다.
2.5.2. custom.c 수정
custom.c는 개발자가 리모트 노드와 X25GW가 통신하기 위해 구현해야 하는 것으로 X25GW 라이브러리
(libx25gw.a, libx25gw.so)와 함께 컴파일해서 사용해야 한다.
이 custom.c는 정의된 형식에 맞게 구현해야 하며 그 형식은 다음과 같다.
init_remote_info
리모트 노드와 연결을 맺기에 앞서 호출된다. X25GW가 자신의 초기화 작업을 마친후에 곧바로 호출되는
함수로 한번만 호출된다. Tmax 환경파일의 CLOPT 절에 "–k "옵션으로 공유메모리 키를 설정한 경우 연
결에 대한 정보등을 저장하기 위해 공유메모리를 생성하는 로직이 구현할 수 있다. 경우에 따라 내부 로직
을 구현하지 않아도 된다.
● 프로토타입
int init_remote_info (char *myname, int mynumber, int num_channel, int key)
● 파라미터
파라미터
설명
myname
X25GW 서버명이다.
mynumber
같은 X25GW가 동시에 여러개 실행될 경우에 각각의 프로세스를 구분할 수
있는 X25GW 프로세스 번호이다. 0 부터 시작한다.
num_channel
X25GW가 연결하고 있는 max 채널 수이다. X25GW 환경파일에 정의한 채
널의 합이다.
key
Tmax 환경파일에서 "–k "옵션으로 설정한 공유메모리 키 값이다.
제2장 환경 설정 21
remote_connected
리모트 노드와 연결을 맺은 후 호출되는 함수이다. 리모트 노드와 연결을 맺은 후 해야할 작업이 있다면
함수에서 하도록 한다. 채널 수 만큼 호출된다. 또한 도중에 채널이 해제되었다가 다시 연결될 때도 호출
된다.
● 프로토타입
int remote_connected(int index, int linkno, int lcnno, int type)
● 파라미터
파라미터
설명
index
X25GW가 연결하고 있는 각각의 채널에 대한 자신의 index 값이다.
linkno
연결된 채널의 링크 번호이다.
lcnno
연결된 채널의 번호이다. 하나의 링크에 여러 개의 lcn이 있다. 일반적으로
Logical한 번호라고 인식하면 된다.
type
리모트 노드와 연결된 채널 타입이다. IN_CHANNEL 또는 OUT_CHANNEL
인지를 나타낸다
remote_closed
리모트 노드와 연결을 종료한 후 호출되는 함수이다. 리모트 노드와 연결이 끊어진 후에 해야할 작업이 있
다면 하도록 한다. init_remote_info 함수에서 공유메모리를 생성하는 로직을 구현한 경우 해제하는 작업
로직을 구현한다. 채널 수 만큼 호출된다.
● 프로토타입
int remote_closed(int index, int type)
● 파라미터
파라미터
설명
index
각각의 채널에 대한 자신의 index값이다.
type
리모트 노드와 연결된 채널 타입이다. IN_CHANNEL 또는 OUT_CHANNEL
인지를 나타낸다.
22 Tmax Gateway Guide (X.25)
get_msg_info
리모트 노드으로 부터 요청이나 응답이 도착하여 데이터를 읽은 후 데이터를 Tmax 서비스 프로그램으로
다시 요청이나 응답을 전송하기 전에 해당 데이터 값을 가공하거나, 정보전송을 위한 여러 정보(uid, len,
flags, service명 등)들을 X25 게이트웨이 라이브러리와 custom.c와의 인터페이스 역할을 하는 info를 참
조, 또는 가공하는 함수이다.
● 프로토타입
int get_msg_info(char *data,msg_info_t *info)
● 파라미터
파라미터
설명
data
리모트 노드로부터 읽은 데이터 부분이다.
info
X.25 게이트웨이 라이브러리(libx25gw.a, libx25gw.so)와 custom.c와 인터페
이스 역할을 해주는 structure 구조이다. 사용자가 수신 받은 데이터를 기초
로 해서 info 구조체의 항목에 각종 정보를 함수에서 설정한다.
● 반환값
Tmax 서비스로 보낼 type을 정의한다. X25GW는 이 값을 바탕으로 Tmax로 어떤 처리를 할 것인지를
판단한다. 예를 들어, REMOTE_REQUEST는 리모트 노드로 부터 Request가 발생한 것으로 판단하며,
REMOTE_REPLY는 Tmax 서비스로 부터 Request가 발생하여 리모트 노드로 부터 Response가 오는
경우 반환하는 값이다.
리모트 노드로부터 응답을 수신한 경우에는 반드시 UID 값을 info 구조체의 uid 항목에 지정해 주어야
한다. 그리고 기타 다른 값들도 상황에 맞게 주어야 한다.
get_channel_num
Tmax 서비스나 클라이언트로부터 요청한 데이터를 리모트 노드에 전송할 때 사용자가 채널을 선택할 수
있도록 한다. 사용자는 주어진 데이터의 특성에 따라서 전송할 채널을 지정할 수 있다. 여기서 지정하는
것은 리모트 노드와 연결된 소켓 번호가 아니라 단순한 채널 번호이다. X25GW는 사용자가 지정한 채널
을 사용할 수 없으면 오류를 반환한다.
● 프로토타입
int get_channel_num(char *data)
● 파라미터
제2장 환경 설정 23
파라미터
설명
data
리모트 노드로 보내기 위한 데이터이다.
● 반환값
채널 번호를 반환한다.
put_msg_info
리모트 노드로 메시지를 전송하고자 할 때 호출 합니다. 동기형 통신인 경우에는 사용자가 이 함수에서
UID를 메시지에 Save하여야 한다. UID는 info 구조체의 uid 항목의 값을 사용해도 되고, 또는 사용자가 임
의의 UID를 만들어서 사용한 후에 info의 uid 항목에 넣어주면 된다.
● 프로토타입
int put_msg_info(char *data, msg_info_t *info)
● 파라미터
파라미터
설명
data
리모트 노드로 보낼 데이터이다.
info
리모트 노드로 보낼 데이터의 정보이다.
● 반환값
실제적으로 리모트 노드에 전송할 데이터의 전체 길이를 반환해야 한다. 메시지 헤더와 실 데이터를 더
한 길이를 반한한다.
get_service_name3
Tmax에서 리모트 노드로 요청을 보낼때 요청을 보내는 서버와 결과를 받는 서버를 달리하는 NON 블록
형이나 비동기형 X25GW를 구성하는 경우 tpreply()나 tpacall()을 할 서비스의 이름을 오류코드에 따라서
설정한다.
● 프로토타입
int get_service_name(char *header, int err, char *svc)
● 파라미터
24 Tmax Gateway Guide (X.25)
파라미터
설명
header
"-H"또는 "-h"옵션으로 설정한, X25GW에서 저장하고 있는 사용자 헤더의 포
인터이다.
err
오류코드이다.
svc
tpreply()나 tpacall()를 받는 서비스의 이름을 설정한다.
prepare_shutdown
X25GW가 종료하기 직전에 call되는 함수로써, 일반적으로 init_remote_info() 함수에서 생성한 공유 메모
리를 해제하는 일 등을 한다.
● 프로토타입
int prepare_shutdown(int code)
● 파라미터
파라미터
설명
code
shutdown code로써 현재는 사용되지 않는다.
inmsg_recovery
리모트 노드로 부터 요청을 tpacall(..., TPBLOCK)로 처리했을 경우 서버가 떠 있지 않으면 에러가 돌아오
게 되는데, 이러한 때에 호출된다. 사용자는 함수 내에서 적당히 새로운 데이터를 만들고, 데이터의 크기
를 반환한다.
● 프로토타입
int inmsg_recovery(char *data, msg_info_t *info)
● 파라미터
파라미터
설명
data
리모트 노드로부터 읽은 데이터 부분이다.
info
리모트 노드로부터 읽은 데이터의 정보이다. 의미있는 값은 다음과 같다.
- info->svc : tpacall()했었던 서비스 이름
- info->len : tpacall()한 데이터 길이
- info->err : 에러시 tperrno
제2장 환경 설정 25
파라미터
설명
- 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 : X25GW가 임의로 생성한 UID 값
- info->msgtype: - 1000 이상이면 외부로 응답을 보내다 에러 발생
- 1000 미만이면 외부로 요청을 보내다 에러 발생
- info->err : TPECLOSE 이면 응답을 기다리다 채널이 끊어진 경우 그 외에
는 요청을 보내려다 에러가 발생한 경우
● 반환값
사용자는 새로운 데이터의 길이를 반환해야한다. 데이터의 길이가 0 보다 클 경우, info->svc 에 값이 존
재하면 해당 서비스로 tpacall(..., TPNOREPLY) 하고, 그 외에는 info->msgtype 이 1000 이상이면 데이
터를 버리고 info->msgtype 이 1000 미만이면 데이터를 call 한 쪽으로 되돌려 준다.
이 절에서 설명한 함수들의 사용 예제는 “제3장 예제” 에서 설명하도록 한다.
26 Tmax Gateway Guide (X.25)
2.5.3. register.c 수정
사용자 함수 등록 파일로서, 사용자가 등록한 함수들만 게이트웨이 라이브러리에서 호출된다. 게이트웨
이 컴파일 시, 반드시 register.c를 포함 시켜야 한다. 사용하지 않는 함수는 NULL 등록하면 된다.
<register.c>
#include <stdio.h>
#include "custom.h"
extern int init_remote_info(char *name, int index, int n, int key);
extern int prepare_shutdown();
#ifdef _NCR_X25
extern int remote_connected(int index, int pcid, char *lname, char *rname, int type);
#else
extern int remote_connected(int index, int linkno, int lcnno, int type);
#endif
extern int remote_closed(int index, int type);
extern int get_msg_info(char *data, msg_info_t *info);
extern int put_msg_info(char *data, msg_info_t *info);
extern int get_service_name(char *header, int err, char *svc);
extern int get_channel_num(char *data);
extern int inmsg_recovery(char *data, msg_info_t *info);
extern int outmsg_recovery(char *data, msg_info_t *info);
/***************************************************************
*
int
*
_register_custom()
*
*
returns no used
*
[function number]
*
1.
init_remote_info
*
2.
prepare_shutdown
*
3.
remote_connected
*
4.
remote_closed
*
5.
get_msg_info
*
6.
put_msg_info
*
7.
get_service_name
*
8.
get_channel_num
*
9.
inmsg_recovery
*
10. outmsg_recovery
***************************************************************/
int
_register_custom()
{
_x25gw_regfn(1,
init_remote_info);
_x25gw_regfn(2,
prepare_shutdown);
제2장 환경 설정 27
_x25gw_regfn(3,
remote_connected);
_x25gw_regfn(4,
remote_closed);
_x25gw_regfn(5,
get_msg_info);
_x25gw_regfn(6,
put_msg_info);
_x25gw_regfn(7,
get_service_name);
_x25gw_regfn(8,
get_channel_num);
_x25gw_regfn(9,
NULL);
_x25gw_regfn(10, NULL);
return 1;
}
28 Tmax Gateway Guide (X.25)
제3장 예제
3.1. OUTBOUND X25GW 예제
X25GW가 Tmax boot시에 기동되어 있다가 리모트 노드의 요청이 수신되면, 사용자가 지정한 서비스를
호출한 후에 다시 리모트 노드로 처리 결과를 주는 예제이다. 그리고 리모트 노드의 상황에 맞게 custom.c
를 수정하여 X25GW를 구성한다.
다음은 OUTBOUND X.25 게이트웨이 동작구조를 나타내는 그림이다.
[그림 3.1] OUTBOUND X.25 게이트웨이
3.1.1. 프로그램 구성
OUTBOUND X25GW 프로그램 구성은 다음과 같다.
● Config file : x25gw.m, x25gw.cfg
● X25GW : custom.c, custom.h
● Server : svr.c
<x25gw.m>
*DOMAIN
res
SHMKEY=88000,
MINCLH=1,
MAXCLH=1,
TPORTNO=8888
제3장 예제 29
*NODE
node1
TMAXDIR=”/home/tmax”,
APPDIR=”/home/tmax/appbin”
*SVRGROUP
svg1
NODENAME=node1
*SERVER
x25gw
SVGNAME=svg1,
MIN=1,
MAX=1,
CPC=5,
SVRTYPE=CUSTOM_GATEWAY,
CLOPT=”-- -F /home/tmax/config/x25gw.cfg”
svr
SVGNAME=svg1,
MIN=1, MAX=1
*SERVICE
TOUPPER
SVRNAME=svr
<x25gw.cfg>
# gwno | link_no | start_LCN_no | num_LCN | dir | reply_dedicated| dev_path
#
0 1 1 4 any no /dev/x25pkt
<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
#define SYSID_LENGTH
20
/* 이 msg_info_t는 개발자가 재정의하면 안되는 구조체 이다. */
typedef struct msg_info {
char
svc[SVC_NAME_LENGTH];
int
err;
30 Tmax Gateway Guide (X.25)
int
len;
int
uid;
int
flags;
int
msgtype;
int
channel_id;
char
sys_id[SYSID_LENGTH];
} msg_info_t;
typedef struct msg_body {
char
name[16];
char
data[100];
} msg_body_t;
#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”
/* 아래의 함수들은 필요하지 않은 경우 내부 로직은 구현하지 않아도 된다. */
/* 그러나 X25GW 라이브러리 내에서 사용되기 때문에 정의는 해주어야 한다. */
int init_remote_info(char *myname, int mynumber, int num_channel, int key)
{
return 1;
}
int remote_connected(int index, int linkno, int lcnno, int type)
{
return 1;
}
int get_msg_info(char *data, msg_info_t *info)
{
msg_body_t *body;
if ((info == NULL) || (data == NULL))
return -1;
body = (msg_body_t *)data;
제3장 예제 31
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(char *data, msg_info_t *info)
{
msg_body_t *body;
if ((info == NULL) || (data == NULL))
return -1;
body = (msg_body_t *)data;
/* body->name을 이용하여 에러 유무 전송 */
if (info->err)
/* error */
strcpy(body->name, “Fail”);
else
strcpy(body->name, “Success”);
/* 리모트 노드로 요청에 대한 결과를 전송하기 위한 데이터 길이를 반환한다. */
return info->len;
}
int get_channel_num(char *data)
{
return -1;
}
int remote_closed(int index, int type)
{
return 1;
}
int prepare_shutdown(int code)
{
return 1;
32 Tmax Gateway Guide (X.25)
}
int outmsg_recovery(char *data, msg_info_t *info)
{
return -1;
}
int inmsg_recovery(char *data, msg_info_t *info)
{
return -1;
}
<Makefile>
# 이 Makefile은 ibm 32bit 용이다.
#TARGET은 Tmax 환경파일에서 정의한 SERVER이름과 같아야 한다.
TARGET = x25gw
APOBJS = $(TARGET).o
#X25GW를 생성하기 위해서는
#libX25GW.a혹은 libX25GW.so를 링크시켜야 한다.
LIBS = -lx25gw -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
제3장 예제 33
<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);
}
3.2. 동기 INBOUND X25GW 예제
Tmax 클라이언트에서(또는 Tmax 서비스에서) X25GW의 서비스인 “X25GW”를 tpcall하면 X25GW는 리
모트 노드로 데이터를 전송한다. 리모트 노드에서 처리 결과가 수신되면 해당 클라이언트에게 결과를 반
환한다.
Tmax 클라이언트에서 리모트 노드로 서비스를 요청할 때 중요한 점은 UID를 설정하는 일이다. UID는
X25GW 라이브러리 내부에서 지정하는 값(info->uid)을 put_msg_info에서 전문 내용에 저장 하거나 또는
사용자가 UID를 만들어서 전문 내용에 저장한 후에 UID 값을 uid 항목에 넣어주면 된다. 이렇게 UID를 전
문에 저장하고 리모트 노드로 요청을 보내면 리모트 노드에서는 해당 UID를 변경하지 말고 그대로 되돌
려 주어야 한다.
X25GW는 응답을 수신한 후에 get_msg_info 함수를 호출하여 UID값을 가져와 누가 X25GW를 호출했는
지를 판단하여 응답을 반환한다.
34 Tmax Gateway Guide (X.25)
다음은 동기 INBOUND X.25 게이트웨이 동작구조를 나타내는 그림이다.
[그림 3.2] 동기 INBOUND X.25 게이트웨이
3.2.1. 프로그램 구성
동기 X25GW 프로그램 구성은 다음과 같다.
● Config file : x25gw.m, x25gw.cfg
● X25GW : custom.c, custom.h
● Client : cli_x25gw.c, custom.h
<x25gw.m>
*DOMAIN
res
SHMKEY=88000,
MINCLH=1,
MAXCLH=1,
TPORTNO=8888
*NODE
node1
TMAXDIR=”/home/tmax”,
APPDIR=”/home/tmax/appbin”
*SVRGROUP
svg1
NODENAME=node1
제3장 예제 35
*SERVER
x25gw
SVGNAME=svg1,
MIN=1,
MAX=1,
CPC=5,
SVRTYPE=CUSTOM_GATEWAY,
CLOPT=”-- -F /home/tmax/config/x25gw.cfg”
*SERVICE
X25GW
SVRNAME=x25gw
<x25gw.cfg>
# gwno | link_no | start_LCN_no | num_LCN | dir | reply_dedicated| dev_path
#
0 1 1 4 any no /dev/x25pkt
<custom.h>
#ifndef _CUSTOM_H_
#define _CUSTOM_H_
/* ---------------------------------------------------------- */
/*
Fixed structures and macros
#define MSG_MAGIC
“Tmax”
#define REMOTE_REQUEST
0
#define REMOTE_REPLY
#define SVC_NAME_LENGTH
#define SYSID_LENGTH
*/
1
20
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;
char
sys_id[SYSID_LENGTH];
} msg_info_t;
/* ---------------------------------------------------------- */
36 Tmax Gateway Guide (X.25)
/*
Modifiable structures and macros
*/
/* 이 msg_header_t와 msg_body_t는 개발자가 재정의 가능한 구조체 이다. */
#define UID_FIELD 98
#define SVC_NAME_FIELD 92
#define UID_LENGTH 4
#define SVC_LENGTH 6
typedef struct msg_body {
char
data[92];
char
name[6];
char
uid[4];
} msg_body_t;
#endif
/* _CUSTOM_H_ */
<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”
/* 아래의 함수들은 필요하지 않은 경우 내부 로직은 구현하지 않아도 된다. */
/* 그러나 X25GW 라이브러리 내에서 사용되기 때문에 정의해 주어야 한다. */
int get_channel_num(char *data)
{
return -1;
}
int put_msg_complete(char *hp, char *data, msg_info_t *info)
{
return 1;
}
int get_service_name(char *header, int err, char *svc)
{
return -1;
}
int init_remote_info(char *myname, int mynumber, int num_channel, int key)
{
return 1;
제3장 예제 37
}
int remote_connected(int index, int addr, int type, int fd)
{
return 1;
}
int get_msg_info(char *data, msg_info_t *info)
{
info->flags = 0;
if ((info == NULL) || (data == NULL))
return -1;
info->err = 0;
info->flags = 0;
/* info->uid 를 설정한다. */
memcpy((char *)&(info->uid), (char *)&data[UID_FIELD], UID_LENGTH);
strncpy(info->svc, (char *)&data[SVC_NAME_FIELD], SVC_LENGTH);
info->svc[SVC_LENGTH] = 0;
if (info->uid == 0) {
return REMOTE_REQUEST;
}
else {
return REMOTE_REPLY;
}
}
int put_msg_info(char *data, msg_info_t *info)
{
int
nSize = 0;
if ((info == NULL) || (data == NULL))
return -1;
if (info->err) {
printf(“info->err = %d\n”, info->err);
return -1;
}
else
/* 리모트 노드로 REQUEST를 하는 경우는 반드시 이 uid를 */
/* 라이브러리 내부에서 설정한 값으로 설정해 주어야 한다.*/
memcpy((char *)&data[UID_FIELD], (char *)&(info->uid),
UID_LENGTH);
38 Tmax Gateway Guide (X.25)
memcpy((char *)&data[SVC_NAME_FIELD], info->svc, SVC_LENGTH);
return info->len;
}
int remote_closed(int index, int type)
{
return 1;
}
int prepare_shutdown(int code)
{
return 1;
}
int outmsg_recovery(char *data, msg_info_t *info)
{
return -1;
}
int inmsg_recovery(char *data, msg_info_t *info)
{
return -1;
}
<Makefile>
#이 Makefile은 ibm 32bit 용이다.
#TARGET은 Tmax 환경파일에서 정의한 SERVER이름과 같아야 한다.
TARGET = x25gw
APOBJS = $(TARGET).o
#X25GW를 생성하기 위해서는 libX25GW.a혹은 libX25GW.so를 링크시켜야 한다.
LIBS = -lx25gw -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 $<
제3장 예제 39
$(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
<cli_x25gw.c>
/* 이 프로그램은 X25GW에 서비스를 요청하는 Tmax 클라이언트이다.
X25GW와 리모트 노드와의 연결이 완료된 후 이 프로그램을 실행한다. */
#include <stdio.h>
#include <usrinc/atmi.h>
#include "custom.h"
int main(int argc, char **argv)
{
int ret;
msg_body_t *body;
char *buf;
long rlen;
ret = tmaxreadenv("tmax.env", "TMAX");
if (ret < 0) {
printf("tmaxreadenv fail...[%s]\n", tpstrerror(tperrno));
}
ret = tpstart((TPSTART_T *)NULL);
if (ret < 0) {
printf("tpstart fail...[%s]\n", tpstrerror(tperrno));
return -1;
}
buf = tpalloc("STRING", 0, 0);
if (buf == NULL){
printf("buf tpalloc fail..[%s]\n", tpstrerror(tperrno));
tpend();
return -1;
}
body = (msg_body_t *)buf;
memcpy(body->data, argv[1], strlen(argv[1]));
body->data[51] = 0;
40 Tmax Gateway Guide (X.25)
/* X25GW 서비스를 호출한다. */
ret = tpcall("X25GW", buf, sizeof(msg_body_t), &buf, &rlen, 0);
if (ret < 0){
printf("tpcall fail...[%s]\n", tpstrerror(tperrno));
tpfree((char *)buf);
tpend();
return -1;
}
body = (msg_body_t *)buf;
printf("return value = %s\n", body->data);
tpfree((char *)buf);
tpend();
}
3.3. NON 블록킹 X25GW 예제
NON 블록킹 X25GW 방식은 보통 대외계와 통신하는 경우에 많이 사용한다. 이 방식을 이용하면 적은 프
로세스 수로도 시스템에 부하를 적게 주면서 보다 많을 일을 처리할 수 있기 때문이다.
블록형 방식은 Tmax 클라이언트나 서비스에서 직접 X25GW를 호출하여 응답을 받았으나 이 방식은 송
신 프로세스와 X25GW로부터 응답을 처리하는 수신 프로세스를 분리하여 처리한다.
X25GW를 호출하고자 하는 모든 프로세스는 먼저 송신 프로세스를 호출하면, 송신 프로세스는 X25GW
를 호출하기 전에 사전 작업을 완료하고 X25GW로 서비스 컨트롤을 넘긴다.(tpforward)
다음에 X25GW는 넘겨받은 서비스 처리를 하기전에 Tmax 엔진과 연결되어 있는 채널의 블록상태를 해
제하고 리모트 노드로 서비스를 송신한다. 리모트 노드로부터 응답을 수신받으면 X25GW는 수신 메시지
를 처리할 수신 서비스를 찾는 순서에 따라서 찾아 수신 프로세스에게 서비스 컨트롤을 넘긴다. 수신 프로
세스는 응답을 처리한 후에 최초로 서비스를 호출한 프로세스에게 결과를 전달한다.
위와 같은 원리로 서비스되므로 실제 X25GW를 호출하는 서비스나 tprelay받는 서비스는 비동기적으로
작동하므로 수행시간에 대한 부하를 거의 가지지 않는다.
최초로 송신 서비스를 호출하는 프로세스는 응답이 올때까지 기다리므로 블록되어 있는 상태이다.
예제는 리모트 노드가 서버가 되고 X25GW가 클라이언트로서 연결을 맺는 구조이다.
제3장 예제 41
[그림 3.3] NON 블록킹 X25GW
3.3.1. 프로그램 구성
NON 블록킹 X25GW 프로그램 구성은 다음과 같다.
● Config file : x25gw.m, x25gw.cfg
● X25GW : custom.c, custom.h
● Server : sndsvr.c, rcvsvr.c
● Client : cli_x25gw.c, custom.h
<x25gw.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
x25gw
SVGNAME=svg1,
MIN=1,
42 Tmax Gateway Guide (X.25)
MAX=1,
CPC=5,
SVRTYPE=CUSTOM_GATEWAY,
CLOPT=”-- -F /home/tmax/config/x25gw.cfg –S RECVSVC –H 9”
sndsvr
SVGNAME=svg1,
MIN=1,
MAX=1
rcvsvr
SVGNAME=svg1,
MIN=1,
MAX=1
*SERVICE
X25GW
SVRNAME=x25gw
SENDSVC
SVRNAME=sndsvr
RECVSVC
SVRNAME=rcvsvr
<x25gw.cfg>
# gwno | link_no | start_LCN_no | num_LCN | dir | reply_dedicated| dev_path
#
0
1
1
4
any
no
/dev/x25pkt
<custom.h>
/* ---------------------- custom.h -------------------------- */
#ifndef _CUSTOM_H_
#define _CUSTOM_H_
/* ---------------------------------------------------------- */
/*
Fixed structures and macros
*/
/* Common of Agent Define */
#define MSG_MAGIC
“Tmax”
#define REMOTE_REQUEST
0
#define REMOTE_REPLY
1
#define SVC_NAME_LENGTH
20
#define SYSID_LENGTH
20
/* 이 msg_info_t는 개발자가 재정의하면 안되는 구조체 이다. */
typedef struct msg_info {
char
svc[SVC_NAME_LENGTH];
int
err;
int
len;
제3장 예제 43
int
uid;
int
flags;
int
msgtype;
int
channel_id;
char
sys_id[SYSID_LENGTH];
} msg_info_t;
/* ---------------------------------------------------------- */
/*
Modifiable structures and macros
#define UID_FIELD
58
#define SVC_NAME_FIELD
52
*/
#define UID_LENGTH 4
#define SVC_LENGTH 6
#define MSG_KEEP_SVC_SIZE
9
typedef struct msg_body {
char
retsvcname[9]; /* -H옵션 만큼의 내부적으로 저장할 서비스 이름 */
char
data[52];
char
name[6];
char
uid[4];
} msg_body_t;
/* 리모트 노드와 통신할 때는 body내부의 헤더인 retsvcname을 제외한 구조체 */
typedef struct remote_body{
char
data[52];
char
name[6];
char
uid[4];
}remote_body_t;
#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”
/* 아래의 함수들은 필요하지 않은 경우 내부 로직은 구현하지 않아도 된다. */
/* 그러나 X25GW 라이브러리 내에서 사용되기 때문에 정의해 주어야 한다. */
int get_channel_num(char *data)
44 Tmax Gateway Guide (X.25)
{
return -1;
}
/* 이 함수에서 tprelay할 함수 명을 설정해 준다. */
int get_service_name(char *header, int err, char *svc)
{
/*내부적으로 저장하고 있는 사용자 헤더는 retsvcname이므로 바로 strcpy한다.*/
strcpy(svc, header);
svc[8] = 0;
return 1;
}
int init_remote_info(char *myname, int mynumber, int num_channel, int key)
{
return 1;
}
int remote_connected(int index, int linkno, int lcnno, int type)
{
return 1;
}
/* get_msg_info와 put_msg_info는 동기 클라이언트 X25GW와 동일하게 구현한다. */
int get_msg_info(char *data, msg_info_t *info)
{
info->flags = 0;
if ((info == NULL) || (data == NULL))
return -1;
info->err = 0;
info->flags = 0;
/* info->uid 를 설정한다. */
memcpy((char *)&(info->uid), (char *)&data[UID_FIELD], UID_LENGTH);
strncpy(info->svc, (char *)&data[SVC_NAME_FIELD], SVC_LENGTH);
info->svc[8] = 0;
if (info->uid == 0) {
return REMOTE_REQUEST;
}
else {
return REMOTE_REPLY;
}
}
제3장 예제 45
int put_msg_info(char *data, msg_info_t *info)
{
int
nSize = 0;
if ((info == NULL) || (data == NULL))
return -1;
if (info->err) {
printf(“info->err = %d\n”, info->err);
return -1;
}
else
/* 리모트 노드로 REQUEST를 하는 경우는 반드시 이 uid를 */
/* 라이브러리 내부에서 설정한 값으로 설정해 주어야 한다.*/
memcpy((char *)&data[UID_FIELD], (char *)&(info->uid), 4);
memcpy((char *)&data[SVC_NAME_FIELD], info->svc, 6);
return info->len;
}
int remote_closed(int index, int type)
{
return 1;
}
int prepare_shutdown(int code)
{
return 1;
}
int outmsg_recovery(char *data, msg_info_t *info)
{
return -1;
}
int inmsg_recovery(char *data, msg_info_t *info)
{
return -1;
}
<Makefile>
“3.2. 동기 INBOUND X25GW 예제” 의 Makefile 예제와 동일하다.
46 Tmax Gateway Guide (X.25)
<sndsvr.c>
#include <string.h>
#include <stdio.h>
#include <usrinc/atmi.h>
SENDSVC(TPSVCINFO *msg)
{
char *sndbuf;
long len;
printf("[%s] Service Started!\n", msg->name);
len = (msg->len);
printf("len is [%d]\n", len);
if ((sndbuf=(char *)tpalloc("CARRAY", NULL, len)) == NULL) {
printf("sndbuf alloc failed !\n");
tpreturn(TPFAIL, -1, NULL, 0, 0);
}
memcpy(sndbuf, msg->data, msg->len);
/* X25GW의 서비스를 tpforward로 호출한다. */
tpforward("X25GW", (char *)sndbuf, len, TPNOREPLY);
}
<rcvsvr.c>
#include <stdio.h>
#include <string.h>
#include <usrinc/atmi.h>
/* X25GW에서 동적으로 이 서비스에 tprelay를 한다. */
RECVSVC(TPSVCINFO *msg)
{
char *rcvbuf;
long len;
printf("[%s] Service Started!\n", msg->name);
len = msg->len;
rcvbuf = msg->data;
if(tpurcode != 0) {
제3장 예제 47
printf( "tpurcode is [%d] tperrmsg is [%s]\n", tpurcode,
tpstrerror(tpurcode) );
tpreturn( TPFAIL, -1,(char *)rcvbuf, len, 0 );
}
tpreturn( TPSUCCESS, 0,(char *)rcvbuf, len, TPNOFLAGS );
}
<cli_x25gw.c>
/* 이 예제 프로그램은 Tmax 클라이언트로서 SENDSVC를 호출하도록 되어있다.
SENDSVC를 호출하기 전에 X25GW에서 tprelay할 서비스를 전문헤더에 설정을 한다. */
#include <stdio.h>
#include <usrinc/atmi.h>
#include "../server/custom.h"
int main(int argc, char **argv)
{
int ret;
msg_body_t *body;
char *buf;
long rlen;
ret = tmaxreadenv("tmax.env", "TMAX");
if (ret < 0) {
printf("tmaxreadenv fail...[%s]\n", tpstrerror(tperrno));
}
ret = tpstart((TPSTART_T *)NULL);
if (ret < 0) {
printf("tpstart fail...[%s]\n", tpstrerror(tperrno));
return 0;
}
buf = tpalloc("STRING", 0, 0);
if (buf == NULL){
printf("buf tpalloc fail..[%s]\n", tpstrerror(tperrno));
tpend();
return 0;
}
body = (msg_body_t *)buf;
memcpy(body->data, argv[1], strlen(argv[1]));
body->data[51] = 0;
memcpy(body->retsvcname, "RECVSVC", 9);
body->retsvcname[8] = 0;
48 Tmax Gateway Guide (X.25)
memcpy(buf, (char *)body, sizeof(msg_body_t));
/* X25GW를 호출할 서비스를 호출한다. */
ret=tpcall("SENDSVC",buf,sizeof(msg_body_t), &buf, &rlen, 0);
if (ret < 0){
printf("tpcall fail...[%s]\n", tpstrerror(tperrno));
tpfree((char *)buf);
tpend();
return 0;
}
body = (msg_body_t *)buf;
printf("return value = %s\n", body->data);
tpfree((char *)buf);
tpend();
}
제3장 예제 49
Appendix A. CUSTOM INFO
A.1. 구조체
다음은 구조체에 대한 설명이다.
● err
유형
char
길이
20
설명
서비스명을 지정하는 항목이다. 리모트 노드에서 서비스를 요청할 때 이 항목에 서비
스명을 주면 X25GW는 이를 이용하여 서비스를 호출한다.
● err
유형
int
길이
4
설명
서비스를 요청하고 응답 데이터를 수신 받았을 경우 에러 유무를 나타내는 항목이다.
● len
유형
int
길이
4
설명
송수신 데이터의 길이를 나타내는 항목이다.
● uid
유형
int
길이
4
설명
동기 통신할 때 X25GW가 만든 UID를 담고있는 항목이다.
● flags
유형
int
길이
4
설명
리모트 노드에서 Tmax로 서비스를 요청할 때 사용하는 항목이다.
Appendix A. CUSTOM INFO 51
● msgtype
유형
int
길이
4
설명
미사용
● channel_id
유형
int
길이
4
설명
송수신 채널 번호이다.
● sys_id
유형
char
길이
20
설명
채널 그룹명이다.
A.2. CUSTOM INFO Flags
항목
설명
NOFLAGS
리모트 노드에서 요청한 서비스에 대해서 응답을 받는 경우
TPNOREPLY
리모트 노드에서 요청한 서비스에 대해서 응답을 받지 않고 서비스 요청만 하는 경우,
Tmax의 tpacall에 TPNOREPLY와 같음
52 Tmax Gateway Guide (X.25)
Appendix B. X25GW 에러 코드
X25GW 에러 코드는 다음과 같다.
에러 코드
설명
TPEINVAL
게이트웨이 헤더를 사용할 경우 X25GW를 호출한 데이터의 길이가 게이트웨이 헤더
보다 작을 경우 발생한다.
TPEPROTO
tpforward로 X25GW 호출할 때 X25GW가 동기형 모드가 아닌 비동기형 모드일 경우
발생, tpforward & tprelay 방식은 반드시 동기형 방식이어야 한다.
TPENOREADY 리모트 노드와의 연결이 끊어져 사용할 수 있는 채널이 없는 경우이다.
TPEOS
X25GW 내부에서 메모리를 확보하는데 확보되지 않을 경우이다.
TPESYSTEM
사용자 함수 put_msg_info에서 음수를 반환한 경우 리모트 노드로 데이터 전송시 오
류가 발생한 경우이다.
TPETIME
리모트 노드로 서비스를 요청하고 지정된 시간내에 응답이 없을 경우이다.
TPECLOSE
리모트 노드로 서비스를 요청한 이후에 리모트 노드와 연결이 끊어진 경우이다.
Appendix B. X25GW 에러 코드 53
© Copyright 2026