98
Tmax Gateway Guide (TCP/IP) Tmax v5.0 SP1 Copyright © 2009 TmaxSoft Co., Ltd. All Rights Reserved.

Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

  • Upload
    others

  • View
    12

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

Tmax

Gateway Guide (TCP/IP)

Tmax v5.0 SP1

Copyright © 2009 TmaxSoft Co., Ltd. All Rights Reserved.

Page 2: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

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 (TCP/IP)

발행일: 2009-08-10

소프트웨어 버전: Tmax v5.0 SP1

안내서 버전: v2.1.1

Page 3: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

내용 목차

안내서에 대하여 .......................................................................................................................... vii

제1장 소개 ................................................................................................................................. 1

1.1. 게이트웨이 기타 기능 ................................................................................................... 2

1.1.1. 게이트웨이 헤더 ................................................................................................ 2

1.1.2. 다중 응답 처리 .................................................................................................. 3

1.1.3. 서비스명을 찾는 순서 ........................................................................................ 3

1.1.4. 사용자 임의의 채널 지정 .................................................................................... 3

1.1.5. 코드 변환 .......................................................................................................... 4

제2장 서비스의 유형 ................................................................................................................... 7

2.1. 동기형 TCPGW ............................................................................................................ 7

2.1.1. 서비스 블록형 방식 ............................................................................................ 7

2.1.2. 서비스 NON 블록형 방식 ................................................................................... 9

2.1.3. 리모트 동기형 호출 방식 .................................................................................. 10

2.2. 비동기형 TCPGW ....................................................................................................... 11

2.2.1. Tmax에서 서비스 요청 방식 ............................................................................. 11

2.2.2. 리모트에서 서비스 요청 방식 ............................................................................ 11

2.3. 서버 TCPGW ............................................................................................................. 12

2.4. 클라이언트 TCPGW ................................................................................................... 13

제3장 환경 설정 ........................................................................................................................ 15

3.1. Tmax 환경 구성 .......................................................................................................... 15

3.1.1. TCPGW의 사용 옵션 ........................................................................................ 17

3.1.2. 서버/클라이언트 TCPGW의 환경파일 ............................................................... 21

3.1.3. 서비스 블록형 TCPGW의 환경파일 ................................................................... 22

3.1.4. 서비스 NON-블록형 TCPGW의 환경파일 .......................................................... 23

3.1.5. 리모트 동기형과 비동기형 TCPGW 환경파일 .................................................... 24

3.1.6. 재 연결 TCPGW 환경파일 ................................................................................ 25

3.1.7. 여러 리모트 노드와 연결을 맺는 클라이언트 TCPGW ........................................ 26

3.2. 사용자 헤더 환경 설정 및 사용 방법 ............................................................................. 26

3.2.1. 사용자 헤더 환경파일 ....................................................................................... 27

3.2.2. 사용자 헤더 사용 방법 ...................................................................................... 27

3.3. –E 옵션 사용시 채널백업 설정 ..................................................................................... 28

3.4. Ping 메시지 체크시 데이터 전송 .................................................................................. 28

제4장 사용자 프로그램 .............................................................................................................. 31

4.1. custom.h 수정 ............................................................................................................ 31

4.2. custom.c 수정 ............................................................................................................ 32

4.3. register.c 수정 ............................................................................................................ 47

제5장 예제 ................................................................................................................................ 51

5.1. OUTBOUND TCPGW 예제 ......................................................................................... 51

5.1.1. 프로그램 구성 .................................................................................................. 51

Tmax iii

Page 4: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

5.2. 동기 INBOUND TCPGW 예제 ..................................................................................... 59

5.2.1. 프로그램 구성 .................................................................................................. 60

5.3. NON 블록킹 TCPGW 예제 .......................................................................................... 71

5.3.1. 프로그램 구성 .................................................................................................. 71

Appendix A. CUSTOM INFO .................................................................................................... 81

A.1. 구조체 ....................................................................................................................... 81

A.2. CUSTOM INFO Flags ................................................................................................. 82

Appendix B. TCPGW 에러 코드 ................................................................................................ 83

iv Tmax Gateway Guide (TCP/IP)

Page 5: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

그림 목차

[그림 1.1] TCPGW 동작 구조 ....................................................................................................... 1

[그림 1.2] 동기 / 비동기 TCPGW 동작구조 .................................................................................... 2

[그림 2.1] 블록형 동기 TCPGW .................................................................................................... 8

[그림 2.2] NON 블록형 동기 TCPGW ........................................................................................... 9

[그림 2.3] 리모트 요청 동기형 TCPGW ....................................................................................... 10

[그림 2.4] 비동기형 TCPGW ...................................................................................................... 11

[그림 2.5] 비동기형 TCPGW ...................................................................................................... 12

[그림 2.6] 서버 TCPGW ............................................................................................................. 12

[그림 2.7] 클라이언트 TCPGW ................................................................................................... 13

[그림 5.1] OUTBOUND TCP/IP 게이트웨이 ................................................................................ 51

[그림 5.2] 동기 INBOUND TCP/IP 게이트웨이 ............................................................................ 59

[그림 5.3] NON BLOCKING TCPGW 예제 .................................................................................. 71

Tmax v

Page 6: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다
Page 7: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

안내서에 대하여

안내서의 대상

본 안내서는 Tmax®(이하 Tmax) TCP/IP 게이트웨이를 사용하여 개발하는 개발자를 대상으로 한다. 본 안

내서는 Tmax 서버와 Non Tmax 서버의 인터페이스를 담당하는 Tmax에서 제공되는 TCP/IP 게이트웨이

에 대해 기술한 안내서이다.

안내서의 전제 조건

본 안내서는 Tmax 시스템에 대한 전반적인 이해와 Tmax 시스템이 제공하는 각종 기능 및 특성에 대한 습

득을 위한 기본서이다.

본 안내서를 원활하게 이해하기 위해서는 다음과 같은 사항을 미리 알고 있어야 한다.

● 미들웨어(Middleware) 및 UNIX 시스템에 대한 이해

● Tmax의 기본 개념 이해

● Java , C 프로그래밍의 이해

안내서의 제한 조건

본 안내서를 읽기 전에 Tmax의 기본 개념을 숙지하고 있어야 한다. 실무에서의 구체적인 사용방법이나

관리 및 운용에 관한 사항은 각 제품의 안내서를 참고한다.

참고

Tmax 시스템 개발에 대한 기본적인 내용은 "Tmax Administration Guide"나 "Tmax Application Devel

oment Guide"를 참고한다. Tmax에서 제공하는 명령어와 C API에 대한 설명은 “Tmax Reference

Guide”를 참고한다.

안내서에 대하여 vii

Page 8: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

안내서 구성

Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다.

각 장의 주요 내용은 다음과 같다.

● 제1장: 소개

TCP/IP 게이트웨이 시스템의 개요에 대해 기술한다.

● 제2장: 서비스의 유형

TCP/IP 게이트웨이 시스템에서 제공하는 서비스 유형에 대해 기술한다.

● 제3장: 환경 설정

TCP/IP 게이트웨이 환경 설정방법에 대해 기술한다.

● 제4장: 사용자 프로그램

TCP/IP 게이트웨이를 사용하기 위해 custom.h, custom.c, regidster.c를 수정하는 방법에 대해 기술한

다.

● 제5장: 예제

TCP/IP 게이트웨이 서비스 유형에 대한 예제를 기술한다.

● Appendix A.: CUSTOM INFO

CUSTOM INFO 구조체, INFO Flags에 대해 기술한다.

● Appendix B.: TCPGW 에러 코드

에러코드에 대해 기술한다.

viii Tmax Gateway Guide (TCP/IP)

Page 9: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

안내서 규약

의미표기

프로그램 소스 코드의 파일명<AaBbCc123>

Ctrl과 C를 동시에 누름<Ctrl>+C

GUI의 버튼 또는 메뉴 이름[Button]

강조진하게

다른 관련 안내서 또는 안내서 내의 다른 장 및 절 언급" "(따옴표)

화면 UI에서 입력 항목에 대한 설명'입력항목'

메일계정, 웹 사이트하이퍼링크

메뉴의 진행 순서>

하위 디렉터리 또는 파일 있음+----

하위 디렉터리 또는 파일 없음|----

참고 또는 주의사항참고

그림 이름[그림 1.1]

표 이름[표 1.1]

명령어, 명령어 수행 후 화면에 출력된 결과물, 예제코드AaBbCc123

옵션 인수 값[ ]

선택 인수 값|

안내서에 대하여 ix

Page 10: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

시스템 사용 환경

요구 사항

IBM AIX 5.xPlatform

HP-UX 11.xx

Solaris 7~9 (SunOS 5.7~5.9)

최소 120MB 하드디스크 공간Hardware

256MB 이상 메모리 공간

1GB 이상 하드디스크와 512MB 이상 메모리 공간 권장

Oracle 9i 또는 10gDatabase

x Tmax Gateway Guide (TCP/IP)

Page 11: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

관련 안내서

설명안내서

Tmax를 이용하기 위한 환경설정을 하는 방법과 시스템 운영방식을

기술한 안내서이다.

Tmax

Administration Guide

안내서에 대하여 xi

Page 12: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

연락처

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 (TCP/IP)

Page 13: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

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

Page 14: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다
Page 15: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

제1장 소개

TCP/IP Gateway(이하 TCPGW)는 Tmax 서버와 Non Tamx 서버(이하 리모트 노드)사이의 인터페이스를

담당하는 Tmax에서 제공되는 게이트웨이이다. TCPGW는 Tmax 서버의 한 종류로써 TCP/IP로 연결되어

있는 UNIX/Windows 서버 등과의 게이트웨이 역할을 한다.

TCPGW는 Tmax 서버의 한 종류로서 Tmax 환경파일에 서버로 등록해야만 사용할 수 있다. 하지만 일반

다른 서버들을 만드는 방식과는 다르게 생성해 주어야 한다. 일반 서버는 TCS나 UCS용 서버 라이브러리

를 이용하여 서버를 생성하나, TCPGW는 외부와 통신을 담당하는 라이브러리(libtcpgw.a, libtcpgw.so)와

사용자가 작성한 프로그램(custom.c)과 링크하여 서버를 생성한다.

Non Tmax에서 보내온 메시지를 TCPGW는 해당 서비스를 tpacall()하며, 서비스 결과는 처음 요청한 Non

Tmax 서버로 전송한다. 반대로 Tmax 서비스에서 TCPGW를 tpcall()이나 기타 다른 방식으로 서비스를

요청하면 TCPGW는 Non Tmax로 요청 메시지를 보낸 후 응답이 오면 자신을 call한 서비스로 tpreturn()

한다.

복잡하게 타 시스템과 TCP/IP로 연결하기 위해 필요한 작업들, 예를들어 소켓을 열고 메시지를 주고 받는

일 등은 모두 TCP/IP 게이트웨이에서 처리해 주고, 개발자는 업무 로직만을 작성하면 되므로 개발자들은

손쉽게 타 시스템과 연결할 수 있다.

TCPGW의 동작 구조는 다음과 같다.

[그림 1.1] TCPGW 동작 구조

TCPGW는 위의 그림에서 보듯이 리모트 노드로부터 서비스 요청을 받아서 처리할 수 있고(그림 1-1 에서

실선 표시), Tmax 클라이언트는 서비스로부터 서비스 요청을 받아서 리모트 노드로 서비스 요청을 할 수

도 있다.(그림 1.1에서 점선 표시) 이와같이 리모트 노드로 부터 서비스 요청을 받아서 처리하는 것을

OUTBOUND 서비스라 하고, Tmax 클라이언트로부터 서비스 요청을 받아서 리모트 노드로 서비스 요청

을 하는 것을 INBOUND 서비스라 한다.

제1장 소개 1

Page 16: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

[그림 1.2] 동기 / 비동기 TCPGW 동작구조

Tmax 클라이언트나 서비스에서 TCPGW를 바로 호출하고 응답이 올때까지 기다리는 동기적인 호출 방

식(그림 1.2 에서 점선 표시)이 있다. 이와는 달리 비동기적인 호출 방식은 Tmax 클라이언트가 Tmax 서비

스를 호출하면 그 서비스에서 TCPGW로 제어권이 넘어가서 해당 서비스는 다른 서비스 요청을 받을 수

있게 되고, TCPGW가 리모트 노드로부터 응답을 받게 되면 응답을 처리하는 서비스로 요청을 넘겨주는

방식으로 동작하게 된다.(그림 1-2 에서 실선 표시)

여러가지 동작 방식에 대해서는 “제2장 서비스의 유형”에서 좀 더 상세히 설명하도록 한다.

여러가지 유형에 맞추어 TCPGW를 작성하기 위해서는 Tmax 환경을 적절히 설정하고 프로그램(custom.c,

custom.h)을 작성해야 하므로 더 자세한 사항은 본 안내서의 “제3장 환경 설정” 과 “제4장 사용자 프로그

램” 에서 설명한다.

1.1. 게이트웨이 기타 기능본 절에서는 게이트웨이가 가지고 있는 기타 기능에 대해 설명한다.

1.1.1. 게이트웨이 헤더

TCPGW는 Tmax 클라이언트나 서버에서 호출시 게이트웨이 헤더를 사용 할 수 있다. 이를 사용하기 위해

서는 TCPGW의 다른 라이브러리를 사용해야 한다. 보통은 libtcpgw.a, libtcpgw.so를 사용하나 게이트웨

이 헤더를 사용하고자 하는 경우에는 libtcpgw.gwh.a나 libtcpgw.gwh.so를 사용해야 한다. 게이트웨이 헤

더는 모든 데이터 버퍼의 가장 처음 Offset에 위치해야 한다. 즉, 사용자 헤더를 사용할 경우에 게이트웨이

헤더 다음에 사용자 헤더가 와야한다.

게이트웨이 헤더는 여러가지 다양한 목적으로 사용하는데, TCPGW에서는 여러 항목 중에서 svc 항목만

사용 가능하다. 이 항목은 NON 블록킹 모드로 사용하는 경우나 비동기 방식으로 사용할 때 응답 데이터

에 대해 처리할 서비스명을 지정하고자 하는 경우에 사용한다. 게이트웨이 헤더는 보통 사용자 헤더를 사

용하지 않을 경우에 응답을 처리할 서비스를 메시지별로 처리하고자 하는 경우에 사용한다.

2 Tmax Gateway Guide (TCP/IP)

Page 17: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

TCPGW는 응답을 처리할 서비스를 찾는 순서는 가장 먼저 게이트웨이 헤더, 두 번째는 사용자 헤더, 세

번째는 “-S” 옵션으로 지정한 순서대로 찾는다.

1.1.2. 다중 응답 처리

일반적인 TCPGW 처리 방식은 한번의 요청에 대해서 하나의 응답을 받는 형태이다. 때에 따라서 여러 번

의 응답이 올 수 있는데 이를 처리하기 위해서 TCPGW는 custom.c의 get_msg_info 함수의 호출을 통해

서 이를 처리한다. 여러 번의 응답이 오는 경우에 매번 get_msg_info 함수가 호출되는데, 사용자는 수신

받은 데이터가 마지막 데이터인지를 판단하여 적절한 값을 반환 해주면 된다.

연속 데이터인 경우에 반환값으로 3을 반환 해주면 TCPGW는 다음 데이터가 있다고 판단하여 서비스를

요청한 클라이언트나 서비스에 응답을 주지않고 다음 데이터를 기다린다. 사용자는 마지막 데이터를 수

신한 경우에 REPLY 값(1)를 반환해 주면 TCPGW는 이전에 저장한 데이터와 마지막 데이터를 서비스를

요청한 클라이언트나 서비스에 돌려준다.

1.1.3. 서비스명을 찾는 순서

NON 블록형 TCPGW나 또는 비동기형 TCPGW인 경우 리모트 노드에서 온 요청이나 응답을 처리할 Tmax

의 서비스가 있어야 한다. TCPGW는 이 서비스명을 알수가 없으므로 사용자가 적당한 서비스명을 지정

해야 하는데 TCPGW는 3가지 방식으로 서비스명을 찾는다.

다음에서 설명하는 서비스명은 반드시 Tmax config 파일에 등록되어 있어야 한다.

1. 게이트웨이 헤더를 사용할 경우에만 가능하다. Tmax 클라이언트나 서비스에서 TCPGW를 요청할 때

게이트웨이 헤더에 서비스명을 넣어서 TCPGW를 호출하면 TCPGW는 가장 우선적으로 이 서비스명

을 사용한다.

2. 사용자 헤더에서 서비스명을 찾는다. Tmax 클라이언트나 서비스에서 TCPGW를 요청할 때 사용자 헤

더에 서비스명을 넣은 후에 사용자 함수 get_service_name에서 서비스명을 얻을 수 있다.

3. CLOPT의 “-S” 옵션에 지정한 서비스를 이용한다. 이런 경우에는 모든 메시지에 대해서 동일한 서비스

가 적용된다.

이와 같은 순서로 TCPGW는 서비스명을 찾는다. 단, 리모트 노드에서 최초로 서비스를 요청할 경우에는

위의 방식을 따르지 않고 사용자가 get_msg_info에서 서비스명을 지정해야 한다.

1.1.4. 사용자 임의의 채널 지정

완전한 비동기 방식으로 TCPGW를 구성한 경우에 사용자는 리모트 노드로 전송할 채널을 지정할 수있다.

CLOPT 절에 “-a”를 사용한다. 완전한 비동기 방식은 서로간에 응답이 없다. 응답 데이터도 서비스 요청

형식으로 전달 되어야 한다.

제1장 소개 3

Page 18: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

예를 들어 Tmax의 클라이언트나 서비스에서 TCPGW로 tpacall에 TPNOREPLY로 호출하면 TCPGW는

서비스 요청에 대한 UID와 어떤 정보 데이터도 보관하지 않고 리모트 노드로 데이터를 전송하고 해당 서

비스를 종료한다. 나중에 리모트 노드로부터 응답에 대한 메시지를 수신받았을 경우에도 이를 서비스 요

청으로 처리한다. 반대인 경우에(리모트 노드에서 먼저 요청)도 동일하게 처리한다.

위와 같은 경우에 사용자는 리모트 노드로 전송할 채널번호를 지정할 수 있다. CLOPT 절에 “-u” 옵션을

사용한다.

채널 지정은 다음과 같은 2가지 경우가 있다.

● Tmax에서 먼저 서비스를 리모트 노드로 요청한 경우 TCPGW는 get_channel_num 함수를 호출하는데

사용자는 전송 데이터를 분석하여 채널을 지정할 수 있다.

● 리모트 노드에서 먼저 요청한 경우인데, 리모트 노드에서 서비스 요청시 get_msg_info 함수에서 리모

트 노드에서 요청한 채널을 데이터에 보관하여 Tmax 서비스를 호출한다. Tmax 서비스는 결과를 리모

트 노드로 전송하기 위해 tpacall에 TPNOREPLY로 다시 TCPGW로 서비스를 보낸다. 사용자는

get_channel_num에서 이전에 보관한 채널을 사용하여 리모트 노드로 응답을 전송할 수 있다. 이 방식

을 사용함으로써 TCPGW와 Tmax 엔진간의 채널이 블록되지 않고 서비스를 요청한 채널로 응답을 전

송할 수 있다.

1.1.5. 코드 변환

TCPGW가 실행되는 Machine는 모두 ASCII 코드(한글은 완성형)를 사용한다. 리모트 노드는 사용하는 코

드가 다른 Machine에 있어 이들과 메시지를 주고 받기 위해서는 코드를 일치시켜야 한다. 이러한 코드 변

환은 리모트에서 할 수도 있고, 아니면 TCPGW에서 할 수도 있다. TCPGW는 모든 코드를 변환하지 않고

ASCII <-> EBCDIC, 조합형 <-> 완성형 코드만을 서로 변환한다. TCPGW에서 리모트 노드로 메시지를

전송하는 경우에는 ASCII에서 EBCDIC, 완성형에서 조합형으로 코드를 변환하고, 리모트에서 수신하는

경우에는 EBCDIC에서 ASCII, 조합형에서 완성형으로 코드를 변환한다.

TCPGW는 코드 변환을 서비스 처리 단위별로 변환한다. 다시 말해, TCPGW는 서비스 단위별로 송수신

포맷을 등록(Map 파일)하여 변환한다. 사용자는 TCPGW와 리모트 노드간에 코드를 변환하려면 모든 서

비스에 대해서 Map 파일을 등록해야 한다.

또한 TCPGW에서 코드변환 기능을 이용하려면 반드시 게이트웨이 헤더를 사용해야만 한다. 리모트로 전

송하는 서비스에 대해서 TCPGW는 서비스명을 알 수가 없으므로 게이트웨이 헤더를 사용하여 TCPGW

에 리모트 서비스명을 전달해야 하기 때문이다. 게이트웨이 헤더 중 pgmname 항목에 리모트 서비스명을

주고, TCPGW는 이 항목의 값으로 Map 파일을 로드하여 코드를 변환한다.

TCPGW는 Tmax 클라이언트나 서비스에서 리모트로 서비스 요청시에는 게이트웨이 헤더의 pgmname

항목의 값으로 Map 파일을 로드하고, 리모트 노드에서 Tmax로 서비스를 요청하는 경우에는

get_msg_info 함수에서 지정한 서비스명으로 Map 파일을 로드한다.

사용자가 Map 파일을 등록하는 방법에 대해서 설명한다. Map 파일은 사용자가 텍스트 파일로 지정한 형

식에 맞게 등록해주면 된다.

4 Tmax Gateway Guide (TCP/IP)

Page 19: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

# COMMSIZE는 INPUT/OUTPUT에서 같이 사용해야 함으로 INPUT/OUTPUT중

# 큰 size의 값을 입력해야 합니다.

*COMMSIZE

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에서 리모트 노드

로 서비스를 요청하는 경우에 이 항목에 리모트 노드로 요청하는 메시지의 포맷을 등록하고, 반대로 리

모트 노드에서 Tmax로 서비스를 요청하는 경우에는 Tmax 서비스의 처리 결과에 대한 포맷을 등록한

다.

● OUTPUT

리모트 노드에서 TCPGW로 수신받은 메시지에 대해서 등록하는 항목이다. TCPGW에서 리모트 노드

로 서비스를 요청하는 경우에는 리모트 노드에서 처리한 결과를 수신받는 메시지의 포맷을 등록하고,

반대로 리모트 노드에서 Tmax로 서비스를 요청하는 경우에는 Tmax로 서비스를 요청하는 메시지에 대

해서 포맷을 등록한다.

● 항목명

제1장 소개 5

Page 20: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

단순히 사용자가 참조용으로만 사용하는 이름이다. TCPGW는 항목명으로 인식하고 내부에서는 사용

하지 않는다.

● 항목 길이

송수신 데이터의 각 항목의 실제 길이를 나타낸다. 각 항목의 길이만 표현하면 TCPGW 내부에서 Offset

로 변환하여 사용한다. Offset는 항상 0부터 시작한다.

● 데이터 타입

송수신 각 항목의 데이터 타입을 지정한다.

– CHAR : 데이터가 모든 문자(영문자, 숫자, 한글)을 포함할 수 있는 항목을 나타낸다.

– NUMERIC : 데이터가 숫자만을 나타내는 경우이다. 코드 변환은 CHAR 타입과 동일하게 코드를 변

환한다. 타입 NUMERIC라 해서 Integer를 나타내는 것은 아니다.

– KOREAN: 데이터는 모두 한글을 경우에 사용한다. TCPGW는 이 타입의 데이터는 항상 2 Bytes 단위

로 코드를 변환한다. CHAR에서 한글이 포함된 경우에 한글과 다른 코드(영문자, 숫, 특수문자) 사이

에 한글의 시작과 끝 문자가 포함되는데 반해 이 타입의 데이터는 모두 한글 문자로 인식하기 때문에

처음과 끝에만 한글 시작과 끝 문자가 포함된다.

– BINARY: 데이터는 코드를 변환하지 않는다. 사용자는 데이터중 코드를 변환하지 않고자 하는 경우

에는 이 타입으로 지정하면 된다.

– USER-TYPE: 데이터는 Array 형식의 데이터 타입을 지정하고자 할 경우에 사용한다. 예를 들어 화면

에 여러 개의 항목이 반복하서 여러번 나올 경우에 각 항목을 반복 횟수 만큼 등록해야 하는 번거로움

이 있다. 또는 반복 횟수를 데이터로 표현하는 경우에는 몇번의 반복이 되는지를 알 수 없어 코드변환

이 어렵다. 이를 위해서 사용자는 사용자 정의 타입을 지정하여 Array 형태의 데이를 쉽게 변환할 수

있다.

위의 Map 파일에서 USER1는 사용자가 지정한 사용자 정의 타입이다. 타입 이름은 사용자가 임의로 지정

하면 된다. 사용자 정의 타입의 데이터는 Array 데이터의 반복을 나타내는 항목이므로 반드시 숫자로 이

루어져야 한다. TCPGW는 사용자 정의 타입을 만나면 이를 Array의 횟수로 인식한다.

Array의 끝은 마지막 항목의 이름을 ‘/’로 시작하면 된다. 위의 경우에는 e1, e2, e3을 Array 항목으로 인식

해서 e 항목으로 지정한 횟수 만큼 코드를 변환한다.

주의

Array 횟수는 Map 파일에 등록하지 않고 TCPGW와 리모트 노드 사이에 데이터 전문에 표현한다.

6 Tmax Gateway Guide (TCP/IP)

Page 21: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

제2장 서비스의 유형

TCPGW는 Tmax에서 제공하는 라이브러리(libtcpgw.a, libtcpgw.so)와 개발자가 작성하는 custom.c, cus

tom.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.)를 서로 공유해야 한다.

2.1.1. 서비스 블록형 방식

Tmax의 서버나 클라이언트에서 TCPGW로 서비스를 요청하고, 그 결과가 올때까지 기다리는 가장 일반

적인 방식이다. 아래 그림 처럼 Tmax 클라이언트의 요청을 받은 서비스에서 TCPGW 서비스로 tpcall을

하면 리모트 노드에서 처리 결과를 송신할 때까지 Tmax 서비스(SVC1)가 블록되어 있게 된다.

제2장 서비스의 유형 7

Page 22: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

[그림 2.1] 블록형 동기 TCPGW

블록형 동기 TCPGW 동작 방식은 다음과 같다.

1. TCPGW와 리모트 노드는 연결되어 있는 상태이다.

2. Tmax 클라이언트는 Tmax 서비스를 tpcall한다.

3. Tmax 서비스에서는 클라이언트의 요청을 받아들여 TCPGW로 서비스를 tpcall한다.

4. TCPGW는 연결되어 있는 리모트 노드에 서비스를 요청한다.

5. 리모트 노드에서 결과가 오면 에러인지 아닌지를 판단하여 TCPGW 서비스를 호출한 Tmax 서비스로

tpreturn한다.

6. 결과를 받은 Tmax 서비스는 Tmax 클라이언트로 tpreturn한다.

이와 같은 방식으로 TCPGW를 동작시키게 되면 Tmax 클라이언트에서 호출한 Tmax 서비스는 TCPGW

를 호출한 후에 결과를 받을때까지 블록이 되어 있게 된다. (tpacall()을 한 경우도 tpgetrply()로 응답을 받

는 곳에서 블록이 되기 때문에 tpcall()과 마찬가지로 블록이 되게 된다.) 많은 수의 요청을 받아들이기 위

해서는 블록이 되는 시간까지 감안하여 많은 수의 서버를 실행해야 한다. 이는 대외기관 통신에서는 대외

기관의 장애(머신, 네트워크)에 따라서 많은 수의 서버가 필요로 하기 때문이다.

8 Tmax Gateway Guide (TCP/IP)

Page 23: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

2.1.2. 서비스 NON 블록형 방식

서비스 NON 블록형 방식은 Tmax 클라이언트에서 직접 TCPGW 를 요청하는 방식에서는 사용할 수 없고,

TCPGW에 서비스를 요청하고 결과를 수신하는 서버를 중간에 두어서 처리하는 방식이다. 즉, TCPGW

앞에 송신 서비스와 수신 서비스를 두고 Tmax 클라이언트는 송신 서비스를 호출하고, 송신 서비스는

TCPGW 로 서비스를 전달하고 서비스를 종료한다. TCPGW 는 리모트 노드로 서비스를 요청하여 그 결

과를 수신하면, 해당 결과를 수신 서비스에게 전달한다. 수신 서비스는 TCPGW로부터 결과를 수신받아

클라이언트에게 전달하면 서비스 사이클이 종료되는 방식이다. 결과적으로 클라이언트는 서비스를 요청

하고 결과를 받는 동기방식이나 서버는 요청을 전달하고 종료하는 비동기방식과 같이 동작한다.

[그림 2.2] NON 블록형 동기 TCPGW

NON 블록형 동기 TCPGW 동작 방식은 다음과 같다.

1. Tmax 클라이언트는 Tmax 서비스를 tpcall 한다.

2. Tmax 서비스에서는 클라이언트의 요청을 받아들여 TCPGW 서비스를 tpforward한다.

3. TCPGW 는 연결되어 있는 리모트 노드에 메시지를 전송한다.

4. 리모트 노드에서 결과가 오면 에러인지 아닌지를 판단하여 tprelay할 서비스로 tprelay한다.

5. TCPGW 서비스로 부터 결과를 받은 서비스(Tmax 클라이언트로 부터 tprelay 할 서비스로 지정된 서비

스)는 Tmax 클라이언트로 tpreturn한다.

이와 같이 동작하는 TCPGW 는 블록형 방식에서 수행하는 방식보다도 적은 서버로도 많은 처리를 할 수

있다. 블록형 방식은 서비스가 TCPGW 를 호출하고 블록되기 때문에 동시에 많은 처리를 위해서는 보다

많은 서버 프로세스를 실행해야 하지만, NON 블록형 방식에서는 자신의 일만 처리하고 서비스를 종료하

기 때문에 적은 서버 프로세스로도 많은 일을 할 수 있다. 대외기간 간에 통신을 처리하는 경우에는 NON

블록형 방식이 보다 효율적이라고 할 수 있다.

제2장 서비스의 유형 9

Page 24: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

2.1.3. 리모트 동기형 호출 방식

리모트 노드에서 TCPGW로 먼저 서비스를 요청하는 방식이다. TCPGW는 리모트노드에서 요청한 서비

스를 호출하고 그 결과를 받아서 해당 서비스를 요청한 채널로 결과를 전송한다. 리모트 노드는 동시에

TCPGW로 Tmax Config에 정의되어 있는 MAXSACALL 개수를 초과하여 호출할 수 없다.

[그림 2.3] 리모트 요청 동기형 TCPGW

리모트 요청 동기형 TCPGW의 동작 방식은 다음과 같다.

1. TCPGW와 리모트 노드는 연결되어 있는 상태이다. 리모트 노드는 TCPGW와 연결된 채널로 메시지를

전송한다.

2. TCPGW는 tpacall() 로 Tmax 서비스를 호출한다. 서비스 처리 결과를 TCPGW는 받아서 메시지를 요

청한 채널을 찾는다.

3. 해당 채널이 정상적으로 연결되어 있으면 결과를 전송한다.

이와 같은 동작 방식은 리모트 노드에서 Tmax의 서비스를 호출하는 가장 보편적인 방식이다. TCPGW 는

리모트 노드의 채널 정보를 보관하였다가 서비스로 부터 결과를 수신받으면, 보관하고 있는 채널중에서

해당 채널을 찾아서 결과를 전송한다. 이때 해당 채널로 결과를 되돌려 주기전에 다른 요청은 얼마든지 가

능하다. TCPGW는 리모트 노드에서 요청한 채널은 블록시키지 않고 다음 요청을 받을 수 있도록 처리하

기 때문에 TCPGW를 어떻게 운영하는 방식에 따라서 다르게 처리할 수 있다.

10 Tmax Gateway Guide (TCP/IP)

Page 25: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

2.2. 비동기형 TCPGW비동기형 호출 방식은 Tmax의 클라이언트나 서버, 또는 리모트 노드에서 TCPGW 서비스를 요청만 하고,

그 결과는 받지 않거나 또는 서비스를 요청한 곳이 아닌 다른 프로그램에서 처리하는 방식을 말한다. 먼저

Tmax의 서비스에서 TCPGW로 서비스를 요청하고 그 결과는 다른 서비스로 받을 수 있다. 클라이언트인

경우에는 비동기형으로 처리할때는 tpacall 로써 응답을 받지 않는 경우에만 가능하다. 반대로, 리모트 노

드에서 서비스를 먼저 요청하는 경우에 위에서와 같이 서비스만 요청하고 결과를 받지 않을수도 있고, 서

비스를 요청하고 결과는 다른 채널로 돌려주는 방식이 비동기형 방식이다.

2.2.1. Tmax에서 서비스 요청 방식

Tmax의 서비스에서 TCPGW로 tpacall에 TPNOREPLY로 요청하고 해당 서비스는 종료한다. TCPGW는

리모트 노드로 요청를 보내고 해당 결과가 수신되면 Tmax의 다른 서비스를 tpacall에 TPNOREPLY로 호

출하여 결과를 처리하게 하는 방식이다.

[그림 2.4] 비동기형 TCPGW

Tmax에서 비동기형 TCPGW의 동작 방식은 다음과 같다.

1. Tmax 서비스에서 TCPGW로 서비스를 요청한다.(tpacall 에 TPNOREPLY)

2. TCPGW는 리모트 노드로 데이터를 전송한다.

3. TCPGW는 리모트 노드로 부터 데이터를 수신한다.

4. TCPGW는 Tmax의 다른 서비스를 호출한다. (tpacall 에 TPNOREPLY)

2.2.2. 리모트에서 서비스 요청 방식

리모트 노드에서 먼저 서비스를 TCPGW 로 요청하면, TCPGW는 tpacall로 Tmax 서비스를 요청한다.

Tmax의 서비스 처리가 완료되면 TCPGW 는 리모트 노드와 연결된 채널 중에서 사용가능한 채널 중 아무

채널에 처리 결과를 전송한다.

제2장 서비스의 유형 11

Page 26: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

[그림 2.5] 비동기형 TCPGW

리모트에서 비동기형 TCPGW의 동작 방식은 다음과 같다.

1. 리모트 노드에서 TCPGW로 서비스를 요청한다.

2. TCPGW는 Tmax의 서비스를 tpacall 로 요청한다.

3. Tmax의 서비스를 처리 결과를 TCPGW 에 전달한다.

4. TCPGW는 리모트 노드와 연결된 채널중에서 채널 테이블에서 채널을 검색하여 결과를 전송한다.

2.3. 서버 TCPGW서버 TCPGW와 클라이언트 TCPGW는 연결을 맺을 때만 차이가 있고 연결이 맺어진 이후에는 기능상 차

이가 없다.

서버 TCPGW는 TCPGW에서 Listen하고 있으면 리모트 노드에서 연결하게 된다. 서버 TCPGW는 클라이

언트 TCPGW와 마찬가지로 리모트 노드와 Tmax 클라이언트 어디서든지 서비스 요청을 할 수 있다.

[그림 2.6] 서버 TCPGW

서버 TCPGW의 동작 방식은 다음과 같다.

1. TCPGW는 Tmax boot할 때 리모트 노드에서 연결할 수 있도록 연결을 기다리고 있는다.

12 Tmax Gateway Guide (TCP/IP)

Page 27: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

2. 리모트 노드에서는 TCPGW로 연결을 한다.

2.4. 클라이언트 TCPGW클라이언트 TCPGW는 리모트 노드에서 기다리고 있는 포트로 연결을 맺으면서 기동된다. 서버 TCPGW

는 클라이언트 TCPGW 와 마찬가지로 리모트 노드와 Tmax 클라이언트 어디서든지 서비스 요청을 할 수

있다.

[그림 2.7] 클라이언트 TCPGW

클라이언트 TCPGW의 동작 방식은 다음과 같다.

1. 리모트 노드에서는 TCPGW가 연결할 수 있도록 연결을 기다리고 있는다.

2. TCPGW는 Tmax boot할 때 리모트 노드와 연결을 한다.

제2장 서비스의 유형 13

Page 28: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다
Page 29: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

제3장 환경 설정

TCPGW 서버가 구성되려면 다음과 같은 파일들이 존재하여야 한다.

다음은 UNIX에서 사용되는 파일이다.

파일명디렉터리

libtcpgw.a, libtcpgw.so libtmaxgw.a libtmaxgw.solib

libtcpgw.a, libtcpgw.so libtmaxgw.a libtmaxgw.solib64

다음은 Windows에서 사용되는 파일이다.

파일명디렉터리

tcpgw.dll tmaxgw.dllbin

tcpgw.lib tmaxgw.liblib

위의 파일(TCPGW 라이브러리)들은 Tmax 설치할 때 각 디렉터리 아래에 만들어지지만 custom.c나 custom.h

는 따로 제공되므로 필요할 경우 기술지원 담당자에게 요청해야 한다.

TCPGW 라이브러리와 적절하게 구현한 custom.c, custom.h를 컴파일하여 TCPGW를 생성하게 된다.

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

제3장 환경 설정 15

Page 30: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

*SERVER

tcpgw SVGNAME=svg1,

MIN=1,

MAX=1,

CPC=10,

SVRTYPE=CUSTOM_GATEWAY,

CLOPT="-- -P 5050 -N 10 -k 71673"

*SERVICE

TCPGW1

TCPGW2 SVRNAME=tcpgw, SVCTIME=20

SVRNAME=tcpgw, SVCTIME=25

TCPGW를 사용하기 위해 Tmax 환경파일을 수정할 때는 SERVER, SERVICE 절만 적절히 설정하면 된

다.

● MIN

TCPGW의 프로세스 개수를 지정하는 항목으로써 이 항목의 값이 1보다 클 경우에 TCPGW가 서버 모

드인지, 클라이언트 모드인지에 따라서 사용하는 포트번호가 다르다.

설명항목

MIN 값이 2 이상이면 2개 이상의 프로세스에서 같은 포트를 Listen할 수 없으

므로 TCPGW는 아래에 설명하는 옵션 중 “–P” 옵션으로 입력하는 포트번호에

자신의 서버 번호를 사용한다.

서버모드

예를 들어 포트번호가 5050이면 첫번째 프로세스는 5050 포트번호를, 두번째

프로세스는 5051를 이런식으로 1씩 증가되면서 프로세스 개수 만큼 포트를 사

용한다. 그러므로 프로세스 수가 2개 이상이면 지정한 프로세스 수 만큼 포트

번호가 사용 가능한지 확인해야 한다.

클라이언트로 동작할 경우에는 3가지 방식으로 사용할 수 있다.클라이언트 모드

첫 번째는 리모트 노드에서 하나의 포트번호를 Listen하고, 모든 TCPGW 프로

세스는 리모트 노드에서 Listen하고 있는 포트로 연결하는 방식이다.

두 번째는 “–C” 옵션을 사용하여 서버 모드처럼 포트번호를 TCPGW 프로세스

별로 다르게 사용할 수 있다. “–p” 옵션으로 지정한 포트번호에 서버 번호를 더

해서 리모트 노드에 연결을 시도한다. 이 경우에 리모트 노드는 여러 개의 포트

번호를 Listen하고 있어야 한다. 또한 프로세스 수만큼 지정한 포트가 사용 가

능해야 한다.

세 번째는 “–f” 옵션을 사용하여 여러 개의 리모트 노드에 연결하는 방식으로

연결하고자 하는 리모트 노드의 정보를 별도의 파일에 등록하고"–f" 옵션을 사

용하여 해당 파일명을 지정하면 TCPGW는 해당 파일의 정보를 로드하여 리모

트 클라이언트와 연결한다.

16 Tmax Gateway Guide (TCP/IP)

Page 31: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

● CPC

CPC 항목은 Tmax 엔진과 TCPGW간의 채널 수를 지정하는 항목으로써, Tmax의 클라이언트나 서비스

에서 리모트 노드로 요청하는 경우에는 동시에 요청하는 수만큼 CPC 수를 지정해야 한다. 이 경우에도

NON 블록형인 경우에는 동시 요청 수만큼 지정할 필요가 없이 적당한 수만큼만 지정하면 된다. 반대인

경우에는 TCPGW는 Tmax 엔진 tpacall로 요청하므로 많은 채널을 사용할 필요는 없다.

● CLOPT: “3.1.1. TCPGW의 사용 옵션” 설명을 참고한다.

● SVCTIME: TCPGW는 하나의 서버 프로세스에 여러 개의 서비스를 지정하여 서비스마다 SVCTIME 값

을 다르게 적용할 수 있다. 이를 위해서 *SERVICE 절에 여러 개의 서비스를 지정하고, 서비스마다

SVCTIME 값을 다르게 지정하면 TCPGW는 해당 요청한 서비스별로 지정한 서비스 Time 값을 사용한

다.

3.1.1. TCPGW의 사용 옵션

TCPGW는 Tmax config 파일에 등록할 수 있는 항목이 제안되어 있는 관계로 CLOPT 항목에 많은 옵션을

설정할 수 있다. 아래에 설명하는 옵션에 따라서 TCPGW 동작 방식이 다르므로 아래의 설명을 정확히 이

해해야 한다.

설명옵션

서버 모드로 TCPGW가 동작할 경우에 Listen하고자 하는 IP 주소를 지정하는 옵션이다.

이 항목은 지정한 IP 주소에 대해서만 연결을 받아 들이고자 하는 경우에 사용한다.

R

클라이언트 모드로 TCPGW가 동작하는 경우 “-M” 옵션을 같이 사용하여 동작 모드를 변

경하여 TCPGW가 연결하고자 하는 리모트 노드의 IP를 지정할 수 있다.

예를 들어 옵션을 “-R 1.1.1.1 –P 8080 –r 2.2.2.2 –p 8081 –M 1 –N 10 –n 10” 지정하면

TCPGW는 들어오는 채널에 대해서는 “1.1.1.1” IP 주소에 8080 포트로 10개의 채널을 연

결하고, 나가는채널에 대해서는 “2.2.2.2” IP 주소에 8081 포트로 10개의 채널을 연결한

다. 이와 같이 클라이언트로 동작하는 경우에 리모트 노드의 IP 주소를 따로 지정할 수 있

다.

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): IN CHANNEL이 -N 옵션으로 지정된 수 만큼 생성된다.

- O(OUT CHANNEL) : OUT CHANNEL이 -n 옵션으로 지정된 수 만큼 생성된다.

제3장 환경 설정 17

Page 32: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

설명옵션

- A(ANY CHANNEL) : IN CHANNEL이 -N 옵션, OUTCHANNEL이 -n 옵션으로 지정된

수 만큼 생성된다.

서버 모드인 경우에는 Listen하고자 하는 포트번호이다. 해당 포트번호는 다른 프로세스

에서 사용하지 않은 포트번호여야한다.

P

클라이언트 모드인 경우에는 “-R” 옵션에서 설명한 것처럼 클라이언트 포트번호로도 사

용할 수 있다.

리모트 노드가 Listen하고 있는 포트번호를 설정한다. 해당 포트번호는 다른 프로세스에

서 Listen하지 않은 포트번호이어야 한다.

p

서버 모드로 입력한 IP 주소와 포트번호를 클라이언트 모드로 바꾸는 옵션이다.M

“-R –P”옵션으로 입력한 값은 서버 모드의 IP 주소와 포트번호인데, 이를 리모트 노드에

연결하고자 하는 리모트 노드의 IP 주소와 포트번호로 바뀌도록 하는 옵션이다.

“-M 0” 의미는기본적인 TCPGW의 모드 값이다. 그러나 “-M 1”로 하면 서버 모드에서 클

라이언트 모드로 변경된다. (기본값: 0)

TCPGW와 통신하는 리모트 노드의 코드체계가 다를 경우에 데이터를 변환하는 옵션이

다. 송수신 데이터를 ASCII EBCDIC, 조합형 한글 완성형 한글로 변환한다. 옵션을 사용

할 경우에 사용자는 송수신 데이터의 map 파일을 등록해야 한다.

m

코드변환에 대해서는 아래의 설명을 참고한다.(기본값: 변환하지 않음)

리모트 노드에서 TCPGW로 들어오는 채널 수를 지정하는 옵션이다. 서버 모드나 클라이

언트 모드에 관계없이 사용하는 옵션이다.

N

TCPGW에서 리모트 노드로 나가는 채널 수를 지정하는 옵션이다. TCPGW가 클라이언

트로 동작하는 경우에만 의미가 있다.

n

사용자가 공유 메모리를 확보하여 위에서 설명한 “-N –n”으로 주어진 채널의 상태를 사

용자가 저장할 수 있도록 공유 메모리의 키값을 입력하는 옵션이다.

k

TCPGW는 이 옵션으로 미리 공유 메모리를 확보하지 않고 전적으로 사용자에게 전달하

여 사용자가 임의로 사용하도록 전달하는 역할만 한다. 보통 이 옵션은 TCPGW가 최초

실행시 사용자 Routine(init_remote_info)를 호출할 때 넘겨주어서 사용자가 공유 메모리

를 확보하는데 사용한다.

특수 용도록 사용하는 옵션으로 CLOPT 항목의 옵션으로 위에서 설명한 IP 주소나 포트

번호를 입력하지 않고 Config 파일에 등록하여 사용하는 옵션이다.

F

특수 용도로 사용함으로 일반 사용자는 사용할 수 없다.

TCPGW를 클라이언트로 사용하는 경우에 사용하는 옵션으로" –r –p" 옵션이 하나의 리

모트 노드의 ip와 연결하는 것이라면 "–f "옵션은 여러 리모트 노드와의 연결을 맺기 위한

f

옵션이다. 이 경우에 연결하고자 하는 리모트 정보를 별도의 파일에 등록하고 –f 옵션을

18 Tmax Gateway Guide (TCP/IP)

Page 33: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

설명옵션

사용하여 해당 파일명을 지정하면 TCPGW는 해당 파일의 정보를 로드하여 리모트 노드

와 연결한다.

"–r", "–p"옵션과 함께 사용할 수 없으며 또한 TCPGW를 서버로 사용하는 경우에는 사용

할 수 없다. 단지 클라이언트 모드에서만 사용 가능하다. 그리고 매 요청시마다 리모트

노드에 연결하는 "–E "옵션도 사용할 수 없다. "–f "옵션을 사용하면 리모트 노드와 항상

연결을 맺고 있어야 한다.

TCPGW가 클라이언트 모드로 동작하면서 동시에 같은 TCPGW 프로세스가 2개 이상

(MIN=2) 실행시 리모트 노드와 연결하는 포트번호를 지정하는 옵션이다. 옵션을 지정하

C

면 TCPGW는 “-p” 으로 지정한 포트번호에 서버 번호를 더한 포트번호로 리모트 노드에

연결을 시도한다.

예를 들어 “-p 8080 –C” 옵션을 사용하고 MIN=3으로 했을 경우 첫번째 TCPGW 프로세

스는 8080 포트번호를, 두번째 TCPGW 프로세스는 8081 포트번호를, 세번째는 8082 포

트번호를 사용한다.

리모트 노드와 통신시 TCPGW로 들어오는 채널과 나가는 채널을 분리하여 사용하고자

하는 경우에 사용한다. 또는 요청이 Tmax에서 리모트 노드로 발생할 경우에만 의미가 있

다.

c

TCPGW는 옵션이 지정되면 Tmax에서 들어온 요청을 나가는 채널로 전송한다. 그리고

리모트 노드로부터 나가는 채널로 데이터가 수신되면 이를 이전에 전송한 데이터의 ACK

응답으로 처리하고, 요청에 대한 응답은 들어오는 채널로 수신한다. 즉, TCPGW와 리모

트 노드 사이에 요청한 데이터에 대해서 잘 받았다는 ACK 정보를 주고받고자 하는 경우

에 사용하는 옵션이다. 반대로 요청에 대한 ACK는 보내지 않는다.

NON 블록킹 모드로 TCPGW를 사용하거나 또는 비동기 방식으로 사용하고자 할 때

TCPGW가 요청할 서비스명을 등록하는 옵션이다.

S

NON 블록킹 모드로 사용할 때 Tmax의 송신 서비스는 TCPGW로 tpforward하고, 리모트

노드에서 수신한 응답을 TCPGW는 수신 서비스에게 tprelay하기 위해서 relay될 서비스

명을 등록한다. 또한, 비동기 통신방식에서 Tmax 클라이언트나 서비스는 TCPGW로 서

비스를 요청(tpacall with TPNOREPLY)하고 끝난다. 이 후에 리모트 노드에서 수신받은

응답은 일반적으로는 TPNOREPLY로 호출했으므로 데이터를 버리게 되는데, 서비스명

을 지정하면 TCPGW는 지정한 서비스에 tpacall로 응답 데이터를 전달한다. 옵션으로 지

정한 서비스는 반드시 등록되어있는 서비스명이어야 한다.

Tmax 클라이언트나 서비스와 TCPGW 사이에 사용자 정보 데이터를 주고 받고자 하는

경우에 사용한다. 옵션으로 지정한 데이터는 리모트 노드로 전송하지 않고 임시 TCPGW

H

에서 보관하였다가 응답이 수신되면 사용자 정보 데이터에 응답 데이터를 붙여서 호출한

서비스에게 전달하고자 하는 경우에 사용하다.

제3장 환경 설정 19

Page 34: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

설명옵션

보통 NON 블록킹 모드로 사용할 때, 송신 서비스와 수신 서비스가 분리되어 있어 송신

서비스에서 수신 서비스에게 데이터를 전달하고자 하는 경우에 많이 사용한다. (기본값:

0)

위의 “-H” 옵션과 동일한 옵션이다. 위의 옵션은 동기 방식이나 비동기 방식 모두에 적용

하는 옵션인데 반해 단지 tpforward에 tprelay로 사용하는 호출에 대해서만 적용된다. (기

본값: 0)

h

리모트 노드에서 Tmax의 서비스를 호출하고 응답 데이터를 리모트 노드에 전송시 전송

하는 채널을 선택하는 방법을 지정하는 옵션이다. 옵션을 지정하면 리모트 노드에서 요

d

청한 응답은 반드시 요청한 채널에 전송하게 된다. 옵션을 지정하지 않으면 리모트 노드

와 연결된 채널 중 임의의 사용가능한 채널을 선택하여 전송한다. 추후 확장을 위하여 임

의의 값을 설정 해주어야 한다.

예를 들어 “-d 0” 와 같이 사용하며, 현재 설정된 값은 무시된다.

TCPGW가 클라이언트 모드로 동작시 매 요청마다 채널을 연결하고 해제하고자 하는 경

우에 사용한다. 옵션을 사용하면 리모트 노드와의 연결된 채널이 없기 때문에 리모트 노

E

드에서 먼저 서비스를 요청할 수 없다. 또한 이 옵션을 사용하면 매번 채널이 연결되고

해제 되므로 처리 속도가 감소된다.OUTBOUND 요청에 의한 연결 시도 실패의 경우 -X

OUTBOUND_REQ 옵션을 사용 시 outmsg_recovery가 호출 되고 TPESYSTEM 에러가

리턴된다.

TCPGW를 비동기 통신 방식으로 사용하고자 할 때 사용하는 옵션이다. 위에서 설명한

것처럼 비동기 통신 방식은 서비스를 요청하고 종료하는 형태이다. 서비스에 대한 응답

도 TCPGW는 다른 서비스에 대한 요청으로 간주한다.

a

Tmax 클라이언트나 서비스에 TCPGW로 리모트 노드에 서비스를 요청할 때 사용자가

채널을 지정할 수 있도록 사용하는 옵션이다. 옵션을 사용하기 위해서는 사용자는 “-k” 옵

션을 사용하여 채널에 대한 상태 정보를 보관하고 있어야 한다.

u

사용자가 지정한 채널이 사용할 수 없으면 TCPGW는 에러를 반환한다.

리모트 노드와 TCPGW사이의 통신시 둘 사이에는 많은 통신 장비나 또는 방어벽이 있을

수 있다. 이 경우에 특정 장비나 방어벽에 둘 사이의 채널이 일정시간 동안 사용하지 않

으면 일방적으로 채널을 끊을 수 있다.

w

채널이 끊어진 경우 보통은 TCPGW나 리모트 노드의 프로세스에서 이를 감지하여 채널

을 다시 연결할 수 있으나, 끊어진 것을 감지하지 못하는 경우가 종종 발생한다. 이를 위

해서 TCPGW에서 이 옵션으로 지정한 시간(초)동안 해당 채널이 사용되지 않으면 무조

건 채널을 끊고 다시 연결을 맺도록 설정하고자 하는 경우에 사용하는 옵션이다.

리모트 노드에서 Tmax의 서비스를 요청한 이후에 서비스는 정상적으로 처리 되었으나

결과를 리모트 노드에 전송할 수 없는 경우, 이전에 처리한 서비스에 대해서 취소 처리를

할 수 있도록 복구 서비스를 지정하는 옵션이다.

Y

20 Tmax Gateway Guide (TCP/IP)

Page 35: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

설명옵션

리모트 노드에서 Tmax의 서비스를 호출한 이후에 리모트 노드와때 세션이 모두 끊어지

면 서비스 처리 결과는 리모트 노드로 전송하지 않고 버려지게 된다. 이 경우에 서비스는

정상 처리 하였으나 리모트 노드 입장에서는 오류로 보기 때문에 문제가 발생할 수 있다.

사용자가 이 옵션에 서비스명을 지정하면 게이트웨이는 리모트로 결과를 전송할 수 없는

경우에 리모트 노드로 전송할 데이터를 지정한 서비스로 호출하게 된다.

TCPGW가 클라이언트 모드로 동작하는 경우에 TCPGW는 먼저 리모트 노드와 연결을

맺게 되는데 리모트 노드와 맺어진 연결이 끊어지거나 또는 연결이 맺어지지 않는 경우

t

에 옵션을 설정해 주지 않으면 일정 시간(3초)이나 서비스 요청이 오는 경우에 다시 연결

을 맺게 된다. 이럴 경우 잦은 리모트 노드와의 연결 시도 때문에 시스템에 부하가 발생

하게 된다.

해결하기 위해 리모트 노드와의 연결을 시도하는 시간 간격(초)을 정해 준 후 "–t "옵션으

로 시간을 지정해 주면 TCPGW는 이 시간 간격으로 리모트 노드와의 연결을 시도하게

된다.

리모트 노드로부터 데이터를 수신할 때 데이터의 끝을 나타내는 특정 문자 혹은 비트 스

트림이 존재할 경우에 필요한 옵션이다. 옵션을 지정하면 데이터 수신시 사용자의

chk_end_msg 가 호출된다.

i

채널 장애 여부 감지(TCP 레벨의 PING/PONG) 기능을 활성화 시킨다.x

- 인자로 0을 줄 경우(-x 0): 메인 채널 장애 복구가 감지되면 바로 메인 채널로 전환된다.

- 인자로 1을 줄 경우(-x 1): 메인 채널 장애 복구가 감지 되더라도 안전한 시점(채널 비사

용시)에 메인 채널로 전환된다. (기본값: 0)

옵션은 set_ping_msg 및 chk_pong_msg 함수와 함께 사용된다.

UID로 활용될 수 있는 메시지 번호(sequence number)의 최대값을 설정하는 옵션이다.

기본값은 50000이며 최대 268435455 까지 지정 가능하다. -y 옵션으로 지정된 값보다

+1되어 적용된다.따라서 디폴트는 1~500001까지 발번됨.

y

3.1.2. 서버/클라이언트 TCPGW의 환경파일

서버/클라이언트 TCPGW의 환경 설정은 아래와 같다.

*DOMAIN

...

*NODE

...

*SVRGROUP

...

*SERVER

testtcpgw SVGNAME=svg1,

제3장 환경 설정 21

Page 36: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

MIN=1,

MAX=1,

CPC=10,

SVRTYPE=CUSTOM_GATEWAY,

#클라이언트 TCPGW의 경우 ①

CLOPT="-- -r 168.126.185.131 -p 5050 -n 5 -k 71673 "

#서버 TCPGW의 경우 ②

#CLOPT="-- -P 5050 -N 5 -k 71673"

*SERVICE

TESTTCPGW SVRNAME=testtcpgw

위와 같이 환경파일을 작성한 경우 testtcpgw라는 이름의 TCPGW는 1개가 Tmax boot시에 기동된다.

testtcpgw의 서비스명은 TESTTCPGW이고 Timeout 값은 설정되어 있지 않으므로 무한대기한다.

①은 TCPGW는 클라이언트로 리모트 노드의 IP주소는 168.126.185.131이고, 리모트 노드의 Listen 포트

번호는 5050이 된다. testtcpgw는 기동시에 리모트 노드와 5개의 연결을 맺는다.

②의 환경설정은 서버로 동작하는 것으로서 Listen 포트번호는 5050이고 리모트 노드와 testtcpgw는 5개

의 연결을 맺게 된다.

"-k "옵션으로 지정한 값은 custom.c의 함수(init_remote_info())의 인자로 전달되어 사용자가 저장해야 할

내용등을 이 key를 이용하여 공유메모리에 저장할 수 있다.

3.1.3. 서비스 블록형 TCPGW의 환경파일

TCPGW는 일단 리모트 노드와 연결이 이루어진 이후에는 서버/클라이언트 의미가 없이 동기형/비동기형

모두 사용할 수 있으므로 여기서는 서버/클라이언트 모드를 별도로 설명하지 않는다.

*DOMAIN

...

*NODE

...

*SVRGROUP

...

*SERVER

testtcpgw SVGNAME=svg1,

MIN=1,

MAX=1,

CPC=10,

SVRTYPE=CUSTOM_GATEWAY,

#클라이언트 TCPGW의 경우

CLOPT="-- -r 168.126.185.131 -p 5050 -n 5 -k 71673 -d 0"

#서버 TCPGW의 경우

#CLOPT="-- -P 5050 -N 5 -k 71673 –d 0"

22 Tmax Gateway Guide (TCP/IP)

Page 37: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

*SERVICE

TESTTCPGW SVRNAME=testtcpgw, SVCTIME=30

위와 같이 환경파일을 작성한 경우 testtcpgw라는 이름의 TCPGW는 1개가 Tmax boot시에 기동된다.

testtcpgw의 서비스명은 TESTTCPGW이고 Timeout 30초이므로 30초 이내에 응답이 없으면 Timeout을

반환한다.

Timeout은 Tmax의 클라이언트나 서비스에서 리모트 노드로 요청한 것에 대해서만 Timeout을 체크하고,

리모트 노드에서 요청한 서비스에 대해서는 요청한 해당 서비스에서 Timeout을 설정해야 한다.

Tmax의 클라이언트나 서버에서 리모트 노드에 서비스 요청시 TCPGW는 UID를 사용한다. UID는 메시지

별 유일한 값으로써 요청에 대한 응답시 반드시 TCPGW에 넘겨주어야 해당 서비스를 요청한 서비스나

클라이언트에게 돌려주게 된다.

리모트 노드에서 서비스 요청시 TCPGW는 요청에 대한 응답을 요청한 채널에 전송한다. 단,요청한 채널

이 끊어진 경우에 데이터는 소멸된다.

3.1.4. 서비스 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 168.126.185.131 -p 5050 -n 5 -k 71673 -S RECVSVC

-H 20 -d 0"

#서버 TCPGW의 경우

#CLOPT="-- -P 5050 -N 5 -k 71673 -S RECVSVC -H 20 –d 0"

sendsvr MIN=1, MAX=1

secvsvr MIN=1, MAX=1

*SERVICE

TESTTCPGW SVRNAME=testtcpgw, SVCTIME=30

제3장 환경 설정 23

Page 38: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

SENDSVC SVRNAME=sendsvr

RECVSVC SVRNAME=recvsvr

위와 같이 환경파일을 작성한 경우 testtcpgw라는 이름의 TCPGW는 1개가 Tmax boot시에 기동된다.

testtcpgw의 서비스명은 TESTTCPGW이고 Timeout 이 30초이므로 30초 이내에 응답이 없으면 Timeout

을 반환한다.

Tmax의 클라이언트나 서버에서 먼저 SENDSVC 서비스를 호출하면 SENDSVC에서 사전 작업을 수행한

후에 TESTTCPGW 서비스로 컨트롤을 넘긴다.(tpforward) TCPGW는 일단 Tmax 엔진에 채널 해제 메시

지를 전송한 후에 리모트 노드로 서비스를 요청하고, 서비스에 응답을 수신시 “-S” 옵션에 지정한 서비스

로 결과를 전달(tprelay)한다. RECVSVC는 처리 결과에 대한 작업을 수행후 반환하면 원래 SENDSVC를

호출한 클라이언트나 서비스에게로 응답이 전달된다. 이 방식을 사용하면 적은 수의 서비스(SENDSVC)

를 가지고 보다 많은 처리를 할 수 있다. 블록형처럼 반드시 UID는 사용해야 한다.

리모트 노드의 응답이 지정한 시간(30초)을 초과하면 TCPGW는 Timeout을 RECVSVC에 전달(tprelay)한

다. RECVSVC 서비스에서는 반드시 tpurcode값을 확인하여 값이 0보다 크면 에러가 발생한 경우이므로

이에 대한 적절한 처리를 해야한다.

Timeout 뿐만 아니라 모든 에러에 대해서는 tpurcode에 값이 전달되며, 에러에 대한 자세한 사항은 “Ap

pendix B. TCPGW 에러 코드” 를 참고한다.

3.1.5. 리모트 동기형과 비동기형 TCPGW 환경파일

리모트 노드에서 요청하는 서비스에 대한 동기형 비동기형 구분은 “-d” 옵션을 사용하느냐에 따라서 결정

되거나, 또는 사용자 정의 함수(get_msg_info)에서 flags에 TPNOREPLY를 설정하면 된다.

전자의 경우 “-d” 옵션을 사용하지 않으면 서비스에 대한 응답은 다른 채널로 전송될 수 있다. 후자인 경우

에는 리모트 노드로 응답을 전송하지 않는다.

*DOMAIN

...

*NODE

...

*SVRGROUP

...

*SERVER

testtcpgw SVGNAME=svg1,

MIN=1,

MAX=1,

CPC=5,

SVRTYPE=CUSTOM_GATEWAY,

#비동기형

CLOPT=" -- -P 5050 -N 5 -k 71673"

#동기형

#CLOPT="-- -P 5050 -N 5 -k 71673 –d 0"

24 Tmax Gateway Guide (TCP/IP)

Page 39: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

*SERVICE

TESTTCPGW SVRNAME=testtcpgw

“-d” 옵션을 지정하였을 경우에도 사용자 정의 함수(get_msg_info)에서 flags에 TPNOREPLY를 설정하면

서비스 응답은 리모트 노드에 전송되지 않는다.

리모트 노드에서 Tmax의 서비스 요청시 TCPGW는 tpacall을 사용함으로 응답을 받지 않고 동시에 tpacall

을 사용할 수 있는 개수가 제한 되어있다.(기본값 8개) 동시에 요청이 8개 이상인 경우에는 *DOMAIN 절

에 MAXSACALL 개수를 적당하게 지정해야 한다.

3.1.6. 재 연결 TCPGW 환경파일

보통 리모트 노드와 통신시 두 채널 사이에는 복잡한 통신 장비를 거쳐서 통신이 이루어지거나 또는 방어

벽을 사이에 두는 경우가 많다. 이러한 경우에 둘 사이의 채널이 일정시간 동안 사용하지 않으면 통신 장

비나 또는 방어벽에서 해당 채널을 끊어서 둘 사이에 통신이 이루어 지지 않는 경우가 발생한다. 이를 방

지하기 위해 둘 사이에 일정간격으로 signal를 주고 받을 수도 있으나 이를 위해서는 TCPGW 뿐만 아니라

상대방의 프로그램을 감안해야 하기 때문에 이 방법을 사용하지 않고 일정시간 동안 해당 채널을 사용하

지 않으면 채널을 끊고 다시 연결하는 방법을 사용한다.

*DOMAIN

...

*NODE

...

*SVRGROUP

...

*SERVER

testtcpgw SVGNAME=svg1,

MIN=1,

MAX=1,

CPC=5,

SVRTYPE=CUSTOM_GATEWAY,

#비동기형

CLOPT=" -- -P 5050 -N 5 -k 71673 -w 600"

#동기형

#CLOPT="-- -P 5050 -N 5 -k 71673 -w 600"

*SERVICE

TESTTCPGW SVRNAME=testtcpgw

위와 같이 설정하면 TCPGW는 600초(10분) 간격으로 600초 동안 한번도 사용하지 않은 채널은 연결을

끊고 다시 연결을 맺는다.

제3장 환경 설정 25

Page 40: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

3.1.7. 여러 리모트 노드와 연결을 맺는 클라이언트 TCPGW

여러 노드의 IP와 연결을 맺는 클라이언트 TCPGW의 환경 설정은 아래와 같다.

*DOMAIN

...

*NODE

...

*SVRGROUP

...

*SERVER

testtcpgw SVGNAME=svg1,

MIN=1,

MAX=1,

CPC=10,

SVRTYPE=CUSTOM_GATEWAY,

CLOPT="-- -f config -n 5 -k 71673 "

*SERVICE

TESTTCPGW SVRNAME=testtcpgw

*config 파일

# tcpgw_no ip_addr port_no in_channel out_channel

0 192.168.1.1 7717 5 5

1 192.168.1.2 7727 5 5

2 192.168.1.3 7737 5 5

3 192.168.1.4 7747 5 5

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)까지만 사용할 수 있다.

26 Tmax Gateway Guide (TCP/IP)

Page 41: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

3.2.1. 사용자 헤더 환경파일

사용자 헤더는 어떤 모드에서도 사용할 수 있는 옵션이다. 사용자 헤더는 두가지로 나누어서 지정할 수 있

는데, tpforward 방식으로 사용할 때(NON 블록킹)와 그 외의 다른 서비스(블록형, 비동기형)를 사용하는

경우 사용자 헤더 길이를 다르게 지정할 수 있다.

*DOMAIN

...

*NODE

...

*SVRGROUP

...

*SERVER

testtcpgw SVGNAME=svg1,

MIN=1,

MAX=1,

CPC=10,

SVRTYPE=CUSTOM_GATEWAY,

#클라이언트 TCPGW의 경우

CLOPT="-- -r 168.126.185.131 -p 5050 -n 5 -H 9 -h 10"

#서버 TCPGW의 경우 ②

#CLOPT="-- -P 5050 -N 5 -H 9 -h 10"

*SERVICE

TESTTCPGW SVRNAME=testtcpgw

“-H” 옵션은 모든 종류의 서비스 요청에 대해서 사용자 헤더를 지정할 때 사용하는 옵션이다. 그에 반해 “-

h” 옵션은 단지 tpforward 방식(NON 블록킹)에서만 사용할 수 있는 옵션이다.

TCPGW는 사용자 헤더가 지정되었을 경우 리모트 노드로 전송하는 데이터 중에서 처음부터 일반 서비스

는 9 Bytes, tpforward 인 경우에는 10 Bytes를 보관하고 나머지 데이터만 리모트 노드에 전송한다.(위의

config인 경우)

리모트 노드로부터 응답을 수신받으면 보관되어있는 사용자 헤더와 응답 데이터를 붙여서 반환한다.

3.2.2. 사용자 헤더 사용 방법

사용자 헤더는 여러가지 방법으로 사용할 수 있다. 사용자 헤더는 사용자가 임의로 사용할 수 있는 데이터

이므로 여기서는 여러 사이트에서 사용하는 일반적인 방법을 설명한다.

● tprelay나 비동기 서비스명 지정

사용자 헤더에 NON 블록형 방식으로 사용할 경우 tprelay될 서비스를 지정할 수 있다. 이 경우에 “-S”옵

션으로 지정한 것보다 우선한다. 사용자 헤더에도 서비스를 지정하고, “-S” 옵션으로 서비스를 지정하

였을 경우 TCPGW는 먼저 사용자 헤더에서 사용자 함수(get_service_name)를 호출하여 서비스를 찾

고, 서비스를 찾지 못한 경우 “-S” 옵션으로 지정한 서비스를 사용한다.

제3장 환경 설정 27

Page 42: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

비동기형 방식(tpacall에 TPNOREPLAY)으로 호출하였을 경우에도 응답 데이터에 대해서 위와 동일하

게 처리한다.

● Key 데이터 보관

NON 블록킹 모드로 사용할 경우 송신과 수신 서비스로 분리되는데 송신 서비스에서 데이터베이스에

적절한 작업을 처리하고 리모트 노드로 데이터를 전송하고 송신 서비스는 종료된다. 나중에 수신 서비

스에서 송신 서비스에서 처리한 데이터베이스의 Key 정보를 알고자 하는 경우나, 또는 수신 서비스에

리모트 노드에서 오류가 발생한 경우 데이터베이스를 되돌려 놓기 위한 중요한 데이터를 보관하고자

하는 경우에 많이 사용한다.

3.3. –E 옵션 사용시 채널백업 설정"-E" 옵션을 사용하여 매 요청시마다 채널을 연결하고 해제할 수 있다. 이런 경우에도 백업 채널을 지정할

수 있다. CLOPT 항목에 "-r "옵션을 사용하여 메인서버 및 백업서버의 주소와 포트 번호를 지정하여 백업

채널을 설정한다.

환경 설정은 다음과 같다.

SERVER 이름 CLOPT=literalㅇ

CLOPT의 사용법은 다음과 같다.

CLOPT= “-- -r [ip]:[port]/[backup ip]:[backup port] –E”

NODE 절에 CRYPTPORT를 지정할 경우, CRYPTPORT 에 지정된 포트로 접속한 클라이언트의 데이터

만이 암호화된다.

3.4. Ping 메시지 체크시 데이터 전송set_ping_msg() 함수와 chk_pong_msg() 함수를 사용하여 PING 메시지를 전송하여 채널의 장애 여부를

주기적으로 감시할 수 있다. 이 경우에 Ping 메시지는 헤더만 있기 때문에 데이터 부분을 전송할 수 없다.

다음과 같이 CLOPT 항목에 “-r” 옵션을 설정하여 Ping 메시지의 데이터를 추가하여 전송할 수 있다.

환경 설정은 다음과 같다.

[DEFAULT :]

SERVER이름 [,CLOPT = -b]

CLOPT의 사용법은 다음과 같다.

CLOPT = “-- -r 192.168.1.31 –p 5060 –n 1 –x 1 –b 64”

● 선택항목

– CLOPT = -b len

28 Tmax Gateway Guide (TCP/IP)

Page 43: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

PING 메시지 데이터의 최대 크기를 지정한다.

set_ping_msg(), chk_pong_msg() 함수 대신에 set_extping_msg,() chk_extpong_msg(), reset_extping_msg()

함수를 사용한다. 이 함수들에 대한 자세한 설명은 “4.2. custom.c 수정”을 참고한다.

제3장 환경 설정 29

Page 44: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다
Page 45: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

제4장 사용자 프로그램

Tmax의 환경을 설정하여 TCPGW를 등록한 후에 TCPGW를 사용하기 위해 해야 할 일은 custom.h, custom.c

를 수정하는 일이다.

custom.h에서 해야 할 일은 msg_header_t 구조체를 TCPGW를 사용하고자 하는 목적에 맞게 수정하는

일이다. TCP/IP는 데이터의 끝을 알수가 없으므로 언제 데이터 수신을 종료해야 할지 모르기 때문에 가변

길이의 데이터를 처리하기가 곤란하다. 그래서 TCPGW는 msg_header_t 구조체를 사용하여 리모트 노드

와 메시지 헤더를 설정하여 실 데이터의 길이를 구할 수 있는 구조로 되어 있다. 구조체의 정보는 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 절에 등록된 이름과 동일해야한다.

4.1. 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;

제4장 사용자 프로그램 31

Page 46: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

int flags; /* flags를 설정한다. (TPNOREPLY등) */

int msgtype;

int channel_id;

} msg_info_t;

구조체는 TCPGW 라이브러리 내부와 사용자가 수정해야 하는 custom.c 파일의 함수에서 사용된다. cus

tom.c 파일에서는 리모트 노드로부터 메시지를 수신한 직후 불리우는 get_msg_info() 함수에서 이 구조체

에 값을 적절히 설정을 해야 한다. 또한 리모트 노드로 메시지를 송신하기 직전에 불리우는 함수인

put_msg_info() 함수에서 구조체의 값으로 리모트 노드로 송신한 데이터를 구성해야 한다.

get_msg_info()와 put_msg_info()의 수정사항에 대한 좀 더 자세한 내용은 “4.2. custom.c 수정” 에서 설명

하도록 한다.

custom.h에는 리모트 노드와 TCPGW사이에서 메시지 헤더 데이터 구조를 정의해 주어야 한다. TCPGW

에서 일반적으로 사용되는 메시지 헤더(msg_header_t) 구조체는 다음과 같다

typedef struct msg_header {

int length;

} msg_header_t;

4.2. custom.c 수정custom.c는 개발자가 리모트 노드와 TCPGW가 통신하기 위해 구현해야 하는 것으로 TCPGW 라이브러

리(libtcpgw.a, libtcpgw.so)와 함께 컴파일해서 사용해야 한다.

custom.c는 정의된 형식에 맞게 구현해야 하며 그 형식은 다음과 같다.

custom.c에는 아래와 같은 변수를 정의해 주어야 한다.

● 변수명 : msg_header_size

변수는 라이브러리 내부에서 사용자가 정의한 메시지 헤더의 사이즈로 인식되어 사용된다. 따라서 이

변수는 아래의 사용법처럼 사용자 정의 메시지 헤더 사이즈로 설정해 주어야 한다.

– 사용법

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에는 아래와 같은 함수를 구현해 주어야 한다.

32 Tmax Gateway Guide (TCP/IP)

Page 47: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

init_remote_info

리모트 노드와 연결을 맺기에 앞서 호출되는 함수이다. TCPGW가 자신의 초기화 작업을 마친후에 곧바

로 호출되는 함수이며 한번만 호출된다. Tmax 환경파일의 CLOPT 절에 "–k "옵션으로 공유메모리 키를

설정한 경우 연결에 대한 정보등을 저장하기 위해 공유메모리를 생성하는 로직을 구현할 수 있다. 경우에

따라 내부 로직을 구현하지 않아도 된다.

● 사용법

int init_remote_info(char *myname, int mynumber, int num_channel, int key)

● 파라미터

설명파라미터

TCPGW 서버명이다.myname

같은 TCPGW가 동시에 여러개 실행될 경우에 각각의 프로세스를 구분할 수

있는 TCPGW 프로세스 번호이다. 0 부터 시작한다.

mynumber

TCPGW가 연결하고 있는 max 채널 수이다. Tmax 환경파일에 "-n", "-N "옵

션으로 설정한 값의 합이다.

num_channel

Tmax 환경파일에서 "–k "옵션으로 설정한 공유메모리 키 값이다.key

remote_connected

리모트 노드와 연결을 맺은 후 호출되는 함수이다. 리모트 노드와 연결을 맺은 후 해야할 작업이 있다면

함수에서 하도록 한다. 채널 수 만큼 호출된다. 또한 도중에 채널이 해제되었다가 다시 연결될 때도 호출

된다.

● 사용법

int remote_connected(int index, int addr, int type, int fd)

● 파라미터

설명파라미터

TCPGW가 "-n" 또는 "-N" 옵션으로 여러개의 채널을 연결하고 있는 경우 각

각의 채널에 대한 자신의 index값이다.

index

리모트 노드의 주소이다.addr

리모트 노드와 연결된 채널 타입이다. IN_CHANNEL 또는 OUT_CHANNEL

인지를 나타낸다.

type

리모트 노드와 연결된 소켓 번호이다.fd

제4장 사용자 프로그램 33

Page 48: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

remote_closed

리모트 노드와 연결을 종료한 후 호출되는 함수이다. 리모트 노드와 연결이 끊어진 후에 해야할 작업이 있

다면 함수에서 하도록 한다. init_remote_info 함수에서 shared memory를 생성하는 로직을 구현한 경우

이 함수에서 해제하는 작업 로직을 구현한다. 채널 수 만큼 호출된다.

● 사용법

int remote_closed(int index, int type)

● 파라미터

설명파라미터

TCPGW가 "-n" 또는" -N" 옵션으로 여러 개의 채널을 연결하고 있는 경우 각

각의 채널에 대한 자신의 index 값이다.

index

리모트 노드와 연결된 채널 타입이다. IN_CHANNEL 또는 OUT_CHANNEL

인지를 나타낸다.

type

get_msg_length

리모트 노드로 부터 요청이나 응답이 도착하여, 해당 채널에서 msg_header_t 부분만을 recv(msg_head

er_size또는 comm_header_size에서 지정한 값 만큼을 읽는다.)한 후 호출하는 함수로 반환된 값만큼, 실

데이터를 다시 read하게 된다.

● 사용법

int get_msg_length(msg_header_t *hp)

● 파라미터

설명파라미터

개발자가 custom.h에 정의할 수 있는 msg_header_t 구조체의 포인터이다.

일반적으로, 해당 채널로 부터 데이터를 읽는 경우, 정해진 헤더의 크기 만큼

hp

데이터를 읽은 후에 헤더에 설정되어 있는 데이터 길이 값을 얻어서 이를 바

탕으로 다음 실 데이터를 읽을 수 있도록 되어있다. hp는 TCPGW가 리모트

노드로 부터 읽은 헤더 데이터를 넘겨준다.

● 반환값

리모트 노드로부터 실 데이터의 길이를 반환한다. 함수의 반환값으로 TCPGW는 실 데이터를 리모트

노드에서 읽게 된다.

34 Tmax Gateway Guide (TCP/IP)

Page 49: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

get_msg_info

리모트 노드으로 부터 요청이나 응답이 도착하여 데이터를 읽은 후 데이터를 Tmax 서비스 프로그램으로

다시 요청이나 응답를 전송하기 전에 해당 데이터 값을 가공하거나, 정보전송을 위한 여러 정보(uid, len,

flags, service명 등)들을 TCP/IP 게이트웨이 라이브러리와 custom.c와의 인터페이스 역할을 하는 info를

참조 또는 가공하는 함수이다.

● 사용법

int get_msg_info(msg_header_t *hp, char *data,msg_info_t *info)

● 파라미터

설명파라미터

리모트 노드로부터 읽어온 메시지 헤더 데이터 대한 포인터이다.

get_msg_length에서 사용한 구조체와 동일하다.

hp

리모트 노드로부터 읽은 데이터 부분이다.data

TCP/IP 게이트웨이 라이브러리(libtcpgw.a, libtcpgw.so)와 custom.c와 인터

페이스 역할을 해주는 구조체 구조이다. 사용자가 수신 받은 데이터를 기초

로 해서 info 구조체의 항목에 각종 정보를 함수에서 설정한다.

info

● 반환값

Tmax 서비스로 보낼 type을 정의한다. TCPGW는 값을 바탕으로 Tmax로 어떤 처리를 할 것인지를 판

단한다. 예를 들어, REMOTE_REQUEST는 리모트 노드로 부터 Request가 발생한 것으로 판단하며,

REMOTE_REPLY는 Tmax 서비스로 부터 Request가 발생하여 리모트 노드로 부터 Response가 오는

경우 반환하는 값이다. REMOTE_REPLY_CONT는 Response 메시지가 이어서 올 경우 반환하는 값이

며, REMOTE_SENDTOCLI는 비요청 메시지일 경우 반환하는 값이다.

리모트 노드로부터 응답을 수신한 경우에는 반드시 UID 값을 info 구조체의 uid 항목에 지정해 주어야

한다. 기타 다른 값들은 상황에 맞게 주어야 한다.

get_channel_numTmax 서비스나 클라이언트로부터 요청한 데이터를 리모트 노드에 전송할 때 사용자가 채널을 선택할 수

있도록 하는 함수이다. 사용자는 주어진 데이터의 특성에 따라서 전송할 채널을 지정할 수 있다. 단 여기

서 지정하는 것은 리모트 노드와 연결된 소켓 번호가 아니라 단순한 채널 번호이다. TCPGW는 사용자가

지정한 채널을 사용할 수 없으면 오류를 반환한다.

● 사용법

int get_channel_num(char *data)

제4장 사용자 프로그램 35

Page 50: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

● 파라미터

설명파라미터

리모트 노드로 보내기 위한 데이터이다.data

● 반환값

채널 번호를 반환한다.

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

리모트 노드로 메시지를 전송한 후에 호출되는 함수이다. 데이터가 완전히 리모트 노드에 전송되었다는

것을 알려주기 위해서 호출되는 함수이다.

● 사용법

36 Tmax Gateway Guide (TCP/IP)

Page 51: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

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)

● 파라미터

설명파라미터

"-H" 또는"-h" 옵션으로 설정한, TCPGW에서 저장하고 있는 사용자 헤더의

포인터이다.

header

오류코드이다.err

tpreply()나 tpacall()를 받는 서비스의 이름을 설정한다.svc

prepare_shutdown

TCPGW가 종료하기 직전에 call되는 함수로서, 일반적으로 init_remote_info() 함수에서 생성한 공유메모

리를 해제하는 일을한다.

● 사용법

int prepare_shutdown(int code)

● 파라미터

설명파라미터

shutdown code로서 현재는 사용되지 않는다.code

제4장 사용자 프로그램 37

Page 52: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

set_service_timeout

서비스 타임 아웃이 발생하였을 경우 사용자가 호출할 수 있는 함수이다.

● 사용법

int set_service_time_out(int uid, char *header)

● 파라미터

설명파라미터

서비스 타임 아웃이 발생한 거래의 unique ID이다.uid

서비스 타임 아웃이 발생한 거래의 헤더이다.header

chk_end_msg리모트 노드로부터 데이터를 수신할 때 데이터의 끝을 나타내는 특정 문자 혹은 비트 스트림이 존재할 경

우 사용자가 호출할 수 있는 함수이다.

● 사용법

int chk_end_msg(int len, char *data)

● 파라미터

설명파라미터

리모트 노드로부터 읽은 데이터 길이이다.len

리모트 노드로부터 읽은 데이터 부분이다.data

inmsg_recovery

리모트 노드로 부터 요청을 tpacall(..., TPBLOCK)로 처리했을 경우 서버가 떠 있지 않으면 에러가 돌아 오

게 되는데, 이러한 때에 호출된다. 사용자는 함수 내에서 적당히 새로운 데이터를 만들고, 데이터의 크기

를 반환한다.

● 사용법

int inmsg_recovery(char *data, msg_info_t *info)

● 파라미터

38 Tmax Gateway Guide (TCP/IP)

Page 53: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

설명파라미터

리모트 노드로부터 읽은 데이터 부분이다.data

리모트 노드로부터 읽은 데이터의 정보이다. 의미있는 값은 다음과 같다.info

- info->svc : tpacall()했었던 서비스 이름

- info->len : tpacall()한 데이터 길이

- info->err : 에러시

- tperrno info->uid : 이전

- get_msg_info()시에 생성되었던 UID 값

● 반환값

사용자는 새로운 데이터의 길이를 반환해야 한다. 데이터의 길이가 0 보다 클 경우, info->svc 에 값이

존재하면 해당 서비스로 tpacall(..., TPNOREPLY) 하고, 그 외에는 리모트 노드로 응답을 보낸다. 데이

터의 길이가 음수일 경우 데이터를 버린다.

outmsg_recovery

리모트 노드로 요청을 보낼 때 에러가 발생할 경우 호출된다. 사용자는 함수 내에서 적당히 새로운 데이터

를 만들고 원하는 서비스 이름 및 UID 등을 설정하고, 데이터의 크기를 반환한다.

● 사용법

int inmsg_recovery(char *data, msg_info_t *info)

● 파라미터

설명파라미터

리모트 노드로부터 읽은 데이터 부분이다.data

리모트 노드로부터 읽은 데이터의 정보이다.info

의미있는 값은 다음과 같다.

- info->svc : tpacall()했었던 서비스 이름

- info->len : tpacall()한 데이터 길이

- info->err : 에러시

- tperrno info->uid : 이전

- get_msg_info()시에 생성되었던 UID 값

제4장 사용자 프로그램 39

Page 54: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

● 반환값

사용자는 새로운 데이터의 길이를 반환해야 한다. 데이터의 길이가 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)

● 파라미터

설명파라미터

리모트 노드로부터 읽어온 메시지 헤더 데이터 대한 포인터이다.

get_msg_length에서 사용한 구조체와 동일하다.

hp

리모트 노드로부터 읽은 데이터 버퍼의 주소값이다.data

리모트 노드로부터 읽은 데이터 버퍼에 할당된 메모리 크기이다.asize

TCP/IP 게이트웨이 라이브러리(libtcpgw.a, libtcpgw.so)와 custom.c와 인터

페이스 역할을 해주는 구조체 구조이다. 사용자가 수신 받은 데이터를 기초

로 해서 info 구조체의 항목에 각종 정보를 설정한다.

info

● 반환값

Tmax 서비스로 보낼 type을 정의한다. TCPGW는 값을 바탕으로 Tmax로 어떤 처리를 할 것인지를 판

단한다. 예를 들어, REMOTE_REQUEST는 리모트 노드로 부터 Request가 발생한 것으로 판단하며,

REMOTE_REPLY는 Tmax 서비스로 부터 Request가 발생하여 리모트 노드로 부터 Response가 오는

경우 반환하는 값이다. REMOTE_REPLY_CONT는 Response 메시지가 이어서 올 경우 반환하는 값이

며, REMOTE_SENDTOCLI는 비요청 메시지일 경우 반환하는 값이다.

리모트 노드로부터 응답을 수신한 경우에는 반드시 UID 값을 info 구조체의 uid 항목에 지정해 주어야

한다. 그리고 기타 다른 값들 상황에 맞게 주어야 한다.

40 Tmax Gateway Guide (TCP/IP)

Page 55: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

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)

● 파라미터

설명파라미터

리모트 노드로 보낼 메시지의 헤더이다.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

채널 장애 감시 주기이다. (단위: 초) 0일 경우, 채널 장애 감지 기능은 비활성

화 된다.

interval

백업 채널 모드일 때, 메인 채널의 상태를 체크 주기이다. (단위: 초) 0 일 경

우, 메인 채널의 상태 체크 기능은 비활성화 된다.

binterval

제4장 사용자 프로그램 41

Page 56: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

설명파라미터

채널 장애 감시 타임아웃이다. 타임 아웃 내에 응답이 오지 않으면 채널은 끊

어진다. (단위: 초) 0 일 경우, PING 메시지만 보내고 PONG 메시지에 대해서

는 신경쓰지 않는다. (Half Duplex 장애 감지)

timeout

장애 감시할 채널 종류를 지정한다. 0 은OUT 채널, 1 은 IN 채널, 2는 모든 채

널을 의미한다.

mode

● 반환값

에러가 발생할 때 음수값을 반환해야 하며, 이 경우 장애 감시 기능은 비활성화 된다.

chk_pong_msg

채널 장애 감시 응답 메시지 여부를 체크하는 사용자 함수이다.

● 사용법

int chk_pong_msg(msg_header_t *hp)

● 파라미터

설명파라미터

리모트로 부터 수신된 메시지이다.hp

● 반환값

채널 장애 감시 응답 메시지이면서 정상적일 경우 양수 값을 반환하며, 비정상적일 경우 음수 값을 반환

한다. 채널 장애 감시 응답 메시지가 아닐 경우는 0을 반환한다. 음수 값을 반환할 경우, 채널은 끊어진

다.

set_extping_msg

서버에 채널 장애 감지시 보낼 메시지 설정하는 함수이다.

● 사용법

int set_extping_msg(msg_header_t *hp, char *data, int len, int *interval,

int *binterval, int *timeout, int *mode)

● 파라미터

42 Tmax Gateway Guide (TCP/IP)

Page 57: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

설명파라미터

채널 장애 감지시 보낼 메시지 헤더이다.hp

송신할 메시지 바디이다.data

채널장애 감지 메시지 바디의 길이이다.len

채널 감지를 위한 간격 설정값의 포인터이다.interval

백업채널 모드로 동작중인 경우, 메인채널 감지를 위한 간격 설정값의 포인

터, 0으로 설정된 경우 메인채널 감지를 하지 않는다.

binterval

초 단위, 채널 감지를 위한 제한 시간이며 이 시간까지 감지가 안된다면 함수

를 실패하게 된다.

timeout

0인 경우, OUTBOUND 채널 감지 1인 경우, INBOUND 채널 감지 2인 경우,

OUTBOUND / INBOUND 채널을 모두 감지한다.

mod

● 반환값

설명반환값

함수 수행 성공일 경우0

함수 수행 실패일 경우음수값

● 예제

int set_extping_msg(msg_header_t *hp, char *data, int len, int *interval,

int *binterval, int *timeout, int *mode)

{

msg_body_t *body;

body = (msg_body_t *)data;

memset(body->data, 0x00, 52);

memcpy(body->data, "tmax50", 7);

body->data[51] = 0;

printf("set_extping_msg : data = %s\n", body->data);

hp->len = 7;

*interval = 10;

*binterval = 20;

*timeout = 100;

*mode = 0; /* OUTBOUND CHANNEL */

return 1;

}

제4장 사용자 프로그램 43

Page 58: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

chk_extpong_msg

채널장애 감지시 서버로부터 받은 메시지 확인하는 함수이다.

● 사용법

int chk_extpong_msg(msg_header_t *hp, char *data, int len)

● 파라미터

설명파라미터

채널장애 감지시 리모트 서버로부터 수신된 메시지 헤더이다.hp

채널장애 감지시 리모트 서버로부터 수신된 메시지 바디이다.data

수신된 메시지 바디의 길이이다.len

● 반환값

설명반환값

함수 수행 성공일 경우0보다 큰 값

함수 수행 실패일 경우음수 값

pong 메시지가 없는 경우0

● 예제

int chk_extpong_msg(msg_header_t *hp, char *data, int len)

{

msg_body_t *body;

char data2[15];

body = (msg_body_t *)data;

printf("chk_extpong_msg : data = %s\n", body->data);

return 1;

}

reset_extping_msg

TCP/IP PING(채널장애 감지) 메시지의 전송 주기 재설정을 위하여 주기적으로 호출되는 함수이다.

● 사용법

int reset_extping_msg(msg_header_t *hp, char *data, int len)

44 Tmax Gateway Guide (TCP/IP)

Page 59: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

● 파라미터

설명파라미터

채널장애 감지를 위해 전송할 메시지의 헤더이다.hp

재설정할 메시지 바디이다.data

재설정한 메시지 바디의 길이이다len

● 반환값

설명반환값

함수 수행 성공일 경우0보다 큰 값

함수 수행 실패일 경우음수 값

● 예제

int reset_extping_msg(msg_header_t *hp, char *data, int len)

{

hp->len = 10;

data = "reset_msg";

printf("reset_extping_msg : data = %s\n", data);

return 1;

}

set_error_msg

TCP/IP Gateway 를 통한 리모트 노드와의 거래 도중 에러가 발생하였을 경우 (ex 타임 아웃 혹은 네트워

크 단절) 자동으로 호출되는 함수로 해당 함수 내에서 사용자는 사용자 헤더 또는 사용자 데이터를 수정할

수 있다

● 사용법

int set_error_msg(msg_header_t *hp, int err, char *data, int len)

● 파라미터

설명파라미터

에러가 발생했을 경우 전송된 메세지의 헤더로 사용자가 수정할 수 있다.hp

에러가 발생했을 경우 전송된 데이터로 사용자가 수정할 수 있다.data

메시지 바디의 길이이다len

제4장 사용자 프로그램 45

Page 60: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

● 반환값

설명반환값

리턴한 길이 만큼의 데이터를 전송. 단 이 경우 CLOPT="-I" 옵션을 설정해야

만 적용됨

반환값 > 0

사용자 헤더 부분까지만 전송반환값 = 0

해당 메세지를 CLH 로 전송하지 않음반환값 < 0

● 오류

설명오류

리모트 노드로 전송 후 응답을 받기 전에 끊어짐TPECLOSE

리모트 노드로 전송 후 타임 아웃 발생TPETIME

ASYNC 모드에서 tpforward API 를 사용하는 경우 외TPEPROTO

클라이언트 모드 / 연결을 맺을 경우 OUT 채널 수의 부족TPENOENT

클라이언트 모드 / 연결을 맺을 경우 리모트 노드가 비정상 동작TPENOREADY

메모리 할당 등의 오류TPEOS

내부적 오류TPESYSTEM

put_msg_info 에서 0 혹은 음수를 리턴TPESVCERR

● 예제

int set_error_msg(msg_header_t *hp, int err, char *data, int len)

{

msg_body_t * body;

body = (msg_body_t *)data;

strcpy(body->data, "changed hello data");

/* 에러 메시지에는 데이터가 포함되지 않으므로

데이터 부분까지 전달되기 위해서는 -I 옵션을 사용해야 한다.

사용하지 않을 시 사용자 헤더까지만 CLH로 전달된다. */

/* 사용자헤더가 없는 경우에 hp와 data의 값이 같을 수 있다. */

strcpy(hp->retsvcname, "RECVSVC_CHANGE");

return len;

}

이 절에서 설명한 함수들의 사용 예제는“제4장 사용자 프로그램”에서 설명한다.

46 Tmax Gateway Guide (TCP/IP)

Page 61: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

4.3. register.c 수정사용자 함수 등록 파일로서, 사용자가 등록한 함수들만 게이트웨이 라이브러리에서 호출된다. 게이트웨

이 컴파일할 때, 반드시 register.c를 포함 시켜야 한다. 사용하지 않는 함수는 NULL 등록하면 된다.

register.c 예제는 다음과 같다.

/* ------------- tcpgw 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);

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);

extern int set_extping_msg(msg_header_t *hp, char *data, int len, int *interval,

int *bintrval, int *timeout, int *mode);

extern int chk_extpong_msg(msg_header_t *hp, char *data, int len);

/***************************************************************

* int

* _register_custom()

*

* returns no used

* [function number]

* 1. init_remote_info

* 2. prepare_shutdown

* 3. remote_connected

제4장 사용자 프로그램 47

Page 62: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

* 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

* 21. set_extping_msg

* 22. chk_extpong_msg

***************************************************************/

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);

#if defined(_TCPGW_USE_EXTMSG)

_tcpgw_regfn(15, get_extmsg_info);

_tcpgw_regfn(16, put_extmsg_info);

_tcpgw_regfn(6, NULL);

_tcpgw_regfn(7, NULL);

#else

_tcpgw_regfn(6, get_msg_info);

_tcpgw_regfn(7, put_msg_info);

_tcpgw_regfn(15, NULL);

_tcpgw_regfn(16, NULL);

#endif

_tcpgw_regfn(8, put_msg_complete);

_tcpgw_regfn(9, get_channel_num);

_tcpgw_regfn(10, get_service_name);

_tcpgw_regfn(11, set_service_timeout);

#if !defined(_TCPGW_VERSION_OLD)

#if defined(_TCPGW_VERSION_1) || defined(_TCPGW_VERSION_2)

_tcpgw_regfn(12, get_msg_security);

48 Tmax Gateway Guide (TCP/IP)

Page 63: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

#else

_tcpgw_regfn(12, NULL);

#endif

_tcpgw_regfn(14, chk_end_msg);

#else

_tcpgw_regfn(12, NULL);

_tcpgw_regfn(14, NULL);

#endif

_tcpgw_regfn(13, NULL);

#if !defined(_TCPGW_VERSION_OLD) && !defined(_TCPGW_VERSION_1)

_tcpgw_regfn(17, inmsg_recovery);

_tcpgw_regfn(18, outmsg_recovery);

#else

_tcpgw_regfn(17, NULL);

_tcpgw_regfn(18, NULL);

#endif

#if !defined(_TCPGW_VERSION_OLD) && !defined(_TCPGW_VERSION_1)

&& !defined(_TCPGW_VERSION_2)

#if defined(_TCPGW_USE_EXTPING)

_tcpgw_regfn(19, NULL);

_tcpgw_regfn(20, NULL);

_tcpgw_regfn(21, set_extping_msg);

_tcpgw_regfn(22, chk_extpong_msg);

#else

_tcpgw_regfn(19, set_ping_msg);

_tcpgw_regfn(20, chk_pong_msg);

_tcpgw_regfn(21, NULL);

_tcpgw_regfn(22, NULL);

#endif

#else

_tcpgw_regfn(19, NULL);

_tcpgw_regfn(20, NULL);

_tcpgw_regfn(21, NULL);

_tcpgw_regfn(22, NULL);

#endif

return 1;

}

제4장 사용자 프로그램 49

Page 64: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다
Page 65: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

제5장 예제

본 장에서는 2장에서 설명한 TCPGW의 각 역할에 대한 예제에 대해 설명한다.

5.1. OUTBOUND TCPGW 예제TCPGW가 Tmax boot시 기동되어 있다가 리모트 노드의 요청이 수신되면, 사용자가 지정한 서비스를 호

출한 후에 다시 리모트 노드로 처리 결과를 주는 예제이다. TCPGW의 클라이언트/서버 방식에 관계가 없

다. 그리고 리모트 노드의 상황에 맞게 custom.c를 수정하여 TCPGW를 구성한다.

다음은 OUTBOUND TCP/IP 게이트웨이의 흐름이다.

[그림 5.1] OUTBOUND TCP/IP 게이트웨이

5.1.1. 프로그램 구성

프로그램 구성은 다음과 같다.

● Config file : tcpgw.m

● TCPGW : custom.c, custom.h

● Server : svr.c

● Remote Node : rclient.c, custom.h

<tcpgw.m>

*DOMAIN

res SHMKEY = 88000,

제5장 예제 51

Page 66: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

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 5050 -N 2 –d 0"

svr SVGNAME = svg1,

MIN = 1, MAX = 1

*SERVICE

TOUPPER SVRNAME = svr

<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;

52 Tmax Gateway Guide (TCP/IP)

Page 67: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

/* -------------------------------------------------------------------- */

/* 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;

#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;

/* 실제 데이터의 길이를 반환한다. */

/* 여기서 반환하는 값으로 리모트 노드에서 오는 데이터를 읽는다. */

제5장 예제 53

Page 68: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

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;

/* body->name을 이용하여 에러 유무 전송 */

if (info->err) /* error */

strcpy(body->name, "Fail");

else

strcpy(body->name, "Success");

/* 리모트 노드로 요청에 대한 결과를 전송하기 위한 데이터 길이를 반환한다. */

return (info->len + sizeof(msg_header_t));

}

54 Tmax Gateway Guide (TCP/IP)

Page 69: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

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;

}

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;

}

<Makefile>

#이 Makefile은 ibm 32bit 용이다.

#TARGET은 Tmax 환경파일에서 정의한 SERVER이름과 같아야 한다.

TARGET = tcpgw

APOBJS = $(TARGET).o

제5장 예제 55

Page 70: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

#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

<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);

}

56 Tmax Gateway Guide (TCP/IP)

Page 71: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

<rclient.c>

다음의 예제 프로그램은 테스트를 위한 리모트 노드의 클라이언트 프로그램이다. 테스트를 위해서는

TCPGW가 기동된 후 프로그램을 기동시켜야 한다.

#include <stdio.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include "custom.h"

#define SERV_ADDR "168.126.185.132"

#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;

/* ① TCPGW로 연결을 맺는다. */

if ( (fd = network_connect()) < 0 ) {

perror("network connect error:");

return -1;

}

/* ② 전문을 구성한다. */

/* Message Header */

header = (msg_header_t *)malloc(sizeof(msg_header_t));

memset(header, 0x00, sizeof(msg_header_t));

header->len = sizeof(msg_body_t);

/* 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++) {

/* ③ 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");

제5장 예제 57

Page 72: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

/* Message Body */

strncpy(body->data, argv[1], 100);

if ( (n = send(fd, (char *)body, sizeof(msg_body_t), 0)) <= 0 ) {

perror("network write error:");

close(fd);

return -1;

}

/* ④ TCPGW로 데이터를 수신한다. */

if ( (n = recv(fd, (char *)&olen, 4, 0)) < 0 ) {

perror("network read error:");

close(fd);

return -1;

}

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;

}

}

/* ⑤ 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) {

return -1;

}

58 Tmax Gateway Guide (TCP/IP)

Page 73: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

if (connect(fd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) >= 0)

return fd;

close(fd);

return -1;

}

5.2. 동기 INBOUND TCPGW 예제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를 구성한다.

[그림 5.2] 동기 INBOUND TCP/IP 게이트웨이

제5장 예제 59

Page 74: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

5.2.1. 프로그램 구성

프로그램 구성은 다음과 같다.

● Config file : tcpgw.m

● TCPGW : custom.c, custom.h

● Remote Node : rserver.c, network.c, custom.h

● Client : cli_tcpgw.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 = "-- -r 168.126.185.131 -p 5060 -n 2"

*SERVICE

TCPGW SVRNAME = tcpgw

<custom.h>

#ifndef _CUSTOM_H_

#define _CUSTOM_H_

/* -------------------------------------------------------------------- */

/* Fixed structures and macros */

#define MSG_MAGIC "Tmax"

60 Tmax Gateway Guide (TCP/IP)

Page 75: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

#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는 개발자가 재정의 가능한 구조체 이다. */

#define UID_FIELD 98

#define SVC_NAME_FIELD 92

#define UID_LENGTH 4

#define SVC_LENGTH 6

typedef struct msg_header {

int len;

} msg_header_t;

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"

/* msg_header_size와 comm_header_size는 TCPGW 라이브러리 내에서 사용되기 때문에

제5장 예제 61

Page 76: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

정의해 주어야 한다. */

int msg_header_size = sizeof(msg_header_t);

int comm_header_size = 0;

/* 아래의 함수들은 필요하지 않은 경우 내부 로직은 구현하지 않아도 된다. */

/* 그러나 TCPGW 라이브러리 내에서 사용되기 때문에 정의해 주어야 한다. */

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;

}

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;

}

return ntohl(hp->len);

}

int get_msg_info(msg_header_t *hp, char *data, msg_info_t *info)

{

info->flags = 0;

if ((info == NULL) || (hp == NULL) || (data == NULL))

return -1;

info->len = ntohl(hp->len);

62 Tmax Gateway Guide (TCP/IP)

Page 77: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

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(msg_header_t *hp, char *data, msg_info_t *info)

{

int nSize = 0;

if ((info == NULL) || (hp == NULL) || (data == NULL))

return -1;

/* hp->len 에 들어가는 값은 실제 데이터의 길이이다. */

hp->len = htonl(info->len);

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);

memcpy((char *)&data[SVC_NAME_FIELD], info->svc, SVC_LENGTH);

return (info->len + msg_header_size);

}

int remote_closed(int index, int type)

{

return 1;

}

int prepare_shutdown(int code)

제5장 예제 63

Page 78: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

{

return 1;

}

int set_service_timeout(int uid, char *header)

{

return 1;

}

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;

}

<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)

64 Tmax Gateway Guide (TCP/IP)

Page 79: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

$(CC) $(CFLAGS) $(LDFLAGS) -L$(LIBDIR) -o $(TARGET) $(OBJS) $(LIBS)

mv $(TARGET) $(APPDIR)/.

rm -f $(OBJS)

$(APOBJS): $(TARGET).c

$(CC) $(CFLAGS) $(LDFLAGS) -c $(TARGET).c

<rserver.c>

다음의 예제 프로그램은 TCPGW의 접속을 받고, 전문을 수신/송신하는 기능의 데몬 형태의 프로그램이

다. 테스트를 위해서는 프로그램이 먼저 기동되어 있는 상태에서 TCPGW가 기동되어야 한다.

#include <stdio.h>

#include <unistd.h>

#include <sys/time.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <netdb.h>

#include <fcntl.h>

#include <sys/stat.h>

#include <errno.h>

#include "custom.h"

#define SERV_PORT 5060

void doit(int fd);

int main(int argc, char *argv[])

{

int ret, i, len;

int fd, childfd;

pid_t childpid;

ret = network_listen(SERV_PORT);

if (ret < 0){

return -1;

}else fd = ret;

for (;;){

childfd = network_accept(fd);

if (childfd < 0){

return -1;

}

if ( (childpid = fork()) == 0){

close(fd);

제5장 예제 65

Page 80: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

doit(childfd);

exit(0);

}

close(childfd);

}

}

void doit(int fd)

{

ssize_t n;

int ret, i;

msg_header_t *header;

msg_body_t *body;

header = (msg_header_t *)malloc(sizeof(msg_header_t));

memset((char *)header, 0x00, sizeof(msg_header_t));

body = (msg_body_t *)malloc(sizeof(msg_body_t));

memset((char *)body, 0x00, sizeof(msg_body_t));

readn2(fd, (char *)header, sizeof(msg_header_t));

readn2(fd, (char *)body, ntohl(header->len));

if (body->uid == 0){

printf("It's reply message\n");

}else printf("It's request message\n");

for (i = 0; i < sizeof(body->data); i++)

body->data[i] = toupper(body->data[i]);

header->len = htonl(sizeof(msg_body_t));

writen2(fd, (char *)header, sizeof(msg_header_t));

writen2(fd, (char *)body, sizeof(msg_body_t));

}

<network.c>

#include <stdio.h>

#include <unistd.h>

#include <sys/time.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <netdb.h>

66 Tmax Gateway Guide (TCP/IP)

Page 81: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

#include <fcntl.h>

#include <sys/stat.h>

#include <errno.h>

#ifndef INADDR_NONE

#define INADDR_NONE 0xffffffff /* should be in <netinet/in.h> */

#endif

/* ----------------------- extern global variable ------------------- */

extern int errno;

extern char _svrname[30];

int network_listen(int portno)

{

int fd, on;

struct sockaddr_in serv_addr;

if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){

return(-1);

}

on = 1;

if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &on,

sizeof(on)) < 0) {

printf("setsockopt error for SO_REUSEADDR");

}

#ifdef SO_KEEPALIVE

on = 1;

if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char *) &on,

sizeof(on)) < 0) {

printf("setsockopt error for SO_KEEPALIVE");

}

#endif

memset((char *) &serv_addr, 0, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;

serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

serv_addr.sin_port = htons(portno);

if (bind(fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {

제5장 예제 67

Page 82: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

close(fd);

return(-2);

}

if (listen(fd, 250) < 0) {

close(fd);

return(-3);

}

return(fd);

}

/* ------------------- server : client accept --------------------- */

int network_accept(int listenfd)

{

int fd, len;

struct sockaddr_in cli_addr;

len = sizeof(cli_addr);

fd = accept(listenfd, (struct sockaddr *)&cli_addr, &len);

if (fd < 0){

return(-1); /* often errno=EINTR, if signal caught */

}

return(fd);

}

int readn2(int fd, char *ptr, int nbytes)

{

int nleft, nread;

nleft = nbytes;

while (nleft > 0) {

nread = recv(fd, ptr, nleft, 0);

if (nread < 0) {

if (errno == EINTR)

continue;

else if (errno == EWOULDBLOCK)

return (nbytes - nleft);

return(nread); /* error, return < 0 */

} else if (nread == 0)

break; /* EOF */

68 Tmax Gateway Guide (TCP/IP)

Page 83: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

nleft -= nread;

ptr += nread;

}

return (nbytes - nleft); /* return >= 0 */

}

int writen2(int fd, char *ptr, int nbytes)

{

int nleft, nwritten;

nleft = nbytes;

while (nleft > 0) {

nwritten = send(fd, ptr, nleft, 0);

if (nwritten <= 0) {

return(nwritten); /* error */

}

nleft -= nwritten;

ptr += nwritten;

}

return(nbytes - nleft);

}

<Makefile>(rServer용)

#이 Makefile은 compac 용이다.

TARGET = rServer

APOBJS = $(TARGET).o

OBJS = $(APOBJS) network.o

CFLAGS = -D_DBG

.c.o:

$(CC) $(CFLAGS) -c $<

all : $(TARGET)

$(TARGET):$(OBJS)

$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(LIBS)

rm -f $(OBJS)

<cli_tcpgw.c>

다음의 예제 프로그램은 TCPGW에 서비스를 요청하는 Tmax 클라이언트이다. TCPGW와 리모트 노드와

의 연결이 완료된 후 프로그램을 실행한다.

제5장 예제 69

Page 84: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

#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;

/* TCPGW 서비스를 호출한다. */

ret = tpcall("TCPGW", 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();

}

70 Tmax Gateway Guide (TCP/IP)

Page 85: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

5.3. NON 블록킹 TCPGW 예제NON 블록킹 TCPGW 방식은 보통 대외계와 통신하는 경우에 많이 사용한다. 적은 프로세스 수로도 시스

템이 부하를 적게 주면서 보다 많을 일을 처리할 수 있기 때문이다.

블록형 방식은 Tmax 클라이언트나 서비스에서 직접 TCPGW를 호출하여 응답을 받았으나 이 방식은 송

신 프로세스와 TCPGW로부터 응답을 처리하는 수신 프로세스를 분리하여 처리한다.

TCPGW를 호출하고자 하는 모든 프로세스는 먼저 송신 프로세스를 호출하면, 송신 프로세스는 TCPGW

를 호출하기 전에 사전 작업을 완료하고 TCPGW로 서비스 컨트롤을 넘긴다.(tpforward) 다음에 TCPGW

는 넘겨받은 서비스 처리를 하기전에 Tmax 엔진과 연결되어 있는 채널의 블록상태를 해제하고 리모트 노

드로 서비스를 송신하다. 리모트 노드로부터 응답을 수신받으면 TCPGW는 수신 메시지를 처리할 수신

서비스를 서비스를 찾는 순서에 따라서 서비스를 찾아 수신 프로세스에게 서비스 컨트롤을 넘긴다. 수신

프로세스는 응답을 처리한 후에 최초로 서비스를 호출한 프로세스에게 결과를 전달한다.

위와 같은 원리로 서비스되므로 실제 TCPGW를 호출하는 서비스나 tprelay받는 서비스는 비동기적으로

작동하므로 수행시간에 대한 부하를 거의 가지지 않는다.

단, 최초로 송신 서비스를 호출하는 프로세스는 응답이 올때까지 기다리므로 블록되어 있는 상태이다.

다음의 그림은 리모트 노드가 서버가 되고 TCPGW가 클라이언트로서 연결을 맺는 구조이다.

[그림 5.3] NON BLOCKING TCPGW 예제

5.3.1. 프로그램 구성

프로그램 구성은 다음과 같다.

● Config file : tcpgw.m

● TCPGW : custom.c, custom.h

● Remote Node : rServer.c, network.c, custom.h

● Server : sndsvr.c, rcvsvr.c

제5장 예제 71

Page 86: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

● Client : cli_tcpgw.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 = "-- -r 168.126.185.131 -p 5060 -n 2 -H 9"

sndsvr SVGNAME = svg1,

MIN = 1, MAX = 1

rcvsvr SVGNAME = svg1,

MN = 1, MAX = 1

sndsvr SVGNAME = svg1,

MIN = 1, MAX = 1

rcvsvr SVGNAME = svg1,

MIN = 1, MAX = 1

*SERVICE

TCPGW SVRNAME = tcpgw

SENDSVC SVRNAME = sndsvr

RECVSVC SVRNAME = rcvsvr

<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"

72 Tmax Gateway Guide (TCP/IP)

Page 87: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

/* msg_header_size와 comm_header_size는 TCPGW 라이브러리 내에서 사용되기 때문에

정의해 주어야 한다. */

int msg_header_size = sizeof(msg_header_t);

int comm_header_size = 0;

/* 아래의 함수들은 필요하지 않은 경우 내부 로직은 구현하지 않아도 된다. */

/* 그러나 TCPGW 라이브러리 내에서 사용되기 때문에 정의해 주어야 한다. */

int get_channel_num(char *data)

{

return -1;

}

int put_msg_complete(char *hp, char *data, msg_info_t *info)

{

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 addr, int type, int fd)

{

return 1;

}

int get_msg_length(msg_header_t *hp)

{

if (hp == NULL || hp->len == 0){

return -1;

}

return ntohl(hp->len);

}

/* get_msg_info와 put_msg_info는 동기 클라이언트 TCPGW와 동일하게 구현한다. */

int get_msg_info(msg_header_t *hp, char *data, msg_info_t *info)

제5장 예제 73

Page 88: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

{

info->flags = 0;

if ((info == NULL) || (hp == NULL) || (data == NULL))

return -1;

info->len = ntohl(hp->len);

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;

}

}

int put_msg_info(msg_header_t *hp, char *data, msg_info_t *info)

{

int nSize = 0;

if ((info == NULL) || (hp == NULL) || (data == NULL))

return -1;

/* hp->len 에 들어가는 값은 실제 데이터의 길이이다. */

hp->len = htonl(info->len);

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 + 4);

}

74 Tmax Gateway Guide (TCP/IP)

Page 89: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

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;

}

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;

}

<Makefile>

“5.2. 동기 INBOUND TCPGW 예제”의 Makefile 예제와 동일하다.

<sndsvr.c>

#include <string.h>

#include <stdio.h>

#include <usrinc/atmi.h>

SENDSVC(TPSVCINFO *msg)

{

char *sndbuf;

long len;

제5장 예제 75

Page 90: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

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);

/* TCPGW의 서비스를 tpforward로 호출한다. */

tpforward("TCPGW", (char *)sndbuf, len, TPNOREPLY);

}

<rcvsvr.c>

#include <stdio.h>

#include <string.h>

#include <usrinc/atmi.h>

/* TCPGW에서 동적으로 이 서비스에 tprelay를 한다. */

RECVSVC(TPSVCINFO *msg)

{

char *rcvbuf;

long len;

printf("[%s] Service Started!\n", msg->name);

len = msg->len;

rcvbuf = msg->data;

if(tpurcode != 0) {

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 );

}

<rServer.c>

다음 예제 프로그램은 TCPGW의 접속을 받고, 전문을 수신/송신하는 기능의 데몬 형태의 프로그램이다.

테스트를 위해서는 이 프로그램이 먼저 기동되어 있는 상태에서 TCPGW가 기동되어야 한다.

76 Tmax Gateway Guide (TCP/IP)

Page 91: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

#include <stdio.h>

#include <unistd.h>

#include <sys/time.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <netdb.h>

#include <fcntl.h>

#include <sys/stat.h>

#include <errno.h>

#include "custom.h"

#define SERV_PORT 5060

void doit(int fd);

int main(int argc, char *argv[])

{

int ret, i, len;

int fd, childfd;

pid_t childpid;

ret = network_listen(SERV_PORT);

if (ret < 0){

return -1;

}else fd = ret;

for (;;){

childfd = network_accept(fd);

if (childfd < 0){

return -1;

}

if ( (childpid = fork()) == 0){

close(fd);

doit(childfd);

exit(0);

}

close(childfd);

}

}

void doit(int fd)

{

ssize_t n;

int ret, i;

msg_header_t *header;

제5장 예제 77

Page 92: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

/* 사용자 헤더를 제외한 나머지 부분만을 받는다. */

remote_body_t *body;

int uid;

header = (msg_header_t *)malloc(sizeof(msg_header_t));

memset((char *)header, 0x00, sizeof(msg_header_t));

body = (remote_body_t *)malloc(sizeof(remote_body_t));

memset((char *)body, 0x00, sizeof(remote_body_t));

readn2(fd, (char *)header, sizeof(msg_header_t));

readn2(fd, (char *)body, ntohl(header->len));

if (body->uid == 0){

printf("It's reply message\n");

}else printf("It's request message\n");

for (i = 0; i < sizeof(body->data); i++)

body->data[i] = toupper(body->data[i]);

header->len = htonl(sizeof(remote_body_t));

writen2(fd, (char *)header, sizeof(msg_header_t));

writen2(fd, (char *)body, sizeof(remote_body_t));

}

<network.c>

“5.2. 동기 INBOUND TCPGW 예제” 의 network.c의 예제와 동일하다.

<cli_tcpgw.c>

다음 예제 프로그램은 Tmax 클라이언트로서 SENDSVC를 호출하도록 되어있다. SENDSVC를 호출하기

전에 TCPGW에서 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");

78 Tmax Gateway Guide (TCP/IP)

Page 93: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

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;

memcpy(buf, (char *)body, sizeof(msg_body_t));

/* TCPGW를 호출할 서비스를 호출한다. */

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();

}

제5장 예제 79

Page 94: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다
Page 95: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

Appendix A. CUSTOM INFO

A.1. 구조체CUSTOM INFO 구조체에 대한 설명이다.

● svc

char유형

20길이

서비스명을 지정하는 항목이다. 리모트 노드에서 서비스 요청시 항목에 서비스명을

주면 TCPGW는 이를 이용하여 서비스를 호출한다.

설 명

● err

int유형

4길이

서비스를 요청하고 응답 데이터를 수신 받았을 경우 에러 유무를 나타내는 항목이다.설 명

● len

int유형

4길이

송수신 데이터의 길이를 나타내는 항목이다.설 명

● uid

int유형

4길이

동기 통신할 경우 TCPGW가 만든 UID를 담고있는 항목이다.설 명

● flags

int유형

4길이

리모트 노드에서 Tmax로 서비스를 요청할 때 사용하는 항목이다.설 명

Appendix A. CUSTOM INFO 81

Page 96: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

● msgtype

int유형

4길이

미사용 항목이다.설 명

● channel_id

int유형

4길이

송수신 채널 번호이다.설 명

A.2. CUSTOM INFO Flags

설명항목

리모트 노드에서 요청한 서비스에 대해서 응답을 받는 경우NOFLAGS

리모트 노드에서 요청한 서비스에 대해서 응답을 받지 않고 서비스 요청만 하는 경우,

Tmax의 tpacall에 TPNOREPLY와 같음

TPNOREPLY

82 Tmax Gateway Guide (TCP/IP)

Page 97: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다

Appendix B. TCPGW 에러 코드

TCPGW 에러 코드는 다음과 같다.

설명에러 코드

게이트웨이 헤더를 사용할 경우 TCPGW를 호출한 데이터의 길이가 게이트웨이 헤더

보다 작을 경우 발생한다.

TPEINVAL

tpforward로 TCPGW를 호출할 때 TCPGW가 동기형 모드가 아닌 비동기형 모드일

경우 발생, tpforward & tprelay 방식은 반드시 동기형 방식이어야 한다.

TPEPROTO

옵션 “-E”를 사용할 경우 서비스 요청마다 리모트 노드와 연결을 하고 데이터를 전송

하는데, 동시에 호출한 수가 “-n” 옵션으로 지정한 채널의 수를 초과했을 때 발생한다.

TPENOENT

리모트 노드와의 연결이 끊어져 사용할 수 있는 채널이 없는 경우이다.TPENOREADY

TCPGW 내부에서 메모리를 확보하는데 확보되지 않을 경우이다.TPEOS

TCPGW에서 코드변환을 사용할 경우 요청한 데이터에 대한 map 파일이 로드되지

않을 경우나 또는 코드 변환 오류시 사용자 함수 put_msg_info에서 음수를 반환한 경

우 리모트 노드로 데이터 전송시 오류가 발생한 경우이다.

TPESYSTEM

리모트 노드로 서비스를 요청하고 지정된 시간내에 응답이 없을 경우이다.TPETIME

리모트 노드로 서비스를 요청한 이후에 리모트 노드와 연결이 끊어진 경우이다.TPECLOSE

Appendix B. TCPGW 에러 코드 83

Page 98: Tmax Gateway Guide (TCP/IP)TCPIP).pdf · 2019-04-09 · Tmax Gateway Guide (TCP/IP)는 총 5개의 장과 Appendix로 구성되어 있다. 각 장의 주요 내용은 다음과 같다