Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는...

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

Transcript of Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는...

Page 1: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

Tmax Gateway Guide

(TCP/IP Thread)

Tmax v5.0 SP1

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

Page 2: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

Copyright Notice

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

대한민국 경기도 성남시 분당구 서현동 263 분당스퀘어(AK프라자) 12층

Restricted Rights Legend

All TmaxSoft Software (Tmax®) and documents are protected by copyright laws and the Protection Act of Com

puter Programs, and international convention. TmaxSoft software and documents are made available under the

terms of the TmaxSoft License Agreement and may only be used or copied in accordance with the terms of this

agreement. No part of this document may be transmitted, copied, deployed, or reproduced in any form or by any

means, electronic, mechanical, or optical, without the prior written consent of TmaxSoft Co., Ltd.

이 소프트웨어(Tmax®) 사용설명서의 내용과 프로그램은 저작권법, 컴퓨터프로그램보호법 및 국제 조약에 의해

서 보호받고 있습니다. 사용설명서의 내용과 여기에 설명된 프로그램은 TmaxSoft Co., Ltd.와의 사용권 계약 하에

서만 사용이 가능하며, 사용권 계약을 준수하는 경우에만 사용 또는 복제할 수 있습니다. 이 사용설명서의 전부 또

는 일부분을 TmaxSoft의 사전 서면 동의 없이 전자, 기계, 녹음 등의 수단을 사용하여 전송, 복제, 배포, 2차적 저

작물작성 등의 행위를 하여서는 안 됩니다.

Trademarks

Tmax®, Tmax WebtoB® and JEUS® are registered trademark of TmaxSoft Co., Ltd. Other products, titles or

services may be registered trademarks of their respective companies.

Tmax®, Tmax WebtoB® 와 JEUS®는 TmaxSoft Co., Ltd.의 등록 상표입니다. 기타 모든 제품들과 회사 이름은 각

각 해당 소유주의 상표로서 참조용으로만 사용됩니다.

Open Source Software Notice

This product includes various open source software that has been developed and/or licensed by “OpenSSL”, “RSA

Data Security, Inc.”, “Apache Foundation”, or “Jean-loup Gailly and Mark Adler.” TmaxSoft fully respects the

aforementioned parties and the open source software used in this product. More details can be found within the

directory “${INSTALL_PATH}/license/oss_licenses”

본 제품은 “OpenSSL”, “RSA Data Security, Inc.”, “Apache Foundation” 및 “Jean-loup Gailly와 Mark Adler”에 의

해 개발 또는 라이선스된 오픈 소스 소프트웨어를 포함합니다. 오픈 소스 소프트웨어와 개발자에 대해 경의를 표

합니다. 관련 상세 정보는 제품의 디렉터리 “${INSTALL_PATH}/license/oss_licenses”에 기재된 사항을 참고해 주

십시오.

안내서 정보

안내서 제목: Tmax Gateway Guide (TCP/IP Thread)

발행일: 2009-08-10

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

안내서 버전: v2.1.1

Page 3: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

내용 목차

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

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

1.1. 개요 ............................................................................................................................ 1

1.2. 프로세스 ...................................................................................................................... 2

1.2.1. Listener 프로세스 .............................................................................................. 2

1.2.2. Handler 프로세스 .............................................................................................. 2

1.2.3. Clishm 프로세스 ................................................................................................ 2

1.3. 서비스 유형 ................................................................................................................. 2

1.3.1. 서버 모드 / 클라이언트 연결(shared) ................................................................... 2

1.3.2. 서버 모드 / 클라이언트 연결(dedicate) ................................................................ 3

1.3.3. 클라이언트 모드 / 싱글 서버 연결 ....................................................................... 5

1.3.4. 클라이언트 모드 / 멀티 서버 연결 ....................................................................... 5

제2장 환경 설정 .......................................................................................................................... 7

2.1. Tmax 환경 구성 ............................................................................................................ 7

2.1.1. 사용 옵션 .......................................................................................................... 8

2.2. TCP/IP 스레드 게이트웨이 환경파일 ............................................................................ 10

2.2.1. 주소 정보 환경파일 .......................................................................................... 10

제3장 사용자 API 함수 .............................................................................................................. 11

3.1. Callback 함수 ............................................................................................................. 11

3.1.1. user_thrmain ................................................................................................... 11

3.2. API 함수 .................................................................................................................... 11

3.2.1. tcpgw_tpcall .................................................................................................... 11

3.2.2. tcpgw_tpacall .................................................................................................. 12

3.2.3. tcpgw_tpreply .................................................................................................. 13

3.2.4. tcpgw_get_svcdata .......................................................................................... 13

3.2.5. tcpgw_select ................................................................................................... 14

3.2.6. tcpgw_network_connect ................................................................................... 14

3.2.7. tcpgw_read ..................................................................................................... 15

3.2.8. tcpgw_write ..................................................................................................... 16

3.2.9. tcpgw_portno_ipaddr ....................................................................................... 16

3.2.10. tcpgw_client_id .............................................................................................. 17

3.2.11. tcpgw_getaddr_from_winfo ............................................................................. 17

제4장 예제 ................................................................................................................................ 19

4.1. 서버 모드 Outbound 서비스 호출 ................................................................................. 19

4.1.1. 프로그램 구성 .................................................................................................. 19

4.2. 서버 모드 Inbound 서비스 호출 ................................................................................... 28

4.2.1. 프로그램 구성 .................................................................................................. 28

4.3. 클라이언트 모드 Inbound 서비스 호출 ......................................................................... 34

4.3.1. 프로그램 구성 .................................................................................................. 34

Tmax Gateway Guide iii

Page 4: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

Appendix A. 헤더파일 .............................................................................................................. 41

A.1. TCPHDR.H 파일 ........................................................................................................ 41

iv Tmax Gateway Guide (TCP/IP Thread)

Page 5: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

그림 목차

[그림 1.1] TCP/IP 스레드 게이트웨이 구조 .................................................................................... 1

[그림 1.2] 서버 모드 / 클라이언트 연결(shared) ............................................................................. 3

[그림 1.3] 서버 모드 / 클라이언트 연결(dedicate) .......................................................................... 4

[그림 1.4] 클라이언트 모드 / 싱글 서버 연결 .................................................................................. 5

[그림 1.5] 클라이언트 모드 / 멀티 서버 연결 .................................................................................. 6

Tmax Gateway Guide v

Page 6: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일
Page 7: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

안내서에 대하여

안내서의 대상

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

다. 본 안내서는 Non Tmax 클라이언트와 Tmax 사이에서 인터페이스를 해주는 TCP/IP 스레드 게이트웨

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

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

득을 위한 기본서이다.

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

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

● Tmax의 기본 개념 이해

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

안내서의 제한 조건

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

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

참고

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

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

Guide”를 참고한다.

안내서에 대하여 vii

Page 8: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

안내서 구성

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

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

● 제1장: 소개

시스템의 개요 및 프로세스, 서비스 유형에 대해 기술한다.

● 제2장: 환경 설정

TCP/IP 스레드 게이트웨이 환경구성 및 환경파일 설정에 대해 기술한다.

● 제3장: 사용자 API 함수

TCP/IP 스레드 게이트웨이에서 사용하는 API 함수에 대해 기술한다.

● 제4장: 예제

TCP/IP 스레드 게이트웨이의 각 역할에 대한 예제에 대해 기술한다.

● Appendix A.: 헤더파일

TCPHDR.H 파일, HLINKAPI.H 파일을 기술한다.

viii Tmax Gateway Guide (TCP/IP Thread)

Page 9: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

안내서 규약

의미표기

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

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

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

강조진하게

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

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

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

메뉴의 진행 순서>

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

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

참고 또는 주의사항참고

그림 이름[그림 1.1]

표 이름[표 1.1]

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

옵션 인수 값[ ]

선택 인수 값|

안내서에 대하여 ix

Page 10: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

시스템 사용 환경

요구 사항

IBM AIX 5.xPlatform

HP-UX 11.xx

Solaris 7~9 (SunOS 5.7~5.9)

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

256MB 이상 메모리 공간

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

Oracle 9i 또는 10gDatabase

x Tmax Gateway Guide (TCP/IP Thread)

Page 11: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

관련 안내서

설명안내서

Tmax를 이용하기 위한 환경설정 파일과 시스템 운영방식에 대해 기

술한 안내서이다.

Tmax

Administration Guide

안내서에 대하여 xi

Page 12: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

연락처

Korea

TmaxSoft Co., Ltd

263 BundangSquare (AK Plaza) 12th floor, Seohyeon-dong, Bundang-gu,

Seongnam-si, Gyeonggi-do, 463-824

South Korea

Tel: +82-31-8018-1000

Fax: +82-31-8018-1115

Email: [email protected]

Web (Korean): http://www.tmax.co.kr

기술지원: http://technet.tmaxsoft.com

USA

TmaxSoft, Inc.

560 Sylvan Avenue Englewood Cliffs, NJ 07632

U.S.A

Tel: 1-201-567-8266

Fax: 1-201-567-7339

Email: [email protected]

Web (English): http://www.tmaxsoft.com

Japan

TmaxSoft Japan Co., Ltd.

5F Sanko Bldg, 3-12-16 Mita, Minato-Ku, Tokyo, 108-0073

Japan

Tel: +81-3-5765-2550

Fax: +81-3-5765-2567

Email: [email protected]

Web (Japanese): http://www.tmaxsoft.co.jp

xii Tmax Gateway Guide (TCP/IP Thread)

Page 13: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

China

TmaxSoft China Co., Ltd.

Beijing Silver Tower, RM 1508, 2# North Rd Dong San Huan,

Chaoyang District, Beijing, China, 100027

China

Tel: +86-10-6410-6145~8

Fax: +86-10-6410-6144

Email: [email protected]

Web (Chinese): http://www.tmaxsoft.com.cn

ASEAN Office

TmaxSoft Pte. Ltd.

30 Cecil Street, Level 15 Unit 05 Prudential Tower, Singapore 049712

Singapore

Tel: +65-6232-2889

Fax: +65-6232-2919

Email: [email protected]

Web (English): http://asean.tmaxsoft.com

안내서에 대하여 xiii

Page 14: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일
Page 15: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

제1장 소개

1.1. 개요TCP/IP 스레드 게이트웨이(이하 TCPGWTHR)는 Non Tmax 클라이언트(Non Tmax 서버)와 Tmax사이에

서 인터페이스를 해주는 제품이다. 즉 Non Tmax 클라이언트와 게이트웨이간의 통신은 일반적인 TCP/IP

통신을 하고, 게이트웨이와 Tmax 시스템간에는 Tmax 통신을 하게 된다.

게이트웨이는 사용하는 방법에 따라서 서버로 동작할 수 있고 클라이언트로도 동작할 수 있다. 이는 서비

스 요청이 아니라 연결에 대한 요청이 어디에서부터 시작하는지를 의미한다. 게이트웨이가 서버로 동작

하면 리모트에서 연결을 시도하는 것이고, 반대인 경우에는 게이트웨이(스레드)에서 연결을 시도한다. 어

디에서 먼저 연결을 시도하든 연결만 되면 서로간에 서비스를 요청할 수 있다.

또한 클라이언트와 Handler의 스레드를 할당하여 연결하는 방식이므로 클라이언트와 스레드사이에 사용

자 임의의 프로토콜을 추가 할 수 있다, Tmax 서비스에서 클라이언트를 요청 할 때는 Round robin형태로

클라이언트와 연결된 Idle한 스레드를 내부적으로 찾아서 전달하는 방법과 특정 클라이언트와 연결된 스

레드에게 전달 하는 방법을 제공한다. 게이트웨이는 Tmax내에 포함되어 통합 관리 된다.

이전에 사용한 TCP/IP 게이트웨이는 하나의 프로세스에서 리모트와 여러 개 채널을 접속 시켜 단순하게

Request/Response만 주고 받는 형태이다. 그러나 TCP/IP 스레드 게이트웨이는 사용자가 임의의 프로토

콜을 추가할 수 있을 뿐만 아니라, 다양한 환경에 사용할 수 있다.

RCA(Raw 클라이언트 Agent)와 차이점은 RCA는 Tmax에 클라이언트로 접속하기 때문에 Tmax에 서비

스는 요청할 수 있으나 반대로 RCA에 서비스를 요청 할 수 없다. 그러나 TCP/IP 스레드 게이트웨이는 양

방향 서비스 요청이 가능하다.

[그림 1.1] TCP/IP 스레드 게이트웨이 구조

제1장 소개 1

Page 16: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

1.2. 프로세스TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클

라이언트 모드일 경우는 클라이언트 공유메모리 관리 프로세스(이하 Clishm)와 Handler 프로세스로 구성

되어 있다. 각각을 살펴보면 다음과 같다.

1.2.1. Listener 프로세스

Listener 프로세스는 TCP/IP 스레드 게이트웨이가 서버로 동작할 경우에 필요한 프로세스이다. Listener

는 주어진 포트를 Listen하고 있다가 외부에서 연결이 들어오면 이를 받아서 Handler 프로세스에게 전달

하는 역할을 수행하는 프로세스이다.

Listener 프로세스도 Tmax 시스템과 접속되어 Tmax 시스템이 기동되면 실행되고 다운되면 종료된다.

1.2.2. Handler 프로세스

Non Tmax 클라이언트(Non Tmax 서버)와 접속하여 실질적인 업무를 처리하는 프로세스로, Listener 프로

세스에서 전달된 소켓을 내부의 스레드에 분배하여 할당 된 스레드가 업무를 처리하거나 또는 특정 스레

드가 Non Tmax 클라이언트(Non Tmax 서버)와 연결하여 업무를 처리하는 프로세스이다. Handler 프로세

스 내부에는 많은 스레드가 존재한다.

하나하나의 스레드가 리모트와 연결되는데, TCP/IP 스레드 게이트웨이가 서버로 동작할 경우에는 Listener

프로세스로부터 소켓를 전달 받고, TCP/IP 스레드 게이트웨이가 클라이언트로 동작할 경우에는 Handler

프로세스 내부에 있는 각각의 스레드가 리모트와 연결을 맺는다.

연결을 맺은 스레드는 Non Tmax 클라이언트로부터 요청을 받거나 Tmax 서비스에 요청을 할 수 있다.

Handler 프로세스는 프로세스당 최대 50개까지 스레드를 만들 수 있다.

1.2.3. Clishm 프로세스

클라이언트 모드에서 Listener 프로세스 대신 사용된다. 공유 메모리 초기화를 위해서 필요하며, Clishm

프로세스도 Tmax 시스템과 접속되어 Tmax 시스템이 부트 되면 실행되고 다운되면 종료된다.

1.3. 서비스 유형

1.3.1. 서버 모드 / 클라이언트 연결(shared)

서버로 동작하는 경우에는 Listener 프로세스가 반드시 필요하다. Listener 프로세스는 Non Tmax 클라이

언트에서 들어오는 연결 요청을 받아서 Handler 프로세스에게 전달하는 역할을 수행한다. Listener 프로

세스는 들어오는 요청에 대해서 Round robin방식으로 Handler 프로세스에게 동등하게 분배한다.

2 Tmax Gateway Guide (TCP/IP Thread)

Page 17: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

Tmax 서비스로부터 게이트웨이 서비스를 호출하는 경우 Round robin 방식으로 클라이언트와 연결된

Handler 프로세스의 Idle한 스레드 중에서 하나의 스레드에게 전달한다.

[그림 1.2] 서버 모드 / 클라이언트 연결(shared)

Tmax 환경파일

*SERVER

tcpgwlsn SVGNAME = svg1, MIN=1, MAX=1,

SVRTYPE = CUSTOM_GATEWAY, RESTART = N,

CLOPT="-- -P 1029 -N 3 -k 98765"

tcpgwhdr SVNAME = svg1, MIN=3, MAX=3, SCHEDULE=RR,

SVRTYPE=CUSTOM_GATEWAY, CPC= 10,

CLOPT="-- -P 1029 -N 10 -s –L tcpgwlsn"

*SERVICE

svcgw SVRNAME = tcpgwhdr

1.3.2. 서버 모드 / 클라이언트 연결(dedicate)

서버로 동작하는 경우에는 Listener 프로세스가 반드시 필요하다. Listener 프로세스는 Non Tmax 클라이

언트에서 들어오는 연결을 받아서 해당 클라이언트가 게이트웨이 환경파일에 등록되어 있는지 확인 후

Handler 프로세스에게 전달하여 스레드를 할당한다. 만약 등록되어 있지 않으면 경고 메시지 출력 후 연

결 요청을 거절한다. 이 과정에서 접속을 요청한 클라이언트 정보를 공유 메모리에서 검색 후 등록되어 있

지 않으면, 게이트웨이 환경파일을 내부적으로 재 검색하므로 동적으로 추가 가능하다.

Tmax 서비스에서 클라이언트를 구별하기 위하여 IP당 하나의 연결만 허용한다. 예를 들어 클라이언트와

스레드간에 연결이 되어 있는 상태에서 동일한 클라이언트에서 추가로 연결을 요청할 경우는 기존 연결

은 끊어지고, 추가 요청도 취소된다.

Tmax 서비스로부터 게이트웨이 서비스를 호출하는 경우 게이트웨이 환경파일에 등록되어 있는 클라이

언트 ID를 선택해야 하며, 호출 시 게이트웨이 내부적으로 연결되어 있는 스레드를 찾아서 전달한다.

제1장 소개 3

Page 18: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

Handler 프로세스의 스레드 할당은 게이트웨이 환경파일에 등록된 클라이언트 수와 동적으로 접속을 허

용하기 위해서 50개가 추가로 할당된다. 그리고 Handler 프로세스 당 스레드의 개수가 50을 넘지 않도록

Handler 프로세스 수를 조정해야 한다.

[그림 1.3] 서버 모드 / 클라이언트 연결(dedicate)

Tmax 환경파일

*SERVER

tcpgwlsn SVGNAME = svg1, MIN=1, MAX=1,

SVRTYPE = CUSTOM_GATEWAY, RESTART = N,

CLOPT="-- -P 1029 -N 3 -k 98765 -F tcpgwlsn.dat"

tcpgwhdr SVNAME = svg1, MIN=3, MAX=3, SCHEDULE=RR,

SVRTYPE=CUSTOM_GATEWAY, CPC= 10,

CLOPT="-- -P 1029 -s –L tcpgwlsn"

*SERVICE

svcgw SVRNAME = tcpgwhdr

게이트웨이 환경파일

# Client IP Server Port Client ID

61.33.32.123 1029 CLI1

61.33.32.124 1029 CLI2

61.33.32.125 1029 CLI3

61.33.32.126 1029 CLI4

4 Tmax Gateway Guide (TCP/IP Thread)

Page 19: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

1.3.3. 클라이언트 모드 / 싱글 서버 연결

클라이언트로 동작하는 경우에는 Listener 프로세스 대신 Clishm 프로세스를 사용해야 한다.

Non Tmax 서버에 접속하고자 하는 경우에는 Tmax 환경파일에 접속하고자 하는 서버 IP 와 포트를 등록

하면 된다.

[그림 1.4] 클라이언트 모드 / 싱글 서버 연결

Tmax 환경파일

*SERVER

clihdrshm SVGNAME = svg1, MIN=1, MAX=1,

SVRTYPE=CUSTOM_GATEWAY,

CLOPT="-- -N 1 -k 91000"

tcpgwhdr SVNAME = svg1, MIN=1, MAX=1,

SVRTYPE=CUSTOM_GATEWAY,

CPC = 9, SCHEDULE = RR,

CLOPT="-- -k 91000 -P 3777 –r 100.100.100.1 \

-N 1 –L clihdrshm"

*SERVICE

svcgw SVRNAME = tcpgwhdr

1.3.4. 클라이언트 모드 / 멀티 서버 연결

클라이언트로 동작하는 경우에는 Listener 프로세스 대신 Clishm 프로세스를 사용해야 한다. 여러 대의

Non Tmax 서버에 접속하고자 하는 경우에는 게이트웨이 환경파일을 이용하여 접속하고자 하는 서버의

정보를 등록하면 된다.

Tmax 서비스로부터 게이트웨이 서비스를 호출하는 경우 할당되어 있는 스레드가 있는지 확인하고, 스레

드가 할당되어 있지 않으면 빈 스레드를 할당하고 Non Tmax 서버에 접속을 진행한다.

제1장 소개 5

Page 20: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

[그림 1.5] 클라이언트 모드 / 멀티 서버 연결

Tmax 환경파일

*SERVER

clihdrshm SVGNAME = svg1, MIN=1, MAX=1,

SVRTYPE=CUSTOM_GATEWAY,

CLOPT="-- -N 10 -k 91000 -F tcpgwhdr.dat"

tcpgwhdr SVGNAME svg1, MIN=10, MAX=10, SVRTYPE=CUSTOM_GATEWAY,

CPC = 9, SCHEDULE = RR,

CLOPT =”-- -k 91029 -F tcpgwhdr.dat –L clihdrshm"

*SERVICE

svcgw SVRNAME = tcpgwhdr

예제 (Gateway 환경파일)

# Server IP Server Port Server ID

61.33.32.123 9000 SERVER1

61.33.32.124 9100 SERVER2

6 Tmax Gateway Guide (TCP/IP Thread)

Page 21: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

제2장 환경 설정

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

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

파일명디렉터리

libtcpgwhdr.a libtcpgwhdr.so libtmaxgw.a libtmaxgw.so libtmaxgwmt.a libtmaxg

wmt.so

lib

libtcpgwhdr.a libtcpgwhdr.so libtmaxgw.a libtmaxgw.so libtmaxgwmt.a libtmaxg

wmt.so

lib64

tcpgwlsn clihdrshm tcpgwlsn64 clhhdrshm64appbin

tcphdr.h hlinkapi.husrinc

다음은 Window에서 사용되는 환경파일이다.

파일명디렉터리

tcpgwhdr.lib tcpgwhdr.dll tmaxgw.lib tmaxgw.dll tmaxgwmt.lib tmaxgwmt.dlllib

tcpgwlsn.exe clihdrshm.exebin

tcphdr.h hlinkapi.husrinc

2.1. Tmax 환경 구성TCPGWTHR를 사용하기 위해서는 Tmax 환경파일에 Listener 프로세스 또는 Clishm 프로세스 및 Handler

프로세스를 서버로서 등록해야 한다. Tmax 서버중 UCS형 서버와 등록 방법이 비슷한데, 차이점은 SVR

TYPE이 UCS에서 CUSTOM_GATEWAY라는 차이밖에 없다.

등록하는 방법은 아래와 같다.

*DOMAIN

tmax SHMKEY = 88000,

MINCLH = 1,

MAXCLH=1,

TPORTNO=8800

*NODE

tmax1 TMAXDIR=”/home/tmax”,

APPDIR=”/home/tmax/appbin”

제2장 환경 설정 7

Page 22: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

*SVRGROUP

svg1 NODENAME=tmax1

*SERVER

tcpgwlsn SVGNAME = svg1, MIN=1, MAX=1,

SVRTYPE = CUSTOM_GATEWAY, RESTART = N,

CLOPT="-- -P 1029 -N 3 -k 98765"

tcpgwhdr SVNAME = svg1, MIN=3, MAX=3, SCHEDULE=RR,

SVRTYPE=CUSTOM_GATEWAY, CPC= 10,

CLOPT="-- -P 1029 -N 10 -s –L tcpgwlsn"

*SERVICE

svcgw SVRNAME = tcpgwhdr

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

2.1.1. 사용 옵션

TCPGWTHR은 Tmax config 파일에 등록할 수 있는 항목이 제안되어 있는 관계로 CLOPT 항목에 몇 가지

옵션을 설정해야 한다. 아래에 설명하는 옵션에 따라서 TCPGWTHR의 동작 방식이 다르므로 아래의 설

명을 정확히 이해해야 한다.

다음은 Listener 옵션에 대한 설명이다.

설명옵션

옵션을 사용하게 되면 Dedicate 모드로 동작한다. 게이트웨이 환경파일을 입력 시에는 Full

Path로 입력해야 한다. 이 파일의 등록 방법은 “2.2. TCP/IP 스레드 게이트웨이 환경파일”

설명을 참고한다.

F

Listen하고자 하는 포트 번호이다.P

게이트웨이내에서 정보를 공유하기 위해 사용되는 Shared memory를 위한 Key 값이다. 입

력한 Key 와 Key + 1를 사용한다.

k

Handler 프로세스 개수이다. Handler 프로세스의 MIN 값을 적용하면 되며, Handler 프로

세스의 MIN, MAX는 동일하게 해야 한다.

N

시스템이 Windows시 게이트웨이 내부적으로 사용할 포트 번호이다w

8 Tmax Gateway Guide (TCP/IP Thread)

Page 23: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

다음은 Handler 옵션에 대한 설명이다.

설명옵션

클라이언트 모드에서 멀티 연결을 하고자 하는 경우 게이트웨이 환경파일을 지정한다. 게

이트웨이 환경파일을 입력할 때 Full Path로 입력해야 한다. 파일의 등록 방법은 “2.2. TCP/IP

스레드 게이트웨이 환경파일” 설명을 참고한다.

F

클라이언트 모드(싱글 연결)일 경우 접속하고자 하는 Non Tmax 서버의 IP 또는 hostname

이다.

r

서버 모드일 경우는 Listener의 포트 번호 이다. 클라이언트 모드(Single 연결)일 경우는 접

속하고자 하는 Non Tmax 서버의 포트 번호이다.

P

게이트웨이내에서 정보를 공유하기 위해 사용되는 Shared memory를 위한 Key 값이다. 입

력한 Key 와 Key + 1를 사용한다.

k

Handler 프로세스가 서버 모드로 동작할지 클라이언트 모드로 동작할지를 지정한다.s

Handler 프로세스는 Handler당 스레드 개수를 지정한다. 서버 모드에서 게이트웨이 환경

파일을 지정 한 경우는 파일을 참조해서 Handler당 스레드 개수를 계산하여 할당할 수 있

N

으므로 지정하지 않아도 된다. 클라이언트 모드일 경우는 싱글 연결이면 1을 지정해야 하

고 멀티 연결일 경우는 접속하고자 하는 수 만큼의 스레드 수를 입력하거나 입력하지 않아

도 된다. 입력하지 않은 경우는 Handler의 -F 옵션에 지정된 게이트웨이 환경파일을 참조

하여 할당된다.

시스템이 Windows시 게이트웨이 내부적으로 사용할 포트 번호이다w

다음은 Clishm 옵션에 대한 설명이다.

설명옵션

옵션을 사용하게 되면 Dedicate 모드로 동작한다. 게이트웨이 환경파일을 입력 시에는 Full

Path로 입력해야 한다. 파일의 등록 방법은 “2.2. TCP/IP 스레드 게이트웨이 환경파일” 설

명을 참고한다.

F

게이트웨이내에서 정보를 공유하기 위해 사용되는 Shared memory를 위한 Key 값이다. 입

력한 Key 와 Key + 1를 사용한다.

k

Handler 프로세스 개수이다. Handler 프로세스의 MIN 값을 적용하면 되며, Handler 프로

세스의 MIN, MAX는 동일하게 해야 한다.

N

시스템이 Windows시 게이트웨이 내부적으로 사용할 포트 번호이다w

제2장 환경 설정 9

Page 24: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

2.2. TCP/IP 스레드 게이트웨이 환경파일Tmax 환경파일의 CLOPT 절에 “-F” 옵션으로 지정한 파일은 아래에 설명하는 포맷으로 등록되어 있어야

한다. 파일은 리모트 노드 주소와 서버 ID를 등록하는 파일이다.

2.2.1. 주소 정보 환경파일

#######################################################

# TCP/IP Thread Gateway Config #

#######################################################

# Server IP Server Port Server ID

# 1.1.1.1 9000 SERVER1

#######################################################

# line start with "#" is comment line

#######################################################

61.33.32.123 9000 SERVER1

61.33.32.124 9100 SERVER2

주소 정보 환경파일 항목별 설명은 다음과 같다.

설명항목명

리모트 노드의 IP 주소를 등록하는 항목이다.Server IP

리모트 노드의 포트 번호를 등록하는 항목이다.Server Port

Tmax 서비스로부터 게이트웨이 서비스를 호출하는 경우 Dedicate 방식으로 채

널을 선택하기 위해서 필요한 ID이다. 최대 길이는 31자이다.

Server ID

10 Tmax Gateway Guide (TCP/IP Thread)

Page 25: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

제3장 사용자 API 함수

사용자 usrmain() 프로그램에서 사용할 수 있는 TCP/IP 스레드 게이트웨이 관련 API 함수 설명이다.

3.1. Callback 함수

3.1.1. user_thrmain

사용자가 작성해야 할 스레드 메인 콜백 함수이다. TCP/IP 스레드 게이트웨이는 사용자가 작성한 프로그

램을 스레드 형태로 수행한다.

● 프로토타입

int user_thrmain(WORKTHRINFO *wthrinfo, int server)

● 파라미터

설명파라미터

스레드에서 넘겨준 WORKTHRINFO에 대한 포인터이다.wthrinfo

해당 스레드가 서버 모드인지 아니면 클라이언트 모드인지를 나태내는 변수

이다. 0 이면 클라이언트 모드이고, 1이면 서버 모드이다.

server

● 반환값

사용되지 않음

3.2. API 함수설명하는 라이브러리의 프로토타입은 tcphdr.h 헤더 파일에 정의되어 있다.

3.2.1. tcpgw_tpcall

Tmax 서비스 동기식 호출 함수이다.

● 프로토타입

제3장 사용자 API 함수 11

Page 26: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

int tcpgw_tpcall(WORKTHRINFO *wthrinfo, char *svc, char *ptr, long alen,

char *optr, long *olen)

● 파라미터

설명파라미터

스레드에서 넘겨준 WORKTHRINFO에 대한 포인터이다.wthrinfo

Tmax 서비스명이다.svc

Tmax 서비스에 전달할 데이터가 저장된 버퍼 포인터이다.ptr

Tmax 서비스에 전달할 데이터 길이이다.alen

Tmax 서비스에서 처리 결과를 받을 버퍼 포인터이다.optr

처리 결과의 데이터 길이가 저장될 long 포인터이다.olen

● 반환값

Tmax 서비스 처리시 오류가 발생하면 반환값으로 오류 코드가 반환된다. 반환값이 –1인 경우에는 비

정상적인 오류가 발생한 경우이다. 그 외의 minus 값은 Tmax에서 서비스 처리시 오류가 발생한 경우

오류 코드이다.

3.2.2. tcpgw_tpacall

Tmax 서비스 비동기 호출 함수이다. 단, 요청만 가능하며 결과는 받아 올 수 없다.(TPNOREPLY)

● 프로토타입

int tcpgw_tpacall(WORKTHRINFO *wthrinfo, char *svc, char *ptr, long alen)

● 파라미터

설명파라미터

스레드에서 넘겨준 WORKTHRINFO에 대한 포인터이다.wthrinfo

Tmax 서비스 명이다.svc

Tmax 서비스에 전달할 데이터가 저장된 버퍼 포인터이다.ptr

Tmax 서비스에 전달할 데이터 길이이다.alen

● 반환값

Tmax 서비스 처리시 오류가 발생하면 반환값으로 오류 코드가 반환된다. 반환값이 –1인 경우에는 비

정상적인 오류가 발생한 경우이다. 그 외의 minus 값은 Tmax에서 서비스 처리 시 오류가 발생한 경우

오류 코드이다.

12 Tmax Gateway Guide (TCP/IP Thread)

Page 27: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

3.2.3. tcpgw_tpreply

Tmax에 결과를 반환하기 위한 함수이다. Tmax에서 서비스 요청이 먼저 온 경우, 리모트에서 서비스를 처

리하고 그 결과를 Tmax에 전달한다.

● 프로토타입

int tcpgw_tpreply(WORKTHRINFO *wthrinfo, char *ptr, long alen, int err)

● 파라미터

설명파라미터

스레드에서 넘겨준 WORKTHRINFO에 대한 포인터이다.wthrinfo

Tmax 서비스에 전달할 데이터가 저장된 버퍼 포인터이다.ptr

Tmax 서비스에 전달할 데이터 길이이다.alen

서비스 처리시 오류가 발생할 경우 오류 코드이다.err

● 반환값

Tmax 서비스 처리시 오류가 발생하면 반환값으로 오류 코드가 반환된다. 반환값이 –1인 경우에는 비

정상적인 오류가 발생한 경우이다. 그 외의 minus 값은 Tmax에서 서비스 처리 시 오류가 발생한 경우

오류 코드이다.

3.2.4. tcpgw_get_svcdata

Tmax에서 오는 데이터를 받기 위한 함수이다.

● 프로토타입

int tcpgw_get_svcdata(WORKTHRINFO *wthrinfo, char *ptr, int *err, int *flags)

● 파라미터

설명파라미터

스레드에서 넘겨준 WORKTHRINFO에 대한 포인터이다.wthrinfo

데이터가 저장될 버퍼이다.ptr

오류 코드가 저장될 int 포인터이다.err

Tmax에서 서비스 요청 시 응답을 받을 것인지 아닌지를 저장한다. 0 이면

Tmax 서비스에서 응답을 기다리는 상태이고, 1이면 응답을 기다리지 않는

상태이다.

flags

제3장 사용자 API 함수 13

Page 28: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

● 반환값

설명반환값

함수 호출에 성공한 경우데이터 길이

함수 호출에 실패한 경우–1

3.2.5. tcpgw_select

해당 스레드에 요청을 받을 때까지 정해진 시간만큼 대기하는 함수이다.

● 프로토타입

int tcpgw_select(WORKTHRINFO *wthrinfo, int sec, int usec)

● 파라미터

설명파라미터

스레드에서 넘겨준 WORKTHRINFO에 대한 포인터이다.wthrinfo

타임아웃이다.(단위: 초)sec

타임아웃이다.(단위: 백만분의 1초)usec

● 반환값

설명반환값

타임아웃일 경우WTHR_SELECT_TIMEOUT(1)

Tmax 요청일 경우WTHR_TMAX_REQUEST(2)

리모트 요청일 경우WTHR_USER_REQUEST(3)

그 외 에러인 경우WTHR_SELECT_ERROR(-1)

3.2.6. tcpgw_network_connect

TCP/IP 스레드 게이트웨이가 클라이언트 모드로 동작할 경우 리모트와 연결하기 위한 함수이다.

● 프로토타입

int tcpgw_network_connect(char *host, int port, int sec)

● 파라미터

14 Tmax Gateway Guide (TCP/IP Thread)

Page 29: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

설명파라미터

리모트와 연결할 주소나 리모트 Hostname 이다.host

리모트와 연결할 포트 번호이다.post

타임아웃이다 (단위: 초)sec

● 반환값

설명반환값

함수 호출에 성공한 경우소켓 번호

함수 호출에 실패한 경우–1

3.2.7. tcpgw_read

리모트로부터 데이터를 수신하는 함수이다.

● 프로토타입

int tcpgw_read(int fd, char *ptr, int nbytes, int sec, int usec)

● 파라미터

설명파라미터

리모트 소켓 번호이다.fd

데이터가 저장된 버퍼 포인터이다.ptr

리모트로 수신할 데이터 길이이다.nbytes

타임아웃이다.(단위: 초)sec

타임아웃이다. (단위: 백만분의 1초)usec

● 반환값

설명반환값

함수 호출에 성공한 경우데이터 길이

함수 호출에 실패한 경우–1

제3장 사용자 API 함수 15

Page 30: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

3.2.8. tcpgw_write

리모트에 데이터를 전송하는 함수이다.

● 프로토타입

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

● 파라미터

설명파라미터

리모트 소켓 번호이다.fd

데이터가 저장된 버퍼 포인터이다.ptr

리모트로 수신할 데이터 길이이다.nbytes

● 반환값

설명반환값

함수 호출에 성공한 경우데이터 길이

함수 호출에 실패한 경우–1

3.2.9. tcpgw_portno_ipaddr

리모트의 주소와 포트 번호를 얻는 함수이다.

● 프로토타입

int tcpgw_portno_ipaddr(char *ipaddr)

● 파라미터

설명파라미터

리모트 주소가 저장될 버퍼이다.ipaddr

● 반환값

리모트 포트 번호

16 Tmax Gateway Guide (TCP/IP Thread)

Page 31: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

3.2.10. tcpgw_client_id

스레드에 할당된 게이트웨이 환경파일에 입력한 ID를 얻어 오는 함수이다.

● 프로토타입

int tcpgw_client_id (WORKTHRINFO *wthrinfo, char *id)

● 파라미터

설명파라미터

스레드에서 넘겨준 WORKTHRINFO에 대한 포인터이다.wthrinfo

ID가 저장될 버퍼이다.id

● 반환값

사용되지 않음

3.2.11. tcpgw_getaddr_from_winfo

스레드에서 넘겨준 WORKTHRINFO구조체로 부터 리모트의 주소와 포트 번호를 얻는 함수이다.

● 프로토타입

int tcpgw_getaddr_from_winfo(WORKTHRINFO *wthrinfo, char *ipaddr)

● 파라미터

설명파라미터

스레드에서 넘겨준 WORKTHRINFO에 대한 포인터이다.wthrinfo

리모트 주소가 저장될 버퍼이다.ipaddr

● 반환값

리모트 포트 번호

제3장 사용자 API 함수 17

Page 32: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일
Page 33: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

제4장 예제

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

4.1. 서버 모드 Outbound 서비스 호출서버 모드 TCPGWTHR을 통해 리모트에서 Tmax의 서비스를 요청하는 예제이다.

4.1.1. 프로그램 구성

프로그램 구성은 다음과 같다.

● Config file : tmax.m

● Gateway : usrmain.c

● Remote Node : tcpcli1.c

● Tmax Node : svr.c

< tmax.m >

*DOMAIN

res SHMKEY = 88000,

MINCLH = 1,

MAXCLH = 1,

TPORTNO = 8888

*NODE

node1TMAXDIR=”/home/tmax”,

APPDIR=”/home/tmax/appbin”

*SVRGROUP

svg1NODENAME = node1

*SERVER

tcpgwlsn SVGNAME = svg1, MIN=1, MAX=1,

제4장 예제 19

Page 34: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

SVRTYPE = CUSTOM_GATEWAY, RESTART = N,

CLOPT="-- -P 9777 -N 3 -k 91000"

tcpgwhdr SVNAME = svg1, MIN=3, MAX=3, SCHEDULE=RR,

SVRTYPE=CUSTOM_GATEWAY, CPC=10,

CLOPT="-- -P 9777 -N 10 -s –L tcpgwlsn"

svr SVGNAME = svg1

*SERVICE

TESTSVC SVRNAME = svr

<usrmain.c >

#ifdef _WIN32

#include <winsock2.h>

#include <windows.h>

#include <io.h>

#else

#include <pthread.h>

#endif

#include <tcphdr.h>

char sndbuf[4096];

char rcvbuf[4096];

long sndlen, rcvlen;

int errflag;

extern int _portno;

int user_thrmain(WORKTHRINFO *winfo, int server)

{

if (server)

server_process(winfo);

else

client_process(winfo);

return 1;

}

int server_process(WORKTHRINFO *winfo)

{

int n, len, flags;

char tmp[10];

memset(tmp, 0x00, sizeof(tmp));

while (1) {

20 Tmax Gateway Guide (TCP/IP Thread)

Page 35: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

n = tcpgw_select(winfo, 0, 0);

if (n < 0)

return -1;

printf("tcpgw_select: n = %d\n", n);

/* request ffrom tmax service & client */

switch(n) {

case WTHR_TMAX_REQUEST:

len = tcpgw_get_svcdata(winfo, &rcvbuf[4], &errflag, &flags);

if (len < 0) {

if (len == WTHR_CLIENT_CLOSE)

return -1;

printf("service data read failed\n");

return -1;

}

printf("TMAX_REQUEST: length = %d\n", len);

/* no reply */

if (flags)

n = tcpgw_tpreply(winfo, rcvbuf, n, 0);

sprintf(tmp, "%04d", len);

memcpy(rcvbuf, tmp, 4);

len += 4;

n = tcpgw_write(winfo->fd, rcvbuf, len);

if (n < 0) {

printf("remote client closed\n");

return -1;

}

printf("TMAX_REQUEST: remote write ok [%d]\n", n);

n = tcpgw_read(winfo->fd, tmp, 4, 0, 0);

if (n <= 0) {

printf("remote client closed\n");

return -1;

}

len = atoi(tmp);

if (len <= 0)

break;

printf("TMAX_REQUEST: read length = %d\n", len);

n = tcpgw_read(winfo->fd, rcvbuf, len, 0, 0);

if (n <= 0) {

printf("remote client closed\n");

제4장 예제 21

Page 36: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

return -1;

}

if (flags) {

printf("USER_REQUEST: service call length = %d\n", n);

flags = 1;

n = tcpgw_tpcall(winfo, "TESTSVC", rcvbuf, n, rcvbuf, &rcvlen);

}

else {

printf("TMAX_REQUEST: tpcall reply length = %d\n", n);

n = tcpgw_tpreply(winfo, rcvbuf, n, 0);

}

if (n < 0) {

printf("tmax down\n");

return -1;

}

break;

case WTHR_USER_REQUEST:

n = tcpgw_read(winfo->fd, tmp, 4, 0, 0);

if (n <= 0) {

printf("remote client closed\n");

return -1;

}

len = atoi(tmp);

if (len <= 0)

break;

printf("USER_REQUEST: read length = %d\n", len);

n = tcpgw_read(winfo->fd, sndbuf, len, 0, 0);

if (n <= 0) {

printf("remote client closed\n");

return -1;

}

printf("USER_REQUEST: service call length = %d\n", n);

n = tcpgw_tpcall(winfo, "TESTSVC", sndbuf, n, rcvbuf, &rcvlen);

if (n < 0) {

printf("service failed: [%d]\n", n);

}

sprintf(tmp, "%04d", rcvlen);

memcpy(sndbuf, tmp, 4);

memcpy(&sndbuf[4], rcvbuf, rcvlen);

len = rcvlen + 4;

printf("USER_REQUEST: service reply length = %d\n", len);

22 Tmax Gateway Guide (TCP/IP Thread)

Page 37: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

n = tcpgw_write(winfo->fd, sndbuf, len);

if (n < 0) {

printf("remote client closed\n");

return -1;

}

break;

case WTHR_SELECT_TIMEOUT:

/* timeout process */

break;

}

}

return 1;

}

int client_process(WORKTHRINFO *winfo)

{

int fd, portno;

char ipaddr[20];

portno = tcpgw_getaddr_from_winfo(winfo, ipaddr);

/* socket connect */

while (1) {

fd = tcpgw_network_connect(ipaddr, portno, 0);

if (fd > 0)

break;

printf("remote connect failed\n");

#ifdef _WIN32

Sleep(10000);

#else

sleep(10);

#endif

continue;

}

winfo->fd = fd; /* must save */

server_process(winfo);

return 1;

}

<tcpcli1.c >

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

제4장 예제 23

Page 38: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

#ifdef _WIN32

#include <winsock2.h>

#include <windows.h>

#include <io.h>

#else

#include <unistd.h>

#include <netdb.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#endif

#ifdef _WIN32

#define GW_ADDR "host"

#else

#define GW_ADDR "10.10.10.10"

#endif

#define GW_PORT 9777

#define NUM_LOOP 1

#define MAX_MSG 496

#if (defined(_SOCK1) || defined(_SOCK11))

#define _LOBYTE 1

#define _HIBYTE 1

#else

#define _LOBYTE 2

#define _HIBYTE 0

#endif

#ifdef _WIN32

int winsock_init(void)

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(_LOBYTE, _HIBYTE);

err = WSAStartup(wVersionRequested, &wsaData);

if (err != 0) {

/* Tell the user that we couldn't find a usable */

/* WinSock DLL. */

printf("0060 Winsock startup error\n");

return -1;

}

24 Tmax Gateway Guide (TCP/IP Thread)

Page 39: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

/* Confirm that the WinSock DLL supports 2.0.*/

/* Note that if the DLL supports versions greater */

/* than 2.0 in addition to 2.0, it will still return */

/* 2.0 in wVersion since that is the version we */

/* requested. */

if (LOBYTE(wsaData.wVersion) != _LOBYTE ||

HIBYTE(wsaData.wVersion) != _HIBYTE) {

/* Tell the user that we couldn't find a usable */

/* WinSock DLL. */

WSACleanup();

printf("0061 Winsock version check error\n");

return -1;

}

/* The WinSock DLL is acceptable. Proceed. */

return 1;

}

#endif

int _network_connect(char *host, int port)

{

struct sockaddr_in serv_addr;

unsigned int inaddr;

struct hostent *hp;

int i, fd;

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

serv_addr.sin_family = AF_INET;

serv_addr.sin_port = htons(port);

if ((inaddr = (unsigned int) inet_addr(host)) != -1) {

memcpy((char *) &serv_addr.sin_addr, (char *) &inaddr,

sizeof(struct in_addr));

} else {

if ((hp = gethostbyname(host)) == NULL) {

printf("COM3412: host name error: %s ", host);

return(-1);

}

memcpy((char *) &serv_addr.sin_addr, hp->h_addr,

hp->h_length);

}

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

printf("COM3413: can't open stream socket");

return -1;

}

제4장 예제 25

Page 40: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

if (connect(fd, (struct sockaddr *) &serv_addr,

sizeof(serv_addr)) >= 0)

return fd;

close(fd);

return -1;

}

int main(int argc, char *argv[])

{

char gw_addr[256], tmp[10];

int gw_port, fd, i, n, len, num_loop;

char data[MAX_MSG];

strcpy(gw_addr, GW_ADDR);

gw_port = GW_PORT;

num_loop = NUM_LOOP;

if (argc == 2) {

num_loop = atoi(argv[1]);

} else if (argc == 3) {

gw_port = atoi(argv[1]);

num_loop = atoi(argv[2]);

} else if (argc >= 4) {

strcpy(gw_addr, argv[1]);

gw_port = atoi(argv[2]);

num_loop = atoi(argv[3]);

}

#ifdef _WIN32

winsock_init();

#endif

fd = _network_connect(gw_addr, gw_port);

if (fd < 0) {

printf("Connect to (%s:%d) fail \n", gw_addr, gw_port);

return -1;

}

sleep(5);

memset(data, 0x00, MAX_MSG);

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

sprintf(&data[4], "Msg(%d) produced by PID(%d)", i, getpid());

len = strlen(&data[4]);

sprintf(tmp, "%04d", len);

memcpy(data, tmp, 4);

26 Tmax Gateway Guide (TCP/IP Thread)

Page 41: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

len += 4;

n = send(fd, data, len, 0);

if (n != len) {

printf("Sent only %d / %d bytes\n", n, len);

return -1;

}

len = 4;

n = recv(fd, data, len, 0);

if (n != len) {

printf("Recv error %d\n", n);

return -1;

}

memcpy(tmp, data, 4);

tmp[4] = 0x00;

len = atoi(tmp);

if (len <= 0) {

printf("Pid (%d) received %d bytes\n", getpid(), n);

continue;

}

n = recv(fd, data, len, 0);

if (n != len) {

printf("Recv error %d\n", n);

return -1;

}

printf("Pid (%d) received %d bytes\n",

getpid(), n);

sleep(5);

}

return 1;

}

< svr.c >

#include <stdio.h>

#include <usrinc/atmi.h>

TESTSVC(TPSVCINFO *msg)

{

inti;

제4장 예제 27

Page 42: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

printf("TESTSVC service is started!\n");

sleep(1);

printf("OUTPUT: data=%.*s\n", msg->len, msg->data);

printf("TESTSVC service is stoped!\n");

tpreturn(TPSUCCESS,0,(char *)msg->data, msg->len, 0);

}

4.2. 서버 모드 Inbound 서비스 호출서버 모드 TCPGWTHR을 통해 Tmax에서 리모트의 서비스를 요청하는 예제이다.

4.2.1. 프로그램 구성

프로그램 구성은 다음과 같다.

● Config file : tmax.m, tcpgwthr.cfg

● Gateway : usermain.c

● Remote Node : tcpcli2.c

● Tmax Node : toupper.c

< tmax.m >

*DOMAIN

Res SHMKEY = 88000,

MINCLH = 1,

MAXCLH = 1,

TPORTNO = 8888

*NODE

node1TMAXDIR=”/home/tmax”,

APPDIR=”/home/tmax/appbin”

*SVRGROUP

svg1NODENAME = node1

*SERVER

tcpgwlsn SVGNAME = svg1, MIN=1, MAX=1,

SVRTYPE = CUSTOM_GATEWAY, RESTART = N,

28 Tmax Gateway Guide (TCP/IP Thread)

Page 43: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

CLOPT="-- -P 9777 -N 3 -k 91000 \

-F /home/tmax/appbin/tcpgwthr.cfg"

tcpgwhdr SVNAME = svg1, MIN=3, MAX=3, SCHEDULE=RR,

SVRTYPE=CUSTOM_GATEWAY, CPC= 10,

CLOPT="-- -P 9777 -N 10 -s –L tcpgwlsn"

*SERVICE

svcgw SVRNAME = tcpgwhdr

< tcpgwthr.cfg >

# Client IP Server Port Client ID

10.10.10.10 9777SVR0001

< tcpcli2.c >

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#ifdef _WIN32

#include <winsock2.h>

#include <windows.h>

#include <io.h>

#else

#include <unistd.h>

#include <netdb.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#endif

#ifdef _WIN32

#define GW_ADDR "host"

#else

#define GW_ADDR "10.10.10.10"

#endif

#define GW_PORT 9777

#define NUM_LOOP 1

#define MAX_MSG 496

제4장 예제 29

Page 44: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

#if (defined(_SOCK1) || defined(_SOCK11))

#define _LOBYTE 1

#define _HIBYTE 1

#else

#define _LOBYTE 2

#define _HIBYTE 0

#endif

#ifdef _WIN32

int winsock_init(void)

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(_LOBYTE, _HIBYTE);

err = WSAStartup(wVersionRequested, &wsaData);

if (err != 0) {

/* Tell the user that we couldn't find a usable */

/* WinSock DLL. */

printf("0060 Winsock startup error\n");

return -1;

}

/* Confirm that the WinSock DLL supports 2.0.*/

/* Note that if the DLL supports versions greater */

/* than 2.0 in addition to 2.0, it will still return */

/* 2.0 in wVersion since that is the version we */

/* requested. */

if (LOBYTE(wsaData.wVersion) != _LOBYTE ||

HIBYTE(wsaData.wVersion) != _HIBYTE) {

/* Tell the user that we couldn't find a usable */

/* WinSock DLL. */

WSACleanup();

printf("0061 Winsock version check error\n");

return -1;

}

/* The WinSock DLL is acceptable. Proceed. */

return 1;

}

#endif

int _network_connect(char *host, int port)

{

struct sockaddr_in serv_addr;

unsigned int inaddr;

30 Tmax Gateway Guide (TCP/IP Thread)

Page 45: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

struct hostent *hp;

int i, fd;

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

serv_addr.sin_family = AF_INET;

serv_addr.sin_port = htons(port);

if ((inaddr = (unsigned int) inet_addr(host)) != -1) {

memcpy((char *) &serv_addr.sin_addr, (char *) &inaddr,

sizeof(struct in_addr));

} else {

if ((hp = gethostbyname(host)) == NULL) {

printf("COM3412: host name error: %s ", host);

return(-1);

}

memcpy((char *) &serv_addr.sin_addr, hp->h_addr,

hp->h_length);

}

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

printf("COM3413: can't open stream socket");

return -1;

}

if (connect(fd, (struct sockaddr *) &serv_addr,

sizeof(serv_addr)) >= 0)

return fd;

close(fd);

return -1;

}

int main(int argc, char *argv[])

{

char gw_addr[256], tmp[10];

int gw_port, fd, i, n, len, num_loop;

char data[MAX_MSG];

strcpy(gw_addr, GW_ADDR);

gw_port = GW_PORT;

if (argc == 2) {

gw_port = atoi(argv[1]);

}

#ifdef _WIN32

winsock_init();

제4장 예제 31

Page 46: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

#endif

fd = _network_connect(gw_addr, gw_port);

if (fd < 0) {

printf("Connect to (%s:%d) fail \n", gw_addr, gw_port);

return -1;

}

memset(data, 0x00, MAX_MSG);

while (1) {

len = 4;

n = recv(fd, data, len, 0);

if (n != len) {

printf("Recv error %d\n", n);

return -1;

}

memcpy(tmp, data, 4);

tmp[4] = 0x00;

len = atoi(tmp);

if (len <= 0) {

printf("Pid (%d) received %d bytes\n", getpid(), n);

continue;

}

n = recv(fd, &data[4], len, 0);

if (n != len) {

printf("Recv error %d\n", n);

return -1;

}

printf("Pid (%d) received %d bytes\n", getpid(), n);

len = n + 4;

for (i = 4; i < len; i++)

data[i] = toupper(data[i]);

n = send(fd, data, len, 0);

if (n != len) {

printf("Sent only %d / %d bytes\n", n, len);

return -1;

}

printf("Pid (%d) sended %d bytes\n", getpid(), len-4);

}

return 1;

}

32 Tmax Gateway Guide (TCP/IP Thread)

Page 47: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

< toupper.c >

#include <stdlib.h>

#include <string.h>

#include <usrinc/atmi.h>

#include <usrinc/hlinkapi.h>

main(int argc, char *argv[])

{

char *sndbuf, *rcvbuf;

long rcvlen, sndlen;

int ret, len;

TPGWINFO_T gwinfo;

strcpy(gwinfo.svc, "SVR0001");

if (argc != 2) {

printf("Usage: toupper string\n");

exit(1);

}

if ( (ret = tmaxreadenv( "tmax.env","TMAX" )) == -1 ){

printf( "tmax read env failed\n" );

exit(1);

}

if (tpstart((TPSTART_T *)NULL) == -1){

printf("tpstart failed\n");

exit(1);

}

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

printf("sendbuf alloc failed !\n");

tpend();

exit(1);

}

if ((rcvbuf = (char *)tpalloc("CARRAY", NULL, 0)) == NULL) {

printf("recvbuf alloc failed !\n");

tpfree((char *)sndbuf);

tpend();

exit(1);

}

memcpy(sndbuf, &gwinfo, TPGWINFO_SIZE);

제4장 예제 33

Page 48: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

strcpy(sndbuf+TPGWINFO_SIZE, argv[1]);

len = strlen(argv[1]);

len += TPGWINFO_SIZE;

if(tpcall("svcgw", sndbuf, len, &rcvbuf, &rcvlen, 0)==-1){

printf("Can't send request to service svcgw - %d\n", tperrno);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

exit(1);

}

printf("send data: %s\n", sndbuf+TPGWINFO_SIZE);

printf("recv data: %s\n", rcvbuf);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

}

4.3. 클라이언트 모드 Inbound 서비스 호출클라이언트 모드 TCPGWTHR을 통해 Tmax에서 리모트의 서비스를 요청하는 예제이다.

4.3.1. 프로그램 구성

프로그램 구성은 다음과 같다.

● Config file : tmax.m, tcpgwthr.cfg

● Gateway : usrmain.c

● Remote node : tcpsvr2.c

● Tmax node : toupper.c

< tmax.m >

*DOMAIN

res SHMKEY = 88000,

MINCLH = 1,

MAXCLH = 1,

34 Tmax Gateway Guide (TCP/IP Thread)

Page 49: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

TPORTNO = 8888

*NODE

node1 TMAXDIR=”/home/tmax”,

APPDIR=”/home/tmax/appbin”

*SVRGROUP

svg1 NODENAME = node1

*SERVER

clihdrshm SVGNAME = svg1, MIN=1, MAX=1,

SVRTYPE=CUSTOM_GATEWAY,

CLOPT=”-- -N 10 -k 91000 \

-F /home/tmax/appbin/tcpgwthr.cfg”

tcpgwhdr SVGNAME svg1, MIN=10, MAX=10, SVRTYPE=CUSTOM_GATEWAY,

CPC = 9, SCHEDULE = RR,

CLOPT=”-- -k 91000 –L clihdrshm \

-F /home/tmax/appbin/tcpgwthr.cfg”

*SERVICE

svcgw SVRNAME = tcpgwhdr

< tcpsvr2.c >

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#ifdef _WIN32

#include <winsock2.h>

#include <windows.h>

#include <io.h>

#else

#include <unistd.h>

#include <netdb.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#endif

#define GW_PORT 9777

#define NUM_LOOP 1

제4장 예제 35

Page 50: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

#define MAX_MSG 496

#if (defined(_SOCK1) || defined(_SOCK11))

#define _LOBYTE 1

#define _HIBYTE 1

#else

#define _LOBYTE 2

#define _HIBYTE 0

#endif

#define max(a,b) ((a) > (b) ? (a) : (b))

int listen_fd = -1;

int work_fd;

fd_set readfds;

int maxfd = 0;

#ifdef _WIN32

int winsock_init(void)

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(_LOBYTE, _HIBYTE);

err = WSAStartup(wVersionRequested, &wsaData);

if (err != 0) {

/* Tell the user that we couldn't find a usable */

/* WinSock DLL. */

printf("0060 Winsock startup error\n");

return -1;

}

/* Confirm that the WinSock DLL supports 2.0.*/

/* Note that if the DLL supports versions greater */

/* than 2.0 in addition to 2.0, it will still return */

/* 2.0 in wVersion since that is the version we */

/* requested. */

if (LOBYTE(wsaData.wVersion) != _LOBYTE ||

HIBYTE(wsaData.wVersion) != _HIBYTE) {

/* Tell the user that we couldn't find a usable */

/* WinSock DLL. */

WSACleanup();

printf("0061 Winsock version check error\n");

return -1;

}

/* The WinSock DLL is acceptable. Proceed. */

36 Tmax Gateway Guide (TCP/IP Thread)

Page 51: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

return 1;

}

#endif

int network_listen(int portno)

{

int fd;

struct sockaddr_in serv_addr;

int on;

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

return(-1);

on = 1;

if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &on,

sizeof(on)) < 0) {

printf("0062 setsockopt error: SO_REUSEADDR");

}

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((unsigned short)portno);

if (bind(fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {

close(fd);

return(-2);

}

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

close(fd);

return(-3);

}

return(fd);

}

int network_accept(int listenfd)

{

socklen_t len;

int fd, on;

struct sockaddr_in cli_addr;

len = sizeof(cli_addr);

fd = accept(listenfd, (struct sockaddr *) &cli_addr, &len);

if (fd < 0)

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

제4장 예제 37

Page 52: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

return(fd);

}

int main(int argc, char *argv[])

{

char gw_addr[256];

int gw_port, fd, i, n, len, num_loop;

char data[MAX_MSG], *sndbuf;

gw_port = GW_PORT;

if (argc == 2) {

gw_port = atoi(argv[1]);

}

#ifdef _WIN32

winsock_init();

#endif

listen_fd = network_listen(gw_port);

if (listen_fd < 0) {

printf("Connect to (%d) fail \n", gw_port);

return -1;

}

FD_ZERO(&readfds);

FD_SET(listen_fd, &readfds);

maxfd = listen_fd;

while (1) {

errno = 0;

n = select(maxfd + 1, &readfds, NULL, NULL, NULL);

if (n < 0) {

if (errno == EINTR) { /* signal is caught */

continue;

} else {

printf("0080 select error");

return -1;

}

}

if (FD_ISSET(listen_fd, &readfds)) {

if ((fd = network_accept(listen_fd)) < 0) {

printf("0043 socket accept error");

continue;

}

else {

38 Tmax Gateway Guide (TCP/IP Thread)

Page 53: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

work_fd = fd;

FD_SET(fd, &readfds);

maxfd = max(maxfd, fd);

}

}

if (FD_ISSET(work_fd, &readfds)) {

service_process(work_fd);

FD_CLR(work_fd, &readfds);

close(work_fd);

}

}

return 1;

}

int service_process(int fd)

{

int i, n, len;

char tmp[10];

char data[MAX_MSG];

len = 4;

n = recv(fd, data, len, 0);

if (n != len) {

printf("Recv error %d\n", n);

return -1;

}

memcpy(tmp, data, 4);

tmp[4] = 0x00;

len = atoi(tmp);

if (len <= 0) {

printf("Pid (%d) received %d bytes\n", getpid(), n);

return 1;

}

n = recv(fd, &data[4], len, 0);

if (n != len) {

printf("Recv error %d\n", n);

return 1;

}

printf("Pid (%d) received %d bytes\n", getpid(), n);

len = n + 4;

for (i = 4; i < len; i++)

data[i] = toupper(data[i]);

제4장 예제 39

Page 54: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

n = send(fd, data, len, 0);

if (n != len) {

printf("Sent only %d / %d bytes\n", n, len);

return 1;

}

printf("Pid (%d) sended %d bytes\n", getpid(), len-4);

return 1;

}

40 Tmax Gateway Guide (TCP/IP Thread)

Page 55: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

Appendix A. 헤더파일

A.1. TCPHDR.H 파일

#ifndef _TCPHDR_H_

#define _TCPHDR_H_

#ifndef _WIN32

#define __cdecl

#endif

#define CLIENT_ID_SIZE 15

/* THREAD status */

#define WTHR_START 2

#define WTHR_READY 3

#define WTHR_RUNNING 4

/* SELECT status */

#define WTHR_SELECT_ERROR -1

#define WTHR_SELECT_TIMEOUT 1

#define WTHR_TMAX_REQUEST 2

#define WTHR_USER_REQUEST 3

/* READ status */

#define WTHR_CLIENT_CLOSE 0

#define WTHR_READ_ERROR -1

#define WTHR_READ_TIMEOUT -2

/* WRITE status */

#define WTHR_WRITE_ERROR -1

struct workwthrinfo {

int idx;

int status;

int fd;

int portno;

unsigned int ipaddr;

char clientid[CLIENT_ID_SIZE+1];

};

typedef struct workwthrinfo WORKTHRINFO;

Appendix A. 헤더파일 41

Page 56: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

#define SHMHEAD_SIZE sizeof(struct shmhead)

struct shmhead {

char shmdate[8];

int shmsize;

int handler_num;

int maxnum;

int resvd;

};

typedef struct shmhead SHMHEAD;

#define HANDLERINFO_SIZE sizeof(struct handler_info)

struct handler_info {

int status;

int fd;

int svrn;

int pid;

int portno;

int num;

};

typedef struct handler_info HANDLERINFO;

#define CLIENTINFO_SIZE sizeof(struct clientinfo)

struct clientinfo {

int status;

int thridx;

int svridx;

int rcount;

int scount;

int pid;

int portno;

unsigned int ipaddr;

int utime;

int resvd;

char clientid[CLIENT_ID_SIZE+1];

};

typedef struct clientinfo CLIENTINFO;

#if defined(__cplusplus)

extern "C" {

#endif

/* ------------------ function prototypes ------------------- */

int __cdecl tcpgw_tpcall(WORKTHRINFO *wthrinfo, char *svc, char *ptr,

long alen, char *optr, long *olen);

int __cdecl tcpgw_tpacall(WORKTHRINFO *wthrinfo, char *svc, char *ptr, long alen);

int __cdecl tcpgw_tpreply(WORKTHRINFO *wthrinfo, char *ptr, long alen, int err);

int __cdecl tcpgw_select(WORKTHRINFO *wthrinfo, int sec, int usec);

42 Tmax Gateway Guide (TCP/IP Thread)

Page 57: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일

int __cdecl tcpgw_get_svcdata(WORKTHRINFO *wthrinfo, char *ptr, int *err,

int *flags);

int __cdecl tcpgw_network_connect(char *host, int port, int sec);

int __cdecl tcpgw_read(int fd, char *ptr, int nbytes, int sec, int usec);

int __cdecl tcpgw_write(int fd, char *ptr, int nbytes);

int __cdecl tcpgw_portno_ipaddr(char *ipaddr);

int __cdecl tcpgw_getaddr_from_winfo(WORKTHRINFO *winfo, char *ipaddr);

int __cdecl tcpgw_client_id(WORKTHRINFO *winfo, char *id);

#if defined (__cplusplus)

}

#endif

#endif /* _TCPHDR_H_ */

Appendix A. 헤더파일 43

Page 58: Tmax Gateway GuideTCPIP... · TCP/IP 스레드 게이트웨이는 서버 모드 일 경우는 Listener 프로세스와 Handler 프로세스로 구성되며, 클 라이언트 모드일