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

Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

  • Upload
    others

  • View
    24

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide

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

Page 2: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 1

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

Document Edition Date Version

TMTGW-0802-01-400 Aug 2, 2005 Tmax 4.00

Tmax 제품은 아래 표와 같습니다. 본 서는 Tmax Standard 와 옵션중에 굵게 기울임꼴로 인쇄되어 있는 내용을 포함하고 있습니다.

Page 3: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 2

Tmax Standard TP Function + 2 Phase Commit

Tmax Options

Web Admin Console, X.25 Gateway, TCP/IP Gateway, Host-Link, Power Builder Interface Module, SERIAL Gateway, TCP/IP Service Gateway, TCP/IP Thread Gateway

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

규 약 설 명

Page 4: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 3

{ } [ ] |

( ) Numeric

String Literal

필수 항목 옵션 항목

지정된 여러 개의 값 중 배타적인 선택 구분자 디폴트 값

숫자 abc 형태의 문자열

“abc” 형태의 문자열

Page 5: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 4

차 례

1 TCP/IP Gateway의 개요 ............................................................. 6

1.1 개요.......................................................................................................................... 6

2 TCP/IP Gateway 서비스의 유형................................................. 9

2.1 동기형 TCPGW....................................................................................................... 9

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

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

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

2.2 비동기형 TCPGW ................................................................................................. 13

2.2.1 TMAX단에서 서비스 요청 방식 .................................................................... 14

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

2.3 서버 TCPGW ........................................................................................................ 16

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

3 TCP/IP Gateway 환경 설정...................................................... 18

3.1 Tmax 환경 구성.................................................................................................... 19

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

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

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

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

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

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

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

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

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

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

3.3 Gateway 기타 기능 .............................................................................................. 37

3.3.1 Gateway 헤더 ................................................................................................ 37

3.3.2 다중 응답 처리 .............................................................................................. 38

Page 6: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 5

3.3.3 서비스명을 찾는 순서 ................................................................................... 38

3.3.4 사용자 임의의 채널 지정 .............................................................................. 39

3.3.5 코드 변환 ....................................................................................................... 40

3.4 TCP/IP Gateway 사용자 프로그램(custom.h, custom.c) .................................. 43

3.4.1 custom.h 수정 ................................................................................................ 44

3.4.2 custom.c 수정 ................................................................................................ 45

3.4.3 register.c 수정 ................................................................................................ 60

4 예제............................................................................................ 63

4.1 OUTBOUND TCPGW 예제................................................................................... 63

4.1.1 개요 및 프로그램 내용.................................................................................. 63

4.1.2 프로그램 구성 ................................................................................................ 64

4.2 동기 TCPGW 예제 ( INBOUND ) ........................................................................ 76

4.2.1 개요 및 프로그램 내용.................................................................................. 76

4.3 NON 블록킹 TCPGW 예제 .................................................................................. 95

4.4 부 록 ........................................................................................................... 110

4.4.1 CUSTOM INFO 구조체................................................................................ 110

4.4.2 CUSTOM INFO Flags................................................................................... 110

4.4.3 TCPGW 에러 코드 .......................................................................................111

Page 7: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 6

1 TCP/IP Gateway 의 개요

1.1 개요

TCP/IP Gateway(이하 TCPGW 라 칭함)는 Tmax 서버와 Non Tamx 서버(리모트 노드라 칭함)간의 Interface 를 담당하는 Tmax 에서 제공되는 Gateway 이다. 이 TCPGW 는 Tmax 서버의 한 종류로써 TCP/IP 로 연결되어 있는 Unix/Windows 서버등과의 Gateway 역할을 한다.

TCPGW 는 Tmax 서버의 한 종류로서 Tmax 환경파일에 서버로 등록해야만 사용할 수 있다. 하지만 일반 다른 서버들을 만드는 방식과는 다르게 생성해 주어야 한다. 일반 서버는 TCS 나 UCS 용 서버 라이브러리를 이용하여 서버를 생성하나, TCPGW 는 외부와 통신을 담당하는 라이브러리(libtcpgw.a, libtcpgw.so)와 사용자가 작성한 프로그램(custom.c)과 Link 하여 서버를 생성한다.

Non Tmax 에서 보내온 메세지를 TCPGW 는 해당 서비스를 tpacall()하며, 서비스 결과는 처음 요청한 Non Tmax 서버로 전송한다. 반대로 Tmax 서비스에서 TCPGW 를 tpcall()이나 기타 다른 방식으로 서비스를 요청하면 TCPGW 는 Non Tmax 로 요청 메시지를 보낸 후 응답이 오면 자신을 call 한 서비스로 tpreturn()한다.

이와 같이 복잡하게 타 시스템과 TCP/IP 로 연결하기 위해 필요한 작업들, 예를 들어 socket 을 열고 메시지를 주고 받는 일 등은 모두 TCP/IP Gateway 에서 처리해 주고, 개발자는 업무 로직만을 작성하면 되므로 개발자들은 손쉽게 타 시스템과 연결할 수 있다.

TCPGW 의 대략적인 동작 구조는 다음과 같다.

Page 8: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 7

그림 1-1 TCPGW 동작 구조

TCPGW 는 위의 그림에서 보듯이 리모트 노드로부터 서비스 요청을 받아서 처리할 수 있고(그림 1-1 에서 실선 표시), Tmax 클라이언트는 서비스로부터 서비스 요청을 받아서 리모트 노드로 서비스 요청을 할 수도 있다(그림 1-1 에서 점선 표시). 이와같이 리모트 노드로 부터 서비스 요청을 받아서 처리하는 것을 OUTBOUND 서비스라 하고, Tmax 클라이언트로부터 서비스 요청을 받아서 리모트 노드로 서비스 요청을 하는 것을 INBOUND 서비스라 한다.

그림 1-2 동기 / 비동기 TCPGW 동작구조

Tmax 클라이언트나 서비스에서 TCPGW 를 바로 호출하고 응답이 올때까지 기다리는 동기적인 호출 방식(그림 1-2 에서 점선 표시)이 있다. 이와는 달리 비동기적인 호출 방식은 Tmax 클라이언트가 Tmax 서비스를 호출하면 그 서비스에서 TCPGW 로 제어권이 넘어가서 해당 서비스는 다른 서비스 요청을 받을 수 있게 되고, TCPGW 가 리모트 노드로부터

Page 9: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 8

응답을 받게 되면 응답을 처리하는 서비스로 요청을 넘겨주는 방식으로 동작하게 된다(그림 1-2 에서 실선 표시).

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

이러한 여러가지 유형에 맞추어 TCPGW 를 작성하기 위해서는 Tmax 환경을 적절히 설정하고 프로그램(custom.c, custom.h)을 작성해야 하므로 더 자세한 사항은 본 메뉴얼의 3 장. TCP/IP Gateway 의 구성과 4 장. 예제 에서 더 상세히 설명하도록 한다.

Page 10: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 9

2 TCP/IP Gateway 서비스의 유형

TCPGW 는 Tmax 에서 제공하는 라이브러리(libtcpgw.a, libtcpgw.so)와 개발자가 작성하는 custom.c, custom.h 를 함께 링크하여 만들어 진다. 이렇게 만들어진 TCPGW 는 리모트 노드와 통신을 하며, Tmax 클라이언트의 요청을 리모트 노드로 보내기도 하고 리모트 노드의 요청을 Tmax 서비스에서 처리하도록 중간역할을 해 준다.

TCPGW 는 크게 동작하는 방식에 따라 동기형 TCPGW 와 비동기형 TCPGW 로 나눌 수 있고, 기동하는 방법에 따라 서버 TCPGW 와 클라이언트 TCPGW 로 나눌 수 있다. 여기서 설명하는 서버와 클라이언트 모드는 리모트 노드와 TCPGW 사이에 연결시 어떤 쪽에서 먼져 연결을 시도하는지에 따른 모드이다. 일단 상대방과 연결되면 서버나 클라이언트 모드는 의미가 없다. 어느 쪽에서나 먼저 서비스를 요청할 수 있기 때문이다.

이제 이 4 가지의 TCPGW 의 서비스 유형에 대해서 설명하도록 한다.

2.1 동기형 TCPGW

여기서 설명하는 동기형 방식은 Tmax 의 클라이언트나 서버에서 서비스를 요청하고 응답이 서비스를 요청한 클라이언트나 서버로 오는 방식을 말한다. 반대로 리모트 노드에서 서비스를 요청하면 TCPGW 는 Tmax 의 서비스를 요청하고 그 결과를 서비스를 요청한 리모트 노드에 되돌려주는 방식이다. 전자인 경우 리모트 노드로 서비스를 요청한 Tmax 서비스가 블록되는가, 또는 블록되지 않는가에 따라 TCPGW 는 다르게 동작한다. 또한, 후자인 경우에는 리모트 노드에서 요청한 처리 결과를 돌려줄 때 요청한 채널로 돌려주는 방식이다.

Tmax 단의 클라이언트나 서버에서 리모트 노드로 동기형 방식으로 서비스를 요청할 경우에는 반드시 TCPGW 와 리모트 노드간에 UID(Unique Id.)를 서로 공유해야 한다.

Page 11: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 10

2.1.1 서비스 블록형 방식

이 방식은 Tmax 의 서버나 클라이언트에서 TCPGW 로 서비스를 요청하고, 그 결과가 올때까지 기다리는 가장 일반적인 방식이다. 아래 그림 처럼 Tmax 클라이언트의 요청을 받은 서비스에서 TCPGW 로 서비스로 tpcall 을 하면 리모트 노드에서 처리 결과를 송신할 때 까지 Tmax 서비스(SVC1)가 블럭되어 있게 된다.

그림 2-1 블록형 동기 TCPGW

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

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

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

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

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

Page 12: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 11

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

이와 같은 방식으로 TCPGW 를 동작시키게 되면 Tmax 클라이언트에서 호출한 Tmax 서비스는 TCPGW 를 호출한 후에 결과를 받을때 까지 블럭이 되어 있게 된다. (tpacall()을 한 경우도 tpgetrply()로 응답을 받는 곳에서 블럭이 되기 때문에 tpcall()과 마찬가지로 블럭이 되게 된다.) 따라서 많은 수의 요청을 받아들이기 위해서는 블럭이 되는 시간까지 감안하여 많은 수의 서버를 실행해야 한다. 이는 대외기관 통신에서는 대외기관의 장애(머신, 네트워크)에 따라서 많은 수의 서버가 필요로 하기 때문이다.

2.1.2 서비스 NON 블록형 방식

이 방식은 Tmax 클라이언트에서 직접 TCPGW 를 요청하는 방식에서는 사용할 수 없고, TCPGW 에 서비스를 요청하고 결과를 수신하는 서버를 중간에 두어서 처리하는 방식이다. 즉, TCPGW 앞에 송신 서비스와 수신 서비스를 두고 Tmax 클라이언트는 송신 서비스를 호출하고, 송신 서비스는 TCPGW 로 서비스를 forward 하고 서비스를 종료한다. TCPGW 는 리모트 노드로 서비스를 요청하여 그 결과를 수신하면, 해당 결과를 수신 서비스에게 전달한다. 수신 서비스는 TCPGW 로부터 결과를 수신받아 클라이언트에게 전달하면 서비스 사이클이 종료되는 방식이다. 결과적으로 클라이언트는 서비스를 요청하고 결과를 받는 동기방식이나 서버는 요청을 전달하고 종료하는 비동기방식 처럼 동작한다.

그림 2-2 NON 블록형 동기 TCPGW

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

Page 13: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 12

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

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

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

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

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

이와 같이 동작하는 TCPGW 는 블록형 방식에서 수행하는 방식보다도 적은 서버로도 많은 처리를 할 수 있다. 블록형 방식은 서비스가 TCPGW 를 호출하고 블록되기 때문에 동시에 많은 처리를 위해서는 보다 많은 서버 프로세스를 실행 해야하나, NON 블록형 방식에서는 자신의 일만 처리하고 서비스를 종료하기 때문에 적은 서버 프로세스로도 많은 일을 할 수 있다. 따라서 대외기간 간에 통신을 처리 하는 경우에는 NON 블록형 방식이 보다 효율적이라고 할 수 있다.

2.1.3 리모트 동기형 호출 방식

이 방식은 리모트 노드에서 TCPGW 로 먼저 서비스를 요청하는 방식이다. TCPGW 는 리모트노드에서 요청한 서비스를 호출하고 그 결과를 받아서 해당 서비스를 요청한 채널로 결과를 전송한다. 리모트 노드는 동시에 TCPGW 로 Tmax Config 에 정의되어 있는 MAXSACALL 개수를 초과하여 호출할 수 없다.

Page 14: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 13

그림 2-3 리모트 요청 동기형 TCPGW

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

TCPGW 는 tpacall()로 Tmax 서비스를 호출한다. 서비스 처리 결과를 TCPGW 는 받아서 메세지를 요청한 채널을 찾는다.

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

이와 같은 동작 방식은 리모트 노드에서 Tmax 단의 서비스를 호출하는 가장 보편적인 방식이다. TCPGW 는 리모트 노드의 채널 정보를 보관하였다가 서비스로 부터 결과를 수신받으면, 보관하고 있는 채널중에서 해당 채널을 찾아서 결과를 전송한다. 이때 해당 채널로 결과를 되돌려 주기전에 다른 요청은 얼마든지 가능하다. 즉, TCPGW 는 리모트 노드에서 요청한 채널은 블록시키지 않고 다음 요청을 받을 수 있도록 처리하기 때문에 TCPGW 를 어떻게 운영하는 방식에 따라서 다르게 처리할 수 있다.

2.2 비동기형 TCPGW

비동기형 호출 방식은 Tmax 단의 클라이언트나 서버, 또는 리모트 노드에서 TCPGW 서비스를 요청만 하고, 그 결과는 받지 않거나 또는

Page 15: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 14

서비스를 요청한 곳이 아닌 다른 프로그램에서 처리하는 방식을 말한다. 먼저 Tmax 단의 서비스에서 TCPGW 로 서비스를 요청하고 그 결과는 다른 서비스로 받을 수 있다. 그러나 클라이언트인 경우에는 비동기형으로 처리할때는 tpacall 로써 응답을 받지 않는 경우에만 가능하다. 반대로, 리모트 노드에서 서비스를 먼저 요청하는 경우에 위에서와 같이 서비스만 요청하고 결과를 받지 않을수도 있고, 서비스를 요청하고 결과는 다른 채널로 돌려주는 방식이 비동기형 방식이다.

2.2.1 TMAX 단에서 서비스 요청 방식

이 방식은 Tmax 단의 서비스에서 TCPGW 로 tpacall 에 TPNOREPLY 로 요청하고 해당 서비스는 종료한다. TCPGW 는 리모트 노드로 요청를 보내고 해당 결과가 수신되면 Tmax 단의 다른 서비스를 tpacall 에 TPNOREPLY 로 호출하여 결과를 처리하게 하는 방식이다.

그림 2-4 비동기형 TCPGW

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

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

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

Page 16: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 15

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

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

이 방식은 리모트 노드에서 먼저 서비스를 TCPGW 로 요청하면, TCPGW 는 tpacall 로 Tmax 서비스를 요청한다. Tmax 단의 서비스 처리가 완료되면 TCPGW 는 리모트 노드와 연결된 채널중에서 사용가능한 채널중 아무 채널에 처리 결과를 전송한다.

그림 2-5 비동기형 TCPGW

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

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

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

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

Page 17: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 16

2.3 서버 TCPGW

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

서버 TCPGW 는 TCPGW 에서 Listen 하고 있으면 리모트 노드에서 Connect 하게 된다. 서버 TCPGW 는 클라이언트 TCPGW 와 마찬가지로 리모트 노드와 Tmax 클라이언트 어디서든지 서비스 요청을 할 수 있다.

그림 2-3 서버 TCPGW

TCPGW 는 Tmax boot 시에 리모트 노드에서 연결할 수 있도록 연결을 기다리고 (listen 하고) 있는다.

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

2.4 클라이언트 TCPGW

클라이언트 TCPGW 는 리모트 노드에서 listen 하는 port 로 connect 를 맺으면서 기동된다. 서버 TCPGW 는 클라이언트 TCPGW 와 마찬가지로 리모트 노드와 Tmax 클라이언트 어디서든지 서비스 요청을 할 수 있다.

Page 18: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 17

그림 2-4 클라이언트 TCPGW

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

TCPGW 는 Tmax boot 시에 리모트 노드와 연결(connect)을 한다.

Page 19: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 18

3 TCP/IP Gateway 환경 설정

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

UNIX

Directory 파일명

lib libtcpgw.a, libtcpgw.so

libtmaxgw.a libtmaxgw.so

lib64 libtcpgw.a, libtcpgw.so

libtmaxgw.a libtmaxgw.so

Windows

Directory 파일명

bin tcpgw.dll tmaxgw.dll

lib tcpgw.lib tmaxgw.lib

위의 파일(TCPGW 라이브러리)들은 Tmax 인스톨시에 각 디렉토리 아래에 만들어 지지만 custom.c 나 custom.h 는 따로 제공되므로 필요시 기술지원 담당자에게 요청해야 한다.

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

Page 20: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 19

3.1 Tmax 환경 구성

TCPGW 를 사용하기 위해서는 Tmax 환경파일에 TCPGW 를 서버로서 등록 해야 한다. Tmax 서버중 UCS 형 서버와 등록 방법이 비슷한데, 차이점은 SVRTYPE 이 UCS 에서 CUSTOM_GATEWAY 라는 차이밖에 없다. 등록하는 방법은 아래와 같다.

*DOMAIN

tmax SHMKEY = 88000,

MINCLH = 1,

MAXCLH=1,

TPORTNO=8800

*NODE

tmax1 TMAXDIR="/home/tmax",

APPDIR="/home/tmax/appbin"

*SVRGROUP

svg1 NODENAME=tmax1

*SERVER

tcpgw SVGNAME=svg1,

MIN=1,

MAX=1,

7 CPC=10,

SVRTYPE=CUSTOM_GATEWAY,

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

*SERVICE

TCPGW1

TCPGW2 SVRNAME=tcpgw, SVCTIME=20

SVRNAME=tcpgw, SVCTIME=25

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

MIN : TCPGW의 프로세스 개수를 지정하는 항목으로써 이 항목의

값이 1보다 클 경우에 TCPGW가 서버 모드인지, 클라이언트 모

Page 21: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 20

드인지에 따라서 사용하는 포트번호가 다르다.

서버모드 MIN 값이 2 이상이면 두개 이상의 프로세스에서 같은

포트를 Listen 할 수 없으므로 TCPGW 는 아래에 설명하는

옵션중 “–P” 옵션으로 입력하는 포트번호에 자신의 서버

번호를 사용한다.

예를 들어 포트번호가 5050 이면 첫번째 프로세스는 5050 포트번호를, 두번째 프로세스는 5051 를 이런식으로 1 씩

증가되면서 프로세스 개수 만큼 포트를 사용한다. 그러므로

프로세스 수가 2 개 이상이면 지정한 프로세스 수 만큼

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

클라이언트 모드

클라이언트로 동작할 경우에는 세 가지 방식으로 사용할 수

있다.

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

포트로 연결하는 방식이다.

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

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

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

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

지정한 포트가 사용 가능해야 한다.

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

연결하는 방식으로 연결하고자 하는 리모트 노드의 정보를

별도의 파일에 등록하고 –f 옵션을 사용하여 해당 파일명을

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

클라이언트와 연결한다.

CPC : CPC 항목은 Tmax engine과 TCPGW간의 채널 수를 지정

하는 항목으로써, Tmax의 클라이언트나 서비스에서 리모트 노드

로 요청하는 경우에는 동시에 요청하는 수만큼 CPC 수를 지정해

Page 22: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 21

야 한다. 이 경우에도 NON 블록형인 경우에는 동시 요청 수만큼

지정할 필요가 없이 적당한 수만큼만 지정하면 된다. 반대인 경우

에는 TCPGW는 Tmax engine으로 tpacall로 요청하므로 많은 채

널을 사용할 필요는 없다.

CLOPT: 아래 설명 참조

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 주소를

따로 지정할 수 있다..

Page 23: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 22

r

TCPGW 가 클라이언트 모드로 동작할 경우 리모트 노드의 IP 주소를

지정하는 옵션이다.

이 옵션은 클라이언트 모드에서 백업 기능 및 멀티 서버 채널 정보

설정을 위해서 다음과 같이 문법이 강화되었다.

-r mainaddr[:mainport][/backupaddr[:backupport]][(type)][,...]

mainaddr, backupaddr 은 IP 주소이며, mainport, backupport 는 포트 번호

이다. type 은 I(IN CHANNEL), O(OUT CHANNEL), A(ANY CHANNEL) 로 설정할 수 있다. I 일 경우는 IN CHANNEL 이 -N 옵션으로

지정된 수 만큼 생성되며, O 일 경우는 OUT CHANNEL 이 -n 옵션으로 지정된 수 만큼 생성되고, A 일 경우는 IN CHANNEL 이

-N 옵션, OUT CHANNEL 이 -n 옵션으로 지정된 수 만큼 생성된다.

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

포트번호는 다른 프로세스에서 사용하지 않은 포트번호 이어야 한다. P

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

클라이언트 포트번호로도 사용할 수 있다.

p 리모트 노드가 Listen 하고 있는 포트번호를 설정한다. 해당

포트번호는 다른 프로세스에서 Listen 하지 않은 포트번호 이어야

한다.

M

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

옵션이다. “-R –P” 옵션으로 입력한 값은 서버 모드의 IP 주소와

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

“-M 0” 의미는 기본적인 TCPGW 의 모드 값이다. 그러나 “-M 1”로하면 서버 모드에서 클라이언트 모드로 변경된다. (Default: 0)

Page 24: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 23

m

TCPGW 와 통신하는 리모트 노드의 코드체계가 다를 경우에

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

경우에 사용자는 송수신 데이터의 map 파일을 등록해야 한다. 코드변환에 대해서는 아래의 설명을 참조 하십시오.(Default: 변환하지

않음)

N 리모트 노드에서 TCPGW 로 들어오는 채널 수를 지정하는 옵션이다. 이 옵션은 서버 모드나 클라이언트 모드에 관계없이 사용하는

옵션이다.

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

옵션은 TCPGW 가 클라이언트로 동작하는 경우에만 의미가 있다.

k

이 옵션은 사용자가 공유메모리를 확보하여 위에서 설명한 “-N –n”으로 주어진 채널의 상태를 사용자가 저장할 수 있도록

공유메모리의 키값을 입력하는 옵션이다. TCPGW 는 이 옵션으로

미리 공유메모리를 확보하지 않고 전적으로 사용자에게 전달하여

사용자가 임의로 사용하도록 전달하는 역할만 한다.

보통 이 옵션은 TCPGW 가 최초 실행시 사용자

Routine(init_remote_info)를 호출할 때 넘겨주어서 사용자가

공유메모리를 확보하는데 사용한다.

F

이 옵션은 특수 용도록 사용하는 옵션으로 CLOPT 항목의 옵션으로

위에서 설명한 IP 주소나 포트번호를 입력하지 않고 Config 파일에

등록하여 사용하는 옵션이다.

이 옵션은 특수 용도록 사용함으로 일반 사용자는 사용할 수 없다.

Page 25: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 24

f

이 옵션은 TCPGW 를 Client 로 사용하는 경우에 사용하는 옵션으로 –r –p 옵션이 하나의 리모트 노드의 ip 와 연결하는 것이라면 –f 옵션은

여러 리모트 노드와의 연결을 맺기 위한 옵션이다. 이 경우에

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

사용하여 해당 파일명을 지정하면 TCPGW 는 해당 파일의 정보를

로드하여 리모트 노드와 연결한다.

이 옵션은 –r, –p 옵션과 함께 사용할 수 없으며 또한 TCPGW 를

서버로 사용하는 경우에는 사용할 수 없다. 단지 클라이언트

모드에서만 사용 가능하다. 그리고 매 요청시마다 리모트 노드에

연결하는 –E 옵션도 사용할 수 없다. –f 옵션을 사용하면 리모트

노드와 항상 연결을 맺고 있어야 한다.

C

이 옵션은 TCPGW 가 클라이언트 모드로 동작하면서 동시에 같은

TCPGW 프로세스가 2 개 이상(MIN=2) 실행시 리모트 노드와

연결하는 포트번호를 지정하는 옵션이다. 이 옵션을 지정하면

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

포트번호로 리모트 노드에 연결을 시도한다.

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

첫번째 TCPGW 프로세스는 8080 포트번호를, 두번째 TCPGW 프로세스는 8081 포트번호를, 세번째는 8082 포트번호를 사용한다.

c

이 옵션은 리모트 노드와 통신시 TCPGW 로 들어오는 채널과 나가는

채널을 분리하여 사용하고자 하는 경우에 사용한다. 또는 이 옵션은

요청이 Tmax 단에서 리모트 노드로 발생할 경우에만 의미가 있다.

TCPGW 는 이 옵션이 지정되면 Tmax 단에서 들어온 요청을 나가는

채널로 전송한다. 그리고 리모트 노드로부터 나가는 채널로 데이터가

수신되면 이를 이전에 전송한 데이터의 ACK 응답으로 처리하고, 요청에 대한 응답은 들어오는 채널로 수신한다. 즉, TCPGW 와 리모트

노드 사이에 요청한 데이터에 대해서 잘 받았다는 ACK 정보를

주고받고자 하는 경우에 사용하는 옵션이다. 반대로 요청에 대한

ACK 는 보내지 않는다.

Page 26: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 25

S

이 옵션은 NON 블록킹 모드로 TCPGW 를 사용하거나 또는 비동기

방식으로 사용하고자 할 때 TCPGW 가 요청할 서비스명을 등록하는

옵션이다.

NON 블록킹 모드로 사용할 때 Tmax 단의 송신 서비스는 TCPGW 로

tpforward 하고, 리모트 노드에서 수신한 응답을 TCPGW 는 수신

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

서비스를 요청(tpacall with TPNOREPLY)하고 끝난다. 이 후에 리모트

노드에서 수신받은 응답은 일반적으로는 TPNOREPLY 로

호출했으므로 데이터를 버리게 되는데, 이 옵션에 서비스명을

지정하면 TCPGW 는 지정한 서비스에 tpacall 로 응답 데이터를

전달한다.

이 옵션으로 지정한 서비스는 반드시 등록되어있는 서비스명 이어야

한다.

H

이 옵션은 Tmax 클라이언트나 서비스와 TCPGW 사이에 사용자 정보

데이터를 주고 받고자 하는 경우에 사용한다. 이 옵션으로 지정한

데이터는 리모트 노드로 전송하지 않고 임시 TCPGW 에서

보관하였다가 응답이 수신되면 사용자 정보 데이터에 응답 데이터를

붙여서 호출한 서비스에게 전달하고자 하는 경우에 사용하다.

보통 이 옵션은 NON 블록킹 모드로 사용할 때, 송신 서비스와 수신

서비스가 분리되어 있어 송신 서비스에서 수신 서비스에게 데이터를

전달하고자 하는 경우에 많이 사용한다. (Default: 0)

h 위의 “-H” 옵션과 동일한 옵션이다. 위의 옵션은 동기 방식이나

비동기 방식 모두에 적용하는 옵션인데 반해 이 옵션은 단지

tpforward 에 tprelay 로 사용하는 호출에 대해서만 적용된다. (Default: 0)

Page 27: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 26

d

이 옵션은 리모트 노드에서 Tmax 단의 서비스를 호출하고 응답

데이터를 리모트 노드에 전송시 전송하는 채널을 선택하는 방법을

지정하는 옵션이다. 이 옵션을 지정하면 리모트 노드에서 요청한

응답은 반드시 요청한 채널에 전송하게 된다. 이 옵션을 지정하지

않으면 리모트 노드와 연결된 채널중 임의의 사용가능한 채널을

선택하여 전송한다. 이 옵션은 추후 확장을 위하여 임의의 값을 설정

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

무시된다.

E

이 옵션은 TCPGW 가 클라이언트 모드로 동작시 매 요청마다 채널을

연결하고 해제하고자 하는 경우에 사용한다. 이 옵션을 사용하면

리모트 노드와의 연결된 채널이 없기 때문에 리모트 노드에서 먼저

서비스를 요청할 수 없다. 또한 이 옵션을 사용하면 매번 채널이

연결되고 해제 되므로 처리 속도가 감소된다.

a

이 옵션은 TCPGW 를 비동기 통신 방식으로 사용하고자 할 때

사용하는 옵션이다.

위에서 설명한 것처럼 비동기 통신 방식은 서비스를 요청하고

종료하는 형태이다. 서비스에 대한 응답도 TCPGW 는 다른 서비스에

대한 요청으로 간주한다.

u

Tmax 클라이언트나 서비스에 TCPGW 로 리모트 노드에 서비스를

요청할 때 사용자가 채널을 지정할 수 있도록 사용하는 옵션이다. 이

옵션을 사용하기 위해서는 사용자는 “-k” 옵션을 사용하여 채널에

대한 상태 정보를 보관하고 있어야 한다. 만약 사용자가 지정한

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

Page 28: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 27

w

리모트 노드와 TCPGW 간의 통신시 둘 사이에는 많은 통신 장비나

또는 방어벽이 있을 수 있다. 이 경우에 특정 장비나 방어벽에 둘

사이의 채널이 일정시간 동안 사용하지 않으면 일방적으로 채널을

끊을 수 있다. 채널이 끊어진 경우 보통은 TCPGW 나 리모트 노드의

프로세스에서 이를 감지하여 채널을 다시 연결할 수 있으나, 그러나

끊어진 것을 감지하지 못하는 경우가 종종 발생한다. 이를 위해서

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

않으면 무조건 채널을 끊고 다시 연결을 맺도록 설정하고자 하는

경우에 사용하는 옵션이다.

Y

이 옵션은 리모트 노드에서 Tmax 단의 서비스를 요청한 이후에

서비스는 정상적으로 처리 되었으나 결과를 리모트 노드에 전송할 수

없는 경우, 이전에 처리한 서비스에 대해서 취소 처리를 할 수

있도록 복구 서비스를 지정하는 옵션이다. 즉, 리모트 노드에서 Tmax 단의 서비스를 호출한 이후에 리모트

노드와 세션이 모두 끊어지면 서비스 처리 결과는 리모트 노드로 전송하지 않고 버려지게

된다. 이 경

우에 서비스는 정상 처리 하였으나 리모트 노드 입장에서는 오류로

보기 때문에 문

제가 발생할 수 있다. 이런 경우에 사용자가 이 옵션에 서비스명을

지정하면

Gateway 는리모트로 결과를 전송할 수 없는 경우에 리모트 노드로

전송할 데이터를

지정한 서비스로 호출하게 된다.

Page 29: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 28

t

TCPGW 가 클라이언트 모드로 동작하는 경우에 TCPGW 는 먼저

리모트 노드와 연결을 맺게 되는데 만약 리모트 노드와 맺어진

연결이 끊어지거나 또는 연결이 맺어지지 않는 경우에 이 옵션을

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

다시 연결을 맺게 된다. 이럴 경우 잦은 리모트 노드와의 연결 시도

때문에 시스템에 부하가 발생하게 된다. 이를 해결하기 위해 리모트

노드와의 연결을 시도하는 시간 간격(초)을 정해 준 후 –t 옵션으로

이 시간을 지정해 주면 TCPGW 는 이 시간 간격으로 리모트

노드와의 연결을 시도하게 된다.

i 리모트 노드로부터 데이터 수신시 데이터의 끝을 나타내는 특정 문자

혹은 비트스트림이 존재할 경우에 필요한 옵션이다. 이 옵션을

지정하면 데이터 수신시 사용자의 chk_end_msg 가 호출된다.

x

채널 장애 여부 감지(TCP 레벨의 PING/PONG) 기능을 활성화 시킨다. 인자로 0 을 줄 경우(-x 0), 메인 채널 장애 복구가 감지되면 바로

메인 채널로 전환된다. 인자로 1 을 줄 경우(-x 1), 메인 채널 장애

복구가 감지 되더라도 안전한 시점(채널 비사용시)에 메인 채널로

전환된다. (Default: 0)

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

y UID 로 활용될 수 있는 메시지 번호(sequence number)의 최대값을

설정하는 옵션이다. 기본값은 50000 이며 최대 268435455 까지 지정

가능하다.

Page 30: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 29

3.1.2 서버/클라이언트 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 "

#서버 TCPGW 의 경우 ②

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

*SERVICE

TESTTCPGW SVRNAME=testtcpgw

위와 같이 환경파일을 작성한 경우 testtcpgw 라는 이름의 TCPGW 는 1 개가 Tmax boot 시에 boot 되게 된다. Testtcpgw 의 서비스명은 TESTTCPGW 이고 Timeout 값은 설정되어 있지 않으므로 무한 대기이다.

①은 TCPGW 는 클라이언트로 리모트 노드의 IP 주소는 168.126.185.131 이고, 리모트 노드의 Listen 포트번호는 5050 이 된다. testtcpgw 는 기동시에 리모트 노드와 5 개의 연결을 맺는다.

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

Page 31: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 30

-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"

*SERVICE

TESTTCPGW SVRNAME=testtcpgw, SVCTIME=30

위와 같이 환경파일을 작성한 경우 testtcpgw 라는 이름의 TCPGW 는 1 개가 Tmax boot 시에 boot 되게 된다. testtcpgw 의 서비스명은 TESTTCPGW 이고 Timeout 30 초이므로 30 초 이내에 응답이 없으면 Timeout 을 반환한다.

단, Timeout 은 Tmax 의 클라이언트나 서비스에서 리모트 노드로 요청한 것에 대해서만 Timeout 을 check 하고, 리모트 노드에서 요청한 서비스에 대해서는 요청한 해당 서비스에서 Timeout 을 설정해야 한다.

Page 32: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 31

첫째, 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

Page 33: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 32

TESTTCPGW SVRNAME=testtcpgw, SVCTIME=30

SENDSVC SVRNAME=sendsvr

RECVSVC SVRNAME=recvsvr

위와 같이 환경파일을 작성한 경우 testtcpgw 라는 이름의 TCPGW 는 1 개가 Tmax boot 시에 boot 되게 된다. testtcpgw 의 서비스명은 TESTTCPGW 이고 Timeout 30 초이므로 30 초 이내에 응답이 없으면 Timeout 을 반환한다.

Tmax 의 클라이언트나 서버에서 먼저 SENDSVC 서비스를 호출하면 SENDSVC 에서 사전 작업을 수행한 후에 TESTTCPGW 서비스로 컨트롤을 넘긴다.(tpforward). TCPGW 는 일단 Tmax engine 에 채널 해제 메시지를 전송한 후에 리모트 노드로 서비스를 요청하고, 서비스에 응답을 수신시 “-S” 옵션에 지정한 서비스로 결과를 전달(tprelay)한다. RECVSVC 는 처리 결과에 대한 작업을 수행후 리턴하면 원래 SENDSVC 를 호출한 클라이언트나 서비스에게로 응답이 전달된다. 이 방식을 사용하면 적은 수의 서비스(여기서는 SENDSVC)를 가지고 보다 많은 처리를 할 수 있다. 여기서도 블록형 처럼 반드시 UID 는 사용해야 한다.

리모트 노드의 응답이 지정한 시간(30 초)를 초과하면 TCPGW 는 Timeout 을 RECVSVC 에 전달(tprelay)한다. 그래서 RECVSVC 서비스에서는 반드시 tpurcode 값을 확인하여 값이 0 보다 크면 오류가 발생한 경우이므로 이에 대한 적절한 처리를 하여야 한다.

Timeout 뿐만 아니라 모든 오류에 대해서 tpurcode 에 값이 전달됨으로 오류의 종류는 부록에서 설명하는 오류코드 명세를 참조하기 바랍니다.

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

리모트 노드에서 요청하는 서비스에 대한 동기형 비동기형 구분은 “-d” 옵션을 사용하느냐에 따라서 결정되거나, 또는 사용자 정의 함수(get_msg_info)에서 flags 에 TPNOREPLY 를 설정하면 된다. 전자의 경우 “-d” 옵션을 사용하지 않으면 서비스에 대한 응답은 다른 채널로 전송될 수 있다. 후자인 경우에는 리모트 노드로 응답을 전송하지 않는다.

*DOMAIN

...

*NODE

Page 34: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 33

...

*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"

*SERVICE

TESTTCPGW SVRNAME=testtcpgw

“-d” 옵션을 지정하였을 경우에도 사용자 정의 함수(get_msg_info)에서 flags 에 TPNOREPLY 를 설정하면 서비스 응답은 리모트 노드에 전송되지 않는다.

리모트 노드에서 Tmax 의 서비스 요청시 TCPGW 는 tpacall 를 사용함으로 응답을 받지 않고 동시에 tpacall 를 사용할 수 있는 개수가 제한 되어있다(default 8 개). 동시에 요청이 8 개 이상인 경우에는 *DOMAIN 절에 MAXSACALL 개수를 적당하게 지정해야 한다.

3.1.6 재 연결 TCPGW 환경파일

보통 리모트 노드와 통신시 두 채널 사이에는 복잡한 통신 장비를 거쳐서 통신이 이루어지거나 또는 방어벽을 사이에 두는 경우가 많다. 이러한 경우에 둘 사이의 채널이 일정시간 동안 사용하지 않으면 통신 장비나 또는 방어벽에서 해당 채널을 끊어서 둘 사이에 통신이 이루어 지지 않는 경우가 발생한다. 이를 방지하기 위해 둘 사이에 일정간격으로 signal 를 주고 받을 수도 있으나 이를 위해서는 TCPGW 뿐만 아니라 상대방의 프로그램을 감안해야 하기 때문에 이 방법을 사용하지 않고 일정시간 동안 해당 채널을 사용하지 않으면 채널을 끊고 다시 연결하는 방법을 사용한다.

Page 35: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 34

*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.1.7 여러 리모트 노드와 연결을 맺는 클라이언트 TCPGW

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

*DOMAIN

...

*NODE

...

*SVRGROUP

...

*SERVER

testtcpgw SVGNAME=svg1,

Page 36: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 35

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

Page 37: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 36

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 인 경우)

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

Page 38: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 37

3.2.2 사용자 헤더 사용 방법

사용자 헤더는 여러가지 방법으로 사용할 수 있다. 사용자 헤더는 사용자가 임의로 사용할 수 있는 데이터이므로 여기서는 여러 사이트에서 사용하는 일반적인 방법을 설명한다.

tprelay 나 비동기 서비스명 지정

사용자 헤더에 NON 블록형 방식으로 사용할 경우 tprelay 될 서비스를 지정할 수 있다. 이 경우에 “-S”옵션으로 지정한 것보다 우선한다. 즉 사용자 헤더에도 서비스를 지정하고, “-S” 옵션으로 서비스를 지정하였을 경우 TCPGW 는 먼저 사용자 헤더에서 사용자 함수(get_service_name)를 호출하여 서비스를 찾고, 여기에서 서비스를 찾지 못한 경우 “-S” 옵션으로 지정한 서비스를 사용한다.

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

Key 데이터 보관

NON 블록킹 모드로 사용할 경우 송신과 수신 서비스로 분리되는데 송신 서비스에서 DB 에 적절한 작업을 처리하고 리모트 노드로 데이터를 전송하고 송신 서비스는 종료된다. 나중에 수신 서비스에서 송신 서비스에서 처리한 DB 의 Key 정보를 알고자 하는 경우나, 또는 수신 서비스에 리모트 노드에서 오류가 발생한 경우 DB 를 되돌려 놓기 위한 중요한 데이터를 보관하고자 하는 경우에 많이 사용한다.

3.3 Gateway 기타 기능

3.3.1 Gateway 헤더

TCPGW 는 Tmax 클라이언트나 서버에서 호출시 Gateway 헤더를 사용 할 수 있다. 이를 사용하기 위해서는 TCPGW 의 다른 라이브러리를 사용해야 한다. 보통은 (libtcpgw.a, libtcpgw.so)를 사용하나 Gateway 헤더를 사용하고자 하는 경우에는 libtcpgw.gwh.a 나 libtcpgw.gwh.so 를 사용해야 한다. Gateway 헤더는 모든 데이터 버퍼의 가장 처음 Offset 에 위치해야

Page 39: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 38

한다. 즉, 사용자 헤더를 사용할 경우에 Gateway 헤더 다음에 사용자 헤더가 와야한다.

Gateway 헤더는 여러가지 다 목적으로 사용하는데, TCPGW 에서는 여러 항목 중에서 svc 항목만 사용 가능하다. 이 항목은 NON 블록킹 모드로 사용하는 경우나 비동기 방식으로 사용할 때 응답 데이터에 대해 처리할 서비스명을 지정하고자 하는 경우에 사용한다. Gateway 헤더는 보통 사용자 헤더를 사용하지 않을 경우에 응답을 처리할 서비스를 메세지별로 처리하고자 하는 경우에 사용한다.

TCPGW 는 응답을 처리할 서비스를 찾는 순서는 가장 먼저 Gateway 헤더, 두번째는 사용자 헤더, 세번째는 “-S” 옵션으로 지정한 순서대로 찾는다.

3.3.2 다중 응답 처리

일반적인 TCPGW 처리 방식은 한번의 요청에 대해서 하나의 응답을 받는 형태이다. 그러나 때에 따라서 여러 번의 응답이 올 수 있는데 이를 처리하기 위해서 TCPGW 는 custom.c 의 get_msg_info 함수의 호출을 통해서 이를 처리한다. 여러 번의 응답이 오는 경우에 매번 get_msg_info 함수가 호출되는데, 사용자는 수신 받은 데이터가 마지막 데이터인지를 판단하여 적절한 값을 리턴 해주면 된다.

연속 데이터인 경우에 리턴값으로 3 을 리턴 해주면 TCPGW 는 다음 데이터가 있다고 판단하여 서비스를 요청한 클라이언트나 서비스에 응답을 주지않고 다음 데이터를 기다린다. 사용자는 마지막 데이터를 수신한 경우에 REPLY 값(1)를 리턴해 주면 TCPGW 는 이전에 저장한 데이터와 마지막 데이터를 서비스를 요청한 클라이언트나 서비스에 돌려준다.

3.3.3 서비스명을 찾는 순서

NON 블록형 TCPGW 나 또는 비동기형 TCPGW 인 경우 리모트 노드에서 온 요청이나 응답을 처리할 Tmax 의 서비스가 있어야 한다. TCPGW 는 이 서비스명을 알수가 없으므로 사용자가 적당한 서비스명을 지정해야 하는데 TCPGW 는 3 가지 방식으로 서비스명을 찾는다.

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

Page 40: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 39

첫째, Gateway 헤더를 사용할 경우에만 가능하다. Tmax 클라이언트나 서비스에서 TCPGW 를 요청할 때 Gateway 헤더에 서비스명을 넣어서 TCPGW 를 호출하면 TCPGW 는 가장 우선적으로 이 서비스명을 사용한다.

둘째, 사용자 헤더에서 서비스명을 찾는다. Tmax 클라이언트나 서비스에서 TCPGW 를 요청할 때 사용자 헤더에 서비스명을 넣은 후에 사용자 함수 get_service_name 에서 서비스명을 얻을 수 있다.

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

이와 같은 순서로 TCPGW 는 서비스명을 찾는다. 단, 리모트 노드에서 최초로 서비스를 요청할 경우에는 위의 방식을 따르지 않고 사용자가 get_msg_info 에서 서비스명을 지정해야 한다.

3.3.4 사용자 임의의 채널 지정

완전한 비동기 방식으로 TCPGW 를 구성한 경우에 사용자는 리모트 노드로 전송할 채널을 지정할 수있다. CLOPT 절에 “-a”를 사용한다. 완전한 비동기 방식은 서로간에 응답이 없다. 응답 데이터도 서비스 요청 형식으로 전달 되어야 한다. 예를 들어 Tmax 의 클라이언트나 서비스에서 TCPGW 로 tpacall 에 TPNOREPLY 로 호출하면 TCPGW 는 서비스 요청에 대한 UID 와 어떤 정보 데이터도 보관하지 않고 리모트 노드로 데이터를 전송하고 해당 서비스를 종료한다. 나중에 리모트 노드로부터 응답에 대한 메시지를 수신받았을 경우에도 이를 서비스 요청으로 처리한다. 반대인 경우에(리모트 노드에서 먼저 요청)도 동일하게 처리한다.

위와 같은 경우에 사용자는 리모트 노드로 전송할 채널번호를 지정할 수 있다. CLOPT 절에 “-u”옵션을 사용한다. 채널 지정은 두가지 경우가 있는데 첫째, Tmax 에서 먼저 서비스를 리모트 노드로 요청한 경우 TCPGW 는 get_channel_num 함수를 호출하는데 사용자는 전송 데이터를 분석하여 채널을 지정할 수 있다. 두번째는 리모트 노드에서 먼저 요청한 경우인데, 리모트 노드에서 서비스 요청시 get_msg_info 함수에서 리모트 노드에서 요청한 채널을 데이터에 보관하여 Tmax 서비스를 호출한다. Tmax 서비스는 결과를 리모트 노드로 전송하기 위해 tpacall 에 TPNOREPLY 로 다시 TCPGW 로 서비스를 보낸다. 사용자는 get_channel_num 에서 이전에 보관한 채널을 사용하여 리모트 노드로

Page 41: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 40

응답을 전송할 수 있다. 이 방식을 사용함으로써 TCPGW 와 Tmax engine 간의 채널이 블록되지 않고 서비스를 요청한 채널로 응답을 전송할 수 있다.

3.3.5 코드 변환

TCPGW 가 실행되는 Machine 는 모두 ASCII 코드(한글은 완성형)를 사용한다. 그러나 리모트 노드는 사용하는 코드가 다른 Machine 에 있어 이들과 메시지를 주고 받기 위해서는 코드를 일치시켜야 한다. 이러한 코드 변환은 리모트에서 할 수도 있고, 아니면 TCPGW 에서 할 수도 있다. TCPGW 는 모든 코드를 변환하지 않고 ASCII EBCDIC, 조합형

완성형 코드만을 서로 변환한다. TCPGW 에서 리모트 노드로 메시지를 전송하는 경우에는 ASCII 에서 EBCDIC, 완성형에서 조합형으로 코드를 변환하고, 리모트에서 수신하는 경우에는 EBCDIC 에서 ASCII, 조합형에서 완성형으로 코드를 변환한다.

TCPGW 는 코드 변환을 서비스 처리 단위별로 변환한다. 다시 말해, TCPGW 는 서비스 단위별로 송수신 Format 를 등록(Map 파일)하여 변환한다. 사용자는 TCPGW 와 리모트 노드간에 코드를 변환하려면 모든 서비스에 대해서 Map 파일을 등록해야 한다.

또한 TCPGW 에서 코드변환 기능을 이용하려면 반드시 Gateway 헤더를 사용해야만 한다. 왜냐하면 리모트로 전송하는 서비스에 대해서 TCPGW 는 서비스명을 알 수가 없으므로 Gateway 헤더를 사용하여 TCPGW 에 리모트 서비스명을 전달해야 하기 때문이다. Gateway 헤더중 pgmname 항목에 리모트 서비스명을 주고, TCPGW 는 이 항목의 값으로 Map 파일을 로드하여 코드를 변환한다.

TCPGW 는 Tmax 클라이언트나 서비스에서 리모트로 서비스 요청시에는 Gateway 헤더의 pgmname 항목의 값으로 Map 파일을 로드하고, 리모트 노드에서 Tmax 로 서비스를 요청하는 경우에는 get_msg_info 함수에서 지정한 서비스명으로 Map 파일을 로드한다.

여기서는 사용자가 Map 파일을 등록하는 방법에 대해서 설명한다. Map 파일은 사용자가 텍스트 파일로 지정한 형식에 맞게 등록해주면 된다.

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

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

*COMMSIZE

Page 42: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 41

1024

*INPUT

#---------------------------------------------------------------

# item-name length data-type

# data-type: CHAR, NUMERIC(UNPACK), KOREAN, BINARY, USER-TYPE

#---------------------------------------------------------------

a 10 CHAR

b 10 KOREAN

c 5 NUMERIC

d 10 BINARY

*OUTPUT

a 10 CHAR b 10 KOREAN

c 5 NUMERIC

d 10 BINARY e 3 USER1 e1 6 CHAR e2 10 KOREAN /e3 8 BINARY

COMMSIZE

이 항목은 리모트 노드와 송수신하는 데이터의 길이를 지정하는 항목이다. 이 항목은 모든 서비스 메시지(송수신 포함)중 가장 큰 메시지의 길이를 입력해야 한다.

INPUT

이 항목은 TCPGW 에서 리모트 노드로 전송하는 메시지에 대해서 등록하는 항목이다. TCPGW 에서 리모트 노드로 서비스를 요청하는 경우에 이 항목에 리모트 노드로 요청하는 메시지의 Format 를 등록하고, 반대로 리모트 노드에서 Tmax 로 서비스를 요청하는 경우에는 Tmax 서비스의 처리 결과에 대한 Format 을 등록한다.

OUTPUT

Page 43: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 42

이 항목은 리모트 노드에서 TCPGW 로 수신받은 메시지에 대해서 등록하는 항목이다. TCPGW 에서 리모트 노드로 서비스를 요청하는 경우에는 리모트 노드에서 처리한 결과를 수신받는 메시지의 Format 를 등록하고, 반대로 리모트 노드에서 Tmax 로 서비스를 요청하는 경우에는 Tmax 로 서비스를 요청하는 메시지에 대해서 Format 을 등록한다.

항목명

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

항목 길이

송수신 데이터의 각 항목의 실제 길이를 나타낸다. 각 항목의 길이만 표현하면 TCPGW 내부에서 Offset 로 변환하여 사용한다. Offset 는 항상 0 부터 시작한다.

데이터 타입

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

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

NUMERIC : 이 타입은 데이터가 숫자만을 나타내는 경우이다. 이 타입의 코드 변환은 CHAR 타입과 동일하게 코드를 변환한다. 타입 NUMERIC 라 해서 Integer 를 나타내는 것은 아니다.

KOREAN: 이 타입의 데이터는 모두 한글을 경우에 사용한다. TCPGW 는 이 타입의 데이터는 항상 2 Bytes 단위로 코드를 변환한다. CHAR 에서 한글이 포함된 경우에 한글과 다른 코드(영문자, 숫, 특수문자) 사이에 한글의 시작과 끝 문자가 포함되는데 반해 이 타입의 데이터는 모두 한글 문자로 인식하기 때문에 처음과 끝에만 한글 시작과 끝 문자가 포함된다.

Page 44: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 43

BINARY: 이 타입의 데이터는 코드를 변환하지 않는다. 사용자는 데이터중 코드를 변환하지 않고자 하는 경우에는 이 타입으로 지정하면 된다.

USER-TYPE: 이 타입의 데이터는 Array 형식의 데이터 타입을 지정하고자 할 경우에 사용한다. 예를 들어 화면에 여러 개의 항목이 반복하서 여러번 나올 경우에 각 항목을 반복 횟수 만큼 등록해야 하는 번거로움이 있다. 또는 반복 횟수를 데이터로 표현하는 경우에는 몇번의 반복이 되는지를 알 수 없어 코드변환이 어렵다. 이를 위해서 사용자는 사용자 정의 타입을 지정하여 Array 형태의 데이를 쉽게 변환할 수 있다.

위의 Map 파일에서 USER1 는 사용자가 지정한 사용자 정의 타입이다. 타입 이름은 사용자가 임의로 지정하면 된다. 사용자 정의 타입의 데이터는 Array 데이터의 반복을 나타내는 항목이므로 반드시 숫자로 이루어져야 한다. TCPGW 는 사용자 정의 타입을 만나면 이를 Array 의 횟수로 인식한다.

Array 의 끝은 마지막 항목의 이름을 ‘/’로 시작하면 된다. 위의 경우에는 e1, e2, e3 을 Array 항목으로 인식해서 e 항목으로 지정한 횟수 만큼 코드를 변환한다.

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

3.4 TCP/IP Gateway 사용자 프로그램(custom.h, custom.c)

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

먼저 custom.h 에서 해야 할 일은 msg_header_t 구조체를 TCPGW 를 사용하고자 하는 목적에 맞게 수정하는 일이다. TCP/IP 는 가변 길이의 데이터를 처리하기가 곤란하다. 왜냐하면 데이터의 끝을 알수가 없으므로 언제 데이터 수신을 종료해야 할지 모르기 때문이다. 그래서 TCPGW 는 msg_header_t 구조체를 사용하여 리모트 노드와 메세지 헤더를 설정하여 실 데이터의 길이를 구할 수 있는 구조로 되어 있다. 이 구조체의 정보는

Page 45: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 44

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 절에 등록된 이름과 동일해야한다.

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

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

int msgtype;

int channel_id;

} msg_info_t;

Page 46: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 45

이 구조체는 TCPGW 라이브러리 내부와 사용자가 수정해야 하는 custom.c 파일의 함수에서 사용된다. custom.c 파일에서는 리모트 노드로부터 메시지를 수신한 직후 불리우는 get_msg_info() 함수에서 이 구조체에 값을 적절히 설정을 해야 한다. 또한 리모트 노드로 메시지를 송신하기 직전에 불리우는 함수인 put_msg_info() 함수에서 이 구조체의 값으로 리모트 노드로 송신한 데이터를 적절히 구성해야 한다. get_msg_info()와 put_msg_info()의 수정사항에 대한 좀 더 자세한 내용은 3.4.2 custom.c 수정에서 설명하도록 한다.

또한 custom.h 에는 리모트 노드와 TCPGW 사이에서 메세지 헤더 데이터 구조를 정의해 주어야 한다. TCPGW 에서 일반적으로 사용되는 메세지 헤더(msg_header_t) 구조체는 다음과 같다

typedef struct msg_header {

int length;

} msg_header_t;

3.4.2 custom.c 수정

custom.c 는 개발자가 리모트 노드와 TCPGW 가 통신하기 위해 구현해야 하는 것으로 TCPGW 라이브러리(libtcpgw.a, libtcpgw.so)와 함께 컴파일해서 사용해야 한다.

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

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

변수명 : msg_header_size

설 명 :

이 변수는 라이브러리 내부에서 사용자가 정의한 메시지 헤더의 사이즈로 인식되어 사용된다. 따라서 이 변수는 아래의 사용법처럼 사용자 정의 메시지 헤더 사이즈로 설정해 주어야 한다.

Page 47: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 46

사용법 :

int msg_header_size = sizeof(msg_header_t);

변수명 : comm_header_size

설 명 :

이 변수는 만약 msg_header_size 가 0 으로 설정된 경우 이 변수가 msg_header_size 와 같은 용도로 쓰이게 된다. 만약 msg_header_size 변수와 함께 정의가 된 경우는 msg_header_size 값을 사용하게 된다.

사용법 :

int comm_header_size = 0;

또한 custom.c 에는 아래와 같은 함수를 구현해 주어야 한다.

함수명 : init_remote_info

설 명 :

이 함수는 리모트 노드와 연결을 맺기에 앞서 호출된다. 즉 TCPGW 가 자신의 초기화 작업을 마친후에 곧바로 호출되는 함수이다. 이 함수는 한번만 호출된다. Tmax 환경파일의 CLOPT 절에 –k 옵션으로 공유메모리 키를 설정한 경우 연결에 대한 정보등을 저장하기 위해 공유메모리를 생성하는 로직을 구현할 수 있다. 이 부분은 경우에 따라 내부 로직을 구현하지 않아도 된다.

사용법 :

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

myname TCPGW 서버명이다.

mynumber 같은 TCPGW 가 동시에 여러개 실행될 경우에 각각의

프로세스를 구분할 수 있는 TCPGW 프로세스 번호이다.

Page 48: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 47

이 값은 0 부터 시작한다.

num_channel TCPGW 가 연결하고 있는 max 채널 수이다.

Tmax 환경파일에 -n, -N 옵션으로 설정한 값의 합이다.

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

값이다.

함수명 : remote_connected

설 명 :

이 함수는 리모트 노드와 연결을 맺은 후 호출되는 함수이다. 만약 리모트 노드와 연결을 맺은 후 해야할 작업이 있다면 이 함수에서 하도록 한다. 이 함수는 채널 수 만큼 호출된다. 또한 도중에 채널이 해제되었다가 다시 연결될 때도 호출된다.

사용법 :

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

index TCPGW 가 -n 또는 -N 옵션으로 여러개의 channel 을

연결하고 있는 경우 각각의 채널에 대한 자신의

index 값이다.

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

type 리모트 노드와 연결된 채널 타입이다. IN_CHANNEL 또는 OUT_CHANNEL 인지를 나타낸다.

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

Page 49: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 48

함수명 : remote_closed

설 명 :

이 함수는 리모트 노드와 연결을 종료한 후 호출되는 함수이다. 만약 리모트 노드와 연결이 끊어진 후에 해야할 작업이 있다면 이 함수에서 하도록 한다. init_remote_info 함수에서 shared memory 를 생성하는 로직을 구현한 경우 이 함수에서 해제하는 작업 로직을 구현한다. 이 함수도 채널 수 만큼 호출된다.

사용법 :

int remote_closed(int index, int type)

index TCPGW 가 -n 또는 -N 옵션으로 여러 개의 채널을

연결하고 있는 경우 각각의 채널에 대한 자신의

index 값이다.

type 리모트 노드와 연결된 채널 타입이다. IN_CHANNEL 또는 OUT_CHANNEL 인지를 나타낸다.

함수명 : get_msg_length

설 명 :

이 함수는 리모트 노드으로 부터 요청이나 응답이 도착하여, 해당 채널에서 msg_header_t 부분만을 recv(msg_header_size 또는 comm_header_size 에서 지정한 값 만큼을 읽는다.)한 후 호출하는 함수로 여기에서 return 된 값만큼, 실 데이터를 다시 read 하게 된다.

사용법 :

int get_msg_length(msg_header_t *hp)

hp 개발자가 custom.h 에 정의할 수 있는 msg_header_t 구조체의 포인터이다. 일반적으로, 해당 채널로 부터

Page 50: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 49

데이터를 읽는 경우, 정해진 헤더의 크기 만큼 데이터를

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

얻어서 이를 바탕으로 다음 실 데이터를 읽을 수

있도록 되어있다.

이 hp 는 TCPGW 가 리모트 노드로 부터 읽은 헤더

데이터를 넘겨준다.

리턴값 :

리모트 노드로부터 실 데이터의 길이를 리턴한다. 이 함수의 리턴값으로 TCPGW 는 실 데이터를 리모트 노드에서 읽게 된다.

함수명 : get_msg_info

설 명 :

이 함수는 리모트 노드으로 부터 요청이나 응답이 도착하여 데이터를 읽은 후 이 데이터를 Tmax 서비스 프로그램으로 다시 요청이나 응답를 전송하기 전에 해당 데이터 값을 가공하거나, 정보전송을 위한 여러 정보(uid, len, flags, service 명등)들을 TCP/IP Gateway library 와 custom.c 와의 interface 역할을 하는 info 를 참조, 또는 가공하는 함수이다.

사용법 :

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

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

포인터이다.

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

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

info TCP/IP Gateway library(libtcpgw.a, libtcpgw.so)와custom.c 와 interface 역할을 해주는 structure 구조이다.

사용자가 수신 받은 데이터를 기초로 해서 info

Page 51: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 50

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

리턴값 :

Tmax 서비스로 보낼 type 을 정의한다. TCPGW 는 이 값을 바탕으로 Tmax 로 어떤 처리를 할 것인지를 판단한다. 예를 들어, REMOTE_REQUEST 는 리모트 노드로 부터 Request 가 발생한 것으로 판단하며, REMOTE_REPLY 는 Tmax 서비스로 부터 Request 가 발생하여 리모트 노드로 부터 Response 가 오는 경우 리턴하는 값이다. REMOTE_REPLY_CONT 는 Response 메시지가 이어서 올 경우 리턴하는 값이며, REMOTE_SENDTOCLI 는 비요청 메시지일 경우 리턴하는 값이다.

리모트 노드로부터 응답을 수신한 경우에는 반드시 UID 값을 info 구조체의 uid 항목에 지정해 주어야 한다. 그리고 기타 다른 값들 상황에 맞게 주어야 한다.

함수명 : get_channel_num

설 명 :

Tmax 서비스나 클라이언트로부터 요청한 데이터를 리모트 노드에 전송할 때 사용자가 채널을 선택할 수 있도록 하는 함수이다. 사용자는 주어진 데이터의 특성에 따라서 전송할 채널을 지정할 수 있다. 단 여기서 지정하는 것은 리모트 노드와 연결된 socket 번호가 아니라 단순한 채널 번호이다. TCPGW 는 사용자가 지정한 채널을 사용할 수 없으면 오류를 반환한다.

사용법 :

int get_channel_num(char *data)

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

리턴값 :

채널 번호를 반환한다.

Page 52: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 51

함수명 : 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

설 명 :

Page 53: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 52

이 함수는 리모트 노드로 메시지를 전송한 후에 호출되는 함수이다. 데이터가 완전히 리모트 노드에 전송되었다는 것을 알려주기 위해서 호출되는 함수이다.

사용법 :

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

hp 리모트 노드로 보낸 메시지의 헤더이다.

data 리모트 노드로 보낸 데이터이다.

info 리모트 노드로 보낸 데이터의 정보이다.

함수명 : get_service_name

설 명 :

Tmax에서 리모트 노드로 요청을 보낼때 요청을 보내는 서버와 결과를 받

는 서버를 달리하는 NON 블록형이나 비동기형 TCPGW를 구성하는 경우,

tpreply()나 tpacall()을 할 서비스의 이름을 오류코드에 따라서 설정한다.

사용법 :

int get_service_name(char *header, int err, char *svc)

header -H 또는 -h 옵션으로 설정한, TCPGW 에서 저장하고 있는

사용자 헤더의 포인터이다.

err 오류코드이다.

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

Page 54: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 53

함수명 : prepare_shutdown

설 명 :

이 함수는 이 TCPGW가 종료하기 직전에 call되는 함수로서, 일반적으로

init_remote_info()함수에서 생성한 공유메모리를 해제하는 일 등을 이 함수

에서 한다.

사용법 :

int prepare_shutdown(int code)

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

함수명 : set_service_timeout

설 명 :

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

사용법 :

int set_service_time_out(int uid, char *header)

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

header 서비스 타임 아웃이 발생한 거래의 header

함수명 : chk_end_msg

설 명 :

Page 55: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 54

이 함수는 리모트 노드로부터 데이터 수신시 데이터의 끝을 나타내는 특정 문자 혹은 비트스트림이 존재할 경우 사용자가 호출할 수 있는 함수이다.

사용법 :

int chk_end_msg(int len, char *data)

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

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

함수명 : inmsg_recovery

설 명 :

이 함수는 리모트 노드로 부터 요청을 tpacall(..., TPBLOCK)로 처리했을 경우 서버가 떠 있지 않으면 에러가 돌아 오게 되는데, 이러한 때에 호출된다. 사용자는 함수 내에서 적당히 새로운 데이터를 만들고, 데이터의 크기를 반환한다.

사용법 :

int inmsg_recovery(char *data, msg_info_t *info)

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

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

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

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

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

info->err : 에러시 tperrno

Page 56: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 55

info->uid : 이전 get_msg_info() 시에 생성되었던 UID 값

리턴값 :

사용자는 이 함수에서 새로운 데이터의 길이를 반환해야 한다. 데이터의 길이가 0 보다 클 경우, info->svc 에 값이 존재하면 해당 서비스로 tpacall(..., TPNOREPLY) 하고, 그 외에는 리모트 노드로 응답을 보낸다. 데이터의 길이가 음수일 경우 데이터를 버린다.

함수명 : outmsg_recovery

설 명 :

이 함수는 리모트 노드로 요청을 보낼 때 에러가 발생할 경우 호출된다. 사용자는 함수 내에서 적당히 새로운 데이터를 만들고 원하는 서비스 이름 및 UID 등을 설정하고, 데이터의 크기를 반환한다.

사용법 :

int outmsg_recovery(char *data, msg_info_t *info)

data 리모트 노드로 보낼 데이터이다.

info 리모트 노드로 보낼 데이터의 정보이다.

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

info->len : 데이터 길이

info->uid : TCPGW 가 임의로 생성한 UID 값

info->msgtype : 1000 이상이면 외부로 응답을 보내다

에러 발생

1000 미만이면 외부로 요청을 보내다

에러 발생

Page 57: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 56

info->err : TPECLOSE 이면 응답을 기다리다 채널이

끊어진 경우

그 외에는 요청을 보내려다 에러가 발생한 경우

리턴값 :

사용자는 이 함수에서 새로운 데이터의 길이를 반환해야 한다. 데이터의 길이가 0 보다 클 경우, info->svc 에 값이 존재하면 해당 서비스로 tpacall(..., TPNOREPLY) 하고, 그 외에는 info->msgtype 이 1000 이상이면 데이터를 버리고 info->msgtype 이 1000 미만이면 데이터를 call 한 쪽으로 되돌려 준다.

함수명 : get_extmsg_info

설 명 :

이 함수는 get_msg_info 와 기본적으로 기능은 동일하다. 단, 데이터 버퍼를 더블 포인터형으로 넘겨서 사용자가 버퍼의 메모리를 재할당(realloc) 할 수 있다. 이 함수는 get_msg_info 와 동시에 사용될 수 없으며, 사용을 위해서는 TCPGW 컴파일시 -D_TCPGW_USE_EXTMSG 플래그를 설정해야 한다.

사용법 :

int get_extmsg_info(msg_header_t *hp, char **data, int asize, msg_info_t *info)

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

포인터이다.

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

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

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

Page 58: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 57

크기이다.

info TCP/IP Gateway library(libtcpgw.a, libtcpgw.so)와custom.c 와 interface 역할을 해주는 structure 구조이다.

사용자가 수신 받은 데이터를 기초로 해서 info 구조체의 항목에 각종 정보를 이 함수에서 설정한다.

리턴값 :

Tmax 서비스로 보낼 type 을 정의한다. TCPGW 는 이 값을 바탕으로 Tmax 로 어떤 처리를 할 것인지를 판단한다. 예를 들어, REMOTE_REQUEST 는 리모트 노드로 부터 Request 가 발생한 것으로 판단하며, REMOTE_REPLY 는 Tmax 서비스로 부터 Request 가 발생하여 리모트 노드로 부터 Response 가 오는 경우 리턴하는 값이다. REMOTE_REPLY_CONT 는 Response 메시지가 이어서 올 경우 리턴하는 값이며, REMOTE_SENDTOCLI 는 비요청 메시지일 경우 리턴하는 값이다.

리모트 노드로부터 응답을 수신한 경우에는 반드시 UID 값을 info 구조체의 uid 항목에 지정해 주어야 한다. 그리고 기타 다른 값들 상황에 맞게 주어야 한다.

함수명 : put_extmsg_info

설 명 :

이 함수는 put_msg_info 와 기본적으로 기능은 동일하다. 단, 데이터 버퍼를 더블 포인터형으로 넘겨서 사용자가 버퍼의 메모리를 재할당(realloc) 할 수 있다. 이 함수는 put_msg_info 와 동시에 사용될 수 없으며, 사용을 위해서는 TCPGW 컴파일시 -D_TCPGW_USE_EXTMSG 플래그를 설정해야 한다.

사용법 :

int put_extmsg_info(msg_header_t *hp, char **data, int asize, msg_info_t *info)

Page 59: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 58

hp 리모트 노드로 보낼 메시지의 헤더이다.

data 리모트 노드로 보낼 데이터 버퍼의 주소값이다.

asize 리모트 노드로 보낼 데이터 버퍼에 할당된 메모리

크기이다.

info 리모트 노드로 보낼 데이터의 정보이다.

리턴값 :

사용자는 이 함수에서 실제적으로 리모트 노드에 전송할 데이터의 전체 길이를 반환해야 한다. 즉 메시지 헤더와 실 데이터를 더한 길이를 반환한다.

함수명 : set_ping_msg

설 명 :

이 함수는 채널 장애 감시를 위해서 보내어질 메시지 설정 및 주기, 타임아웃 등 을 설정할 수 있는 사용자 함수 이다. –x 옵션을 지정할 경우 반드시 설정해 주어야 한다.

사용법 :

int set_ping_msg(msg_header_t *hp, int *interval, int *binterval, int *timeout, int *mode)

hp 채널 장애 감시를 위해서 주기적으로 보내지는

메시지이다. 사용자는 이 메시지를 설정해야 한다.

interval 채널 장애 감시 주기이다. (단위: 초)

0 일 경우, 채널 장애 감지 기능은 비활성화 된다.

Page 60: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 59

binterval 백업 채널 모드일 때, 메인 채널의 상태를 체크

주기이다. (단위: 초)

0 일 경우, 메인 채널의 상태 체크 기능은 비활성화

된다.

timeout 채널 장애 감시 타임아웃이다. 타임 아웃 내에 응답이

오지 않으면 채널은 끊어진다. (단위: 초)

0 일 경우, PING 메시지만 보내고 PONG 메시지에

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

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

리턴값 :

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

함수명 : chk_pong_msg

설 명 :

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

사용법 :

int chk_pong_msg(msg_header_t *hp)

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

리턴값 :

Page 61: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 60

채널 장애 감시 응답 메시지이면서 정상적일 경우 양수 값을 반환하며, 비정상적일 경우 음수 값을 반환한다. 채널 장애 감시 응답 메시지가 아닐 경우는 0 을 반환한다. 음수 값을 반환할 경우, 채널은 끊어진다.

이 절에서 설명한 함수들의 사용 예제는 4 장. 예제에서 설명하도록 한다.

3.4.3 register.c 수정

사용자 함수 등록 파일로서, 사용자가 등록한 함수들만 게이트웨이 라이브러리에서 호출된다. 게이트웨이 컴파일 시, 반드시 register.c 를 포함 시켜야 한다. 사용하지 않는 함수는 NULL 등록하면 된다.

<register.c>

#include <stdio.h>

#include "custom.h"

extern int init_remote_info(char *myname, int mynumber, int

num_channel, int key);

extern int prepare_shutdown(int code);

extern int remote_connected(int index, int addr, int portno, int

type, int fd);

extern int remote_closed(int index, int type);

extern int get_msg_length(msg_header_t *hp);

extern int get_msg_info(msg_header_t *hp, char *data, msg_info_t

*info);

extern int put_msg_info(msg_header_t *hp, char *data, msg_info_t

*info);

extern int put_msg_complete(msg_header_t *hp, char *data,

msg_info_t *info);

extern int get_channel_num(char *data);

extern int get_service_name(char *header, int err, char *svc);

extern int set_service_timeout(int uid, char *header);

extern int get_msg_security(char **data, int asize, int len);

extern int put_msg_security(char **data, int asize, int len);

Page 62: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 61

extern int chk_end_msg(int len, char *data);

extern int get_extmsg_info(msg_header_t *hp, char **data, int

asize, msg_info_t *info);

extern int put_extmsg_info(msg_header_t *hp, char **data, int

asize, msg_info_t *info);

extern int inmsg_recovery(char *data, msg_info_t *info);

extern int outmsg_recovery(char *data, msg_info_t *info);

extern int set_ping_msg(msg_header_t *hp, int *interval, int

*bintrval, int *timeout, int *mode);

extern int chk_pong_msg(msg_header_t *hp);

/***************************************************************

* int

* _register_custom()

*

* returns no used

* [function number]

* 1. init_remote_info

* 2. prepare_shutdown

* 3. remote_connected

* 4. remote_closed

* 5. get_msg_length

* 6. get_msg_info

* 7. put_msg_info

* 8. put_msg_complete

* 9. get_channel_num

* 10. get_service_name

* 11. set_service_timeout

* 12. get_msg_security

* 13. put_msg_security

* 14. chk_end_msg

* 15. get_extmsg_info

* 16. put_extmsg_info

* 17. inmsg_recovery

* 18. outmsg_recovery

* 19. set_ping_msg

* 20. chk_pong_msg

Page 63: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 62

***************************************************************/

int

_register_custom()

{

_tcpgw_regfn(1, init_remote_info);

_tcpgw_regfn(2, prepare_shutdown);

_tcpgw_regfn(3, remote_connected);

_tcpgw_regfn(4, remote_closed);

_tcpgw_regfn(5, get_msg_length);

_tcpgw_regfn(6, get_msg_info);

_tcpgw_regfn(7, put_msg_info);

_tcpgw_regfn(8, put_msg_complete);

_tcpgw_regfn(9, get_channel_num);

_tcpgw_regfn(10, get_service_name);

_tcpgw_regfn(11, set_service_timeout);

_tcpgw_regfn(12, get_msg_security);

_tcpgw_regfn(13, NULL);

_tcpgw_regfn(14, chk_end_msg);

_tcpgw_regfn(15, NULL);

_tcpgw_regfn(16, NULL);

_tcpgw_regfn(17, NULL);

_tcpgw_regfn(18, NULL);

_tcpgw_regfn(19, NULL);

_tcpgw_regfn(20, NULL);

return 1;

}

Page 64: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 63

4 예제

본 장에서는 2 장에서 설명한 TCPGW 의 각 역할에 대한 예제에 대해 설명하도록 한다.

4.1 OUTBOUND TCPGW 예제

4.1.1 개요 및 프로그램 내용

TCPGW 가 Tmax 기동시에 boot 되어 있다가 리모트 노드의 요청이 수신되면, 사용자가 지정한 서비스를 호출한 후에 다시 리모트 노드로 처리 결과를 주는 예제이다. TCPGW 의 클라이언트/서버 방식에 관계가 없다. 그리고 리모트 노드의 상황에 맞게 custom.c 를 수정하여 TCPGW 를 구성한다.

그림 4-1 OUTBOUND TCP/IP Gateway

Page 65: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 64

4.1.2 프로그램 구성

Config file : tcpgw.m

TCPGW : custom.c, custom.h

Server : svr.c

Remote Node : rclient.c, custom.h

<tcpgw.m>

*DOMAIN

res SHMKEY = 88000,

MINCLH = 1,

MAXCLH = 1,

TPORTNO = 8888

*NODE

node1 TMAXDIR="/home/tmax",

APPDIR="/home/tmax/appbin"

*SVRGROUP

svg1 NODENAME = node1

*SERVER

tcpgw SVGNAME = svg1,

MIN = 1, MAX = 1,

CPC = 5,

SVRTYPE = CUSTOM_GATEWAY,

CLOPT = "-- -P 5050 -N 2 –d 0"

svr SVGNAME = svg1,

MIN = 1, MAX = 1

*SERVICE

TOUPPER SVRNAME = svr

Page 66: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 65

<custom.h>

#ifndef _CUSTOM_H_

#define _CUSTOM_H_

/* ----------------------------------------------------------------

---- */

/* Fixed structures and macros */

#define MSG_MAGIC "Tmax"

#define REMOTE_REQUEST 0

#define REMOTE_REPLY 1

#define SVC_NAME_LENGTH 20

/* 이 msg_info_t 는 개발자가 재정의하면 안되는 구조체 이다. */

typedef struct msg_info {

char svc[SVC_NAME_LENGTH];

int err;

int len;

int uid;

int flags;

int msgtype;

int channel_id;

} msg_info_t;

/* ----------------------------------------------------------------

---- */

/* Modifiable structures and macros */

/* 이 msg_header_t 와 msg_body_t 는 개발자가 재정의 가능한 구조체 이다. */

typedef struct msg_header {

int len;

} msg_header_t;

typedef struct msg_body {

char name[16];

char data[100];

} msg_body_t;

Page 67: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 66

#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;

/* 실제 데이터의 길이를 리턴한다. */

/* 여기서 리턴하는 값으로 리모트 노드에서 오는 데이터를 읽는다. */

Page 68: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 67

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;

Page 69: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 68

/* body->name 을 이용하여 에러 유무 전송 */

if (info->err) /* error */

strcpy(body->name, "Fail");

else

strcpy(body->name, "Success");

/* 리모트 노드로 요청에 대한 결과를 전송하기 위한 데이터 길이를 반환한다.

*/

return (info->len + sizeof(msg_header_t));

}

int get_channel_num(char *data)

{

return -1;

}

int put_msg_complete(char *hp, char *data, msg_info_t *info)

{

return 1;

}

int remote_closed(int index, int type)

{

return 1;

}

int prepare_shutdown(int code)

{

return 1;

}

int set_service_timeout(int uid, char *header)

{

return 1;

}

Page 70: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 69

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;

}

Page 71: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 70

<Makefile>

#이 Makefile 은 ibm 32bit 용이다.

#TARGET 은 Tmax 환경파일에서 정의한 SERVER 이름과 같아야 한다.

TARGET = tcpgw

APOBJS = $(TARGET).o

#TCPGW 를 생성하기 위해서는 libtcpgw.a 혹은 libtcpgw.so 를 링크시켜야 한다.

LIBS = -ltcpgw -ltmaxgw

OBJS = custom.o register.o

CFLAGS = -q32 -O -I$(TMAXDIR) -D_DBG

LDFLAGS = -brtl

APPDIR = $(TMAXDIR)/appbin

LIBDIR = $(TMAXDIR)/lib

.SUFFIXES : .c

.c.o:

$(CC) $(CFLAGS) $(LDFLAGS) -c $<

$(TARGET): $(OBJS)

$(CC) $(CFLAGS) $(LDFLAGS) -L$(LIBDIR) -o $(TARGET) $(OBJS)

$(LIBS)

mv $(TARGET) $(APPDIR)/.

rm -f $(OBJS)

$(APOBJS): $(TARGET).c

$(CC) $(CFLAGS) $(LDFLAGS) -c $(TARGET).c

Page 72: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 71

<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);

}

Page 73: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 72

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

}

#ifdef _DBG

printf("Connected to TCP/IP Gateway: fd = %d \n", fd);

#endif

/* ② 전문을 구성한다. */

/* Message Header */

header = (msg_header_t *)malloc(sizeof(msg_header_t));

memset(header, 0x00, sizeof(msg_header_t));

header->len = sizeof(msg_body_t);

#ifdef _DBG

printf("DBG : header->len = %d\n", header->len);

Page 74: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 73

#endif

/* Message Body */

body = (msg_body_t *)malloc(sizeof(msg_body_t));

memset(body, 0x00, sizeof(msg_body_t));

strncpy(body->name,"TOUPPER", 16);

for (i = 0; i < 1; i++) {

/* ③ TCPGW 로 데이터를 송신한다. */

if ( (n = send(fd, (char *)header, sizeof(msg_header_t), 0))

< 0 ) {

perror("network write error:");

close(fd);

return -1;

}

printf("Msg header send !\n");

/* Message Body */

strncpy(body->data, argv[1], 100);

#ifdef _DBG

printf("name = %s\n", body->name);

printf("Msg body sending ! [name:'%s', data='%s']\n", body-

>name, body->data);

#endif

if ( (n = send(fd, (char *)body, sizeof(msg_body_t), 0)) <=

0 ) {

perror("network write error:");

close(fd);

return -1;

}

/* ④ TCPGW 로 데이터를 수신한다. */

if ( (n = recv(fd, (char *)&olen, 4, 0)) < 0 ) {

perror("network read error:");

close(fd);

return -1;

Page 75: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 74

}

#ifdef _DBG

printf("\n\nReturn len = %d \n", olen);

#endif

result = (msg_body_t *)malloc(olen);

memset((char *)result, 0x00, olen);

if ( (n = recv(fd, (char *)result, olen, 0)) <= 0 ) {

perror("network read error:");

close(fd);

return -1;

}

#ifdef _DBG

printf("Return [name = '%.*s', data = '%.*s']\n\n",

sizeof(result->name), result->name, sizeof(result->data), result-

>data);

#endif

}

/* ⑤ TCPGW 와 연결을 끊는다. */

close(fd);

return 1;

}

int network_connect()

{

struct sockaddr_in serv_addr;

int fd;

memset((char *)&serv_addr, 0, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;

serv_addr.sin_addr.s_addr = inet_addr(SERV_ADDR);

serv_addr.sin_port = htons((unsigned short)SERV_PORT);

if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

#ifdef _DBG

Page 76: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 75

printf("socket init error");

#endif

return -1;

}

if (connect(fd, (struct sockaddr *)

&serv_addr,sizeof(serv_addr)) >= 0)

return fd;

close(fd);

return -1;

}

Page 77: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 76

4.2 동기 TCPGW 예제 ( INBOUND )

4.2.1 개요 및 프로그램 내용

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 를 구성한다.

Page 78: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 77

그림 4-1 동기 INBOUND TCP/IP Gateway

프로그램 구성

Config file : tcpgw.m

TCPGW : custom.c, custom.h

Remote Node : rserver.c, network.c, custom.h

Client : cli_tcpgw.c, custom.h

Page 79: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 78

<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

Page 80: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 79

<custom.h>

#ifndef _CUSTOM_H_

#define _CUSTOM_H_

/* ----------------------------------------------------------------

---- */

/* Fixed structures and macros */

#define MSG_MAGIC "Tmax"

#define REMOTE_REQUEST 0

#define REMOTE_REPLY 1

#define SVC_NAME_LENGTH 20

/* 이 msg_info_t 는 개발자가 재정의하면 안되는 구조체 이다. */

typedef struct msg_info {

char svc[SVC_NAME_LENGTH];

int err;

int len;

int uid;

int flags;

int msgtype;

int channel_id;

} msg_info_t;

/* ----------------------------------------------------------------

---- */

/* Modifiable structures and macros */

/* 이 msg_header_t 와 msg_body_t 는 개발자가 재정의 가능한 구조체 이다. */

#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;

Page 81: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 80

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 라이브러리 내에서 사용되기

때문에 정의해 주어야 한다. */

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;

}

Page 82: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 81

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);

info->err = 0;

info->flags = 0;

/* info->uid 를 설정한다. */

memcpy((char *)&(info->uid), (char *)&data[UID_FIELD],

UID_LENGTH);

Page 83: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 82

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);

Page 84: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 83

}

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;

}

Page 85: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 84

<Makefile>

#이 Makefile 은 ibm 32bit 용이다.

#TARGET 은 Tmax 환경파일에서 정의한 SERVER 이름과 같아야 한다.

TARGET = tcpgw

APOBJS = $(TARGET).o

#TCPGW 를 생성하기 위해서는 libtcpgw.a 혹은 libtcpgw.so 를 링크시켜야 한다.

LIBS = -ltcpgw -ltmaxgw

OBJS = custom.o register.o

CFLAGS = -q32 -O -I$(TMAXDIR) -D_DBG

LDFLAGS = -brtl

APPDIR = $(TMAXDIR)/appbin

LIBDIR = $(TMAXDIR)/lib

.SUFFIXES : .c

.c.o:

$(CC) $(CFLAGS) $(LDFLAGS) -c $<

$(TARGET): $(OBJS)

$(CC) $(CFLAGS) $(LDFLAGS) -L$(LIBDIR) -o $(TARGET) $(OBJS)

$(LIBS)

mv $(TARGET) $(APPDIR)/.

rm -f $(OBJS)

$(APOBJS): $(TARGET).c

$(CC) $(CFLAGS) $(LDFLAGS) -c $(TARGET).c

Page 86: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 85

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

Page 87: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 86

}

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;

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));

Page 88: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 87

writen2(fd, (char *)body, sizeof(msg_body_t));

}

Page 89: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 88

<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>

#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];

#ifdef _DBG

extern char timebuf[20];

extern char logbuf[1000];

#endif

int network_listen(int portno)

{

int fd, on;

struct sockaddr_in serv_addr;

if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){

#ifdef _DBG

printf("DBG : socket fail...\n");

Page 90: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 89

#endif

return(-1);

}

#ifdef _DBG

printf("DBG : socket open\n");

#endif

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) {

#ifdef _DBG

printf("DBG : bind fail...\n");

#endif

close(fd);

return(-2);

}

#ifdef _DBG

printf("DBG : bind ok\n");

#endif

Page 91: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 90

if (listen(fd, 250) < 0) {

#ifdef _DBG

printf("DBG : listen fail...\n");

#endif

close(fd);

return(-3);

}

#ifdef _DBG

printf("DBG : listen ok\n");

#endif

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){

#ifdef _DBG

printf("DBG : accept fail...\n");

#endif

return(-1); /* often errno=EINTR, if signal caught */

}

return(fd);

}

int readn2(int fd, char *ptr, int nbytes)

{

Page 92: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 91

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 */

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);

}

Page 93: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 92

Page 94: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 93

<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 와 리모트 노드와의 연결이 완료된 후 이 프로그램을 실행한다.)

#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));

}

Page 95: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 94

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();

}

Page 96: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 95

4.3 NON 블록킹 TCPGW 예제

4.3.1.1 개요 및 프로그램 내용

이 방식은 보통 대외계와 통신하는 경우에 많이 사용한다. 이 방식을 이용하면 적은 프로세스 수로도 시스템이 부하를 적게 주면서 보다 많을 일을 처리할 수 있기 때문이다.

블록형 방식은 Tmax 클라이언트나 서비스에서 직접 TCPGW 를 호출하여 응답을 받았으나 이 방식은 송신 프로세스와 TCPGW 로부터 응답을 처리하는 수신 프로세스를 분리하여 처리한다.

TCPGW 를 호출하고자 하는 모든 프로세스는 먼저 송신 프로세스를 호출하면, 송신 프로세스는 TCPGW 를 호출하기 전에 사전 작업을 완료하고 TCPGW 로 서비스 컨트롤을 넘긴다.(tpforward) 다음에 TCPGW 는 넘겨받은 서비스 처리를 하기전에 Tmax engine 과 연결되어 있는 채널의 블록상태를 해제하고 리모트 노드로 서비스를 송신하다. 리모트 노드로부터 응답을 수신받으면 TCPGW 는 수신 메시지를 처리할 수신 서비스를 서비스를 찾는 순서에 따라서 서비스를 찾아 수신 프로세스에게 서비스 컨트롤을 넘긴다. 수신 프로세스는 응답을 처리한 후에 최초로 서비스를 호출한 프로세스에게 결과를 전달한다.

위와 같은 원리로 서비스되므로 실제 TCPGW 를 호출하는 서비스나 tprelay 받는 서비스는 비동기적으로 작동하므로 수행시간에 대한 부하를 거의 가지지 않는다.

단, 최초로 송신 서비스를 호출하는 프로세스는 응답이 올때까지 기다리므로 블록되어 있는 상태이다.

이 예제는 리모트 노드가 서버가 되고 TCPGW 가 클라이언트로서 연결을 맺는 구조이다.

Page 97: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 96

프로그램 구성

Config file : tcpgw.m

TCPGW : custom.c, custom.h

Remote Node : rServer.c, network.c, custom.h

Server : sndsvr.c, rcvsvr.c

Client : cli_tcpgw.c, custom.h

Page 98: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 97

<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

Page 99: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 98

<custom.h>

/* --------------------- custom.h ------------------ */

#ifndef _CUSTOM_H_

#define _CUSTOM_H_

/* ------------------------------------------------------------ */

/* Fixed structures and macros */

/* Common of Agent Define */

#define MSG_MAGIC "Tmax"

#define REMOTE_REQUEST 0

#define REMOTE_REPLY 1

#define SVC_NAME_LENGTH 20

/* 이 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 */

#define UID_FIELD 58

#define SVC_NAME_FIELD 52

#define UID_LENGTH 4

#define SVC_LENGTH 6

#define MSG_KEEP_SVC_SIZE 9

typedef struct msg_header {

Page 100: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 99

int len;

} msg_header_t;

typedef struct msg_body {

char retsvcname[9]; /* -H 옵션 만큼의 내부적으로 저장할 서비스

이름 */

char data[52];

char name[6];

char uid[4];

} msg_body_t;

/* 리모트 노드와 통신할 때는 body 내부의 헤더인 retsvcname 을 제외한 구조체 */

typedef struct remote_body{

char data[52];

char name[6];

char uid[4];

}remote_body_t;

#endif

<custom.c>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>

#include <sys/types.h>

#include <sys/timeb.h>

#include "custom.h"

/* msg_header_size 와 comm_header_size 는 TCPGW 라이브러리 내에서 사용되기

때문에 정의해 주어야 한다. */

int msg_header_size = sizeof(msg_header_t);

int comm_header_size = 0;

/* 아래의 함수들은 필요하지 않은 경우 내부 로직은 구현하지 않아도 된다. */

Page 101: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 100

/* 그러나 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;

}

Page 102: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 101

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)

{

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;

Page 103: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 102

/* 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);

}

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)

{

Page 104: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 103

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>

4.2 동기 TCPGW 예제 와 동일하다.

<sndsvr.c>

#include <string.h>

#include <stdio.h>

#include <usrinc/atmi.h>

SENDSVC(TPSVCINFO *msg)

{

char *sndbuf;

long len;

printf("[%s] Service Started!\n", msg->name);

len = (msg->len);

printf("len is [%d]\n", len);

if ((sndbuf = (char *)tpalloc("CARRAY", NULL, len)) == NULL) {

Page 105: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 104

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 );

}

Page 106: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 105

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

Page 107: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 106

}

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;

/* 사용자 헤더를 제외한 나머지 부분만을 받는다. */

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));

Page 108: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 107

writen2(fd, (char *)body, sizeof(remote_body_t));

}

Page 109: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 108

<network.c>

4.2 동기 TCPGW 예제 와 동일하다.

<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");

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();

Page 110: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 109

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();

}

Page 111: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 110

4.4 부 록

4.4.1 CUSTOM INFO 구조체

번호 항 목 명 Type 길이 설 명

1 svc char 20 서비스명을 지정하는 항목이다. 리모트

노드에서 서비스 요청시 이 항목에

서비스명을 주면 TCPGW 는 이를 이용하여

서비스를 호출한다.

2 err Int 4 서비스를 요청하고 응답 데이를 수신 받았을

경우 에러 유무를 나타내는 항목이다.

3 len int 4 송수신 데이터의 길이를 나타내는 항목이다.

4 uid int 4 동기 통신시 TCPGW 가 만든 UID 를

담고있는 항목이다.

5 flags int 4 리모트 노드에서 Tmax 로 서비스 요청시

사용하는 항목이다.

6 msgtype int 4 미사용

7 channel_id int 4 송수신 채널 번호

4.4.2 CUSTOM INFO Flags

번호 항 목 명 설 명

1 NOFLAGS 리모트 노드에서 요청한 서비스에 대해서 응답을 받는

경우

Page 112: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 111

2 TPNOREPLY 리모트 노드에서 요청한 서비스에 대해서 응답을 받지

않고 서비스 요청만 하는 경우, Tmax 의 tpacall 에

TPNOREPLY 와 같음.

4.4.3 TCPGW 에러 코드

번호 항 목 명 설 명

1 TPEINVAL Gateway 헤더를 사용할 경우 TCPGW 를 호출한

데이터의 길이가 Gateway 헤더보다 작을 경우 발생

2 TPEPROTO tpforward 로 TCPGW 호출시 TCPGW 가 동기형 모드가

아닌 비동기형 모드일 경우 발생, tpforward & tprelay 방식은 반드시 동기형 방식이어야 함.

3 TPENOENT 옵션 “-E”를 사용시 서비스 요청마다 리모트 노드와

연결을 하고 데이터를 전송하는데, 동시에 호출한 수가

“-n” 옵션으로 지정한 채널의 수를 초과했을 때 발생.

4 TPENOREADY 리모트 노드와의 연결이 끊어져 사용할 수 있는

채널이 없는 경우

5 TPEOS TCPGW 내부에서 메모리를 확보하는데 확보되지 않을

경우

6 TPESYSTEM TCPGW 에서 코드변환을 사용할 경우 요청한 데이터에

대한 map 파일이 로드되지 않을 경우나 또는 코드

변환 오류시 사용자 함수 put_msg_info 에서 음수를

리턴한 경우 리모트 노드로 데이터 전송시 오류가

발생한 경우

7 TPETIME 리모트 노드로 서비스를 요청하고 지정된 시간내에

응답이 없을 경우

Page 113: Tmax TCP IP Gateway Guide - 티맥스소프트 -TmaxSoft · 2019-04-09 · Tmax TCP IP Gateway Guide 2 Tmax Standard TP Function + 2 Phase Commit Tmax Options Web Admin Console, X.25

Tmax TCP IP Gateway Guide 112

8 TPECLOSE 리모트 노드로 서비스를 요청한 이후에 리모트 노드와

연결이 끊어진 경우