303
Tmax C Programming Guide Copyright © 2000 TmaxSoft Co., Ltd. All Rights Reserved

Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide

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

Page 2: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

1 Tmax C Programming Guide

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 C Programming Guide

Document Edition Date Version

TMCP-0107-10-400 Jan 7, 2006 Tmax 4.0

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

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

Page 3: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 2

이 책에 관하여… 본 지침서는 개발자가 Tmax 시스템에서 실제 서비스를 제공하는 어플리케이션 프로그램을 개발하는데 있어 필요한 기본적인 지식과 유의할 사항을 제공한다. 이 책은 사용자가 Tmax 시스템에서 사용하는 기본 용어에 대한 지식이 있고 C 를 이용한 개발 환경과 개발 작업에 익숙하다는 가정하에 설명하므로 기본적인 Tmax 시스템 용어의 설명은 Tmax Getting Started Guide 를 참조할 것을 권장한다. 각 API 에 대한 설명과 예제는 Tmax Reference Manual 및 Tmax FDL Refernece Manual 에 좀더 자세하게 다루므로 이를 참조하면 내용 이해에 도움이 될 것이다. 내용중에 Tmax 시스템 환경파일 설정법에 관한 내용이 간단하게 다뤄지므로 이에 대한 자세한 내용이 필요한 사용자는 Tmax Administraion Guide 를 참조하도록 한다. Chapter 1 API 의 요약과 버퍼 타입의 종류, 그리고 통신 유형에 대한 간략한 설명을 기술한다. Chapter 2 기본적인 Tmax 어플리케이션의 제작과 컴파일 방법에 대해 알아본다. Chapter 3 Tmax 시스템의 부가적인 기능을 활용하는 API 와 간단한 예제를 포함한다. Chapter 4 실제로 응용할 수 있는 Tmax 프로그램 예제와 프로그래밍 기법을 포함한다. 관련서

Getting Started Guide Tmax Administration Guide Tmax Reference Guide Tmax FDL Reference Guide

Page 4: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

3 Tmax C Programming Guide

차 례

1 개발에 앞서 ............................................................................................... 7

1.1 TMAX 어플리케이션 소개..................................................................................................................... 7

1.1.1 Tmax 어플리케이션의 구성 ............................................................................................... 7

1.1.2 Tmax 어플리케이션의 특징 ............................................................................................... 8

1.1.3 Tmax 어플리케이션의 흐름 ............................................................................................... 9

1.2 TMAX API ........................................................................................................................................... 13

1.2.1 XATMI API 함수(atmi.h) ................................................................................................... 14

1.2.2 TX 함수(tx.h) .................................................................................................................... 15

1.2.3 비표준 API 함수(tmaxapi.h / ucs.h / ulog.h) .................................................................... 16

1.2.4 필드 버퍼 관련 함수(fbuf.h) ............................................................................................ 20

1.3 TMAX 시스템의 데이터 버퍼.............................................................................................................. 27

1.3.1 데이터 버퍼의 종류.......................................................................................................... 27

1.3.2 Tmax의 데이터 버퍼 관리............................................................................................... 28

1.4 TMAX 시스템의 통신 유형 ................................................................................................................. 30

1.4.1 동기형 통신 ...................................................................................................................... 30

1.4.2 비동기형 통신................................................................................................................... 31

1.4.3 대화형 통신 ...................................................................................................................... 32

2 TMAX 어플리케이션 개발(A) .................................................................. 34

2.1 TMAX 클라이언트 프로그램 ............................................................................................................... 34

2.1.1 Tmax 클라이언트 기본 API ............................................................................................ 34

2.1.2 Tmax 클라이언트 프로그램 컴파일 ................................................................................ 59

2.2 TMAX 서버 프로그램(TCS) ................................................................................................................ 62

2.2.1 TCS 방식 서버 프로그램의 구성.................................................................................... 62

2.2.2 TCS 방식 서버 프로그램 기본 API................................................................................ 63

2.2.3 TCS 방식 서버 프로그램 컴파일.................................................................................... 74

2.3 TMAX 서버 프로그램(UCS)................................................................................................................ 81

2.3.1 UCS 방식 서버 프로그램의 구성 ................................................................................... 81

2.3.2 UCS 방식 서버 프로그램 기본 API ............................................................................... 83

Page 5: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 4

2.3.3 UCS 방식 서버 프로그램 컴파일 ................................................................................... 94

3 TMAX 어플리케이션 개발(B) .................................................................. 96

3.1 대화형 통신 ....................................................................................................................................... 96

3.1.1 대화형 통신의 흐름.......................................................................................................... 97

3.1.2 대화형 통신 API............................................................................................................... 98

3.2 트랜잭션 관리.................................................................................................................................. 108

3.2.1 Tmax 시스템의 트랜잭션 관리 ..................................................................................... 108

3.2.2 트랜잭션 관리 API ......................................................................................................... 109

3.2.3 트랜잭션 관련 에러.........................................................................................................119

3.3 RQ 시스템 ....................................................................................................................................... 122

3.3.1 RQ API ............................................................................................................................ 122

3.4 RDP(REALTIME DATA PROCESSOR)................................................................................................... 130

3.4.1 RDP 방식 서버 프로그램 환경설정 .............................................................................. 130

3.4.2 RDP 방식 서버 프로그램 컴파일 ................................................................................. 131

3.5 브로드 캐스트 / 멀티 캐스트........................................................................................................... 133

3.5.1 클라이언트 정보를 활용하는 API ................................................................................. 133

3.6 이벤트를 활용하는 API ................................................................................................................... 135

3.7 WINDOWS 환경 프로그래밍 ............................................................................................................. 139

3.7.1 tmaxmt.dll........................................................................................................................ 140

3.7.2 WinTmax.dll .................................................................................................................... 148

3.7.3 윈도우즈 환경 어플리케이션의 컴파일......................................................................... 153

3.8 TMAX 보안 시스템 ........................................................................................................................... 155

3.8.1 1단계 보안: 시스템 접속 제어 ...................................................................................... 156

3.8.2 2단계 보안: 사용자 인증 ............................................................................................... 157

3.8.3 3단계 보안: 서비스 접근 제어 ...................................................................................... 159

3.9 디버깅.............................................................................................................................................. 160

3.9.1 API 레벨 에러 처리 ....................................................................................................... 160

3.9.2 시스템 레벨 에러 처리(Uunix.h) ................................................................................... 166

3.9.3 디버그 CLH .................................................................................................................... 169

3.9.4 디버그 라이브러리 ......................................................................................................... 170

4 TMAX 어플리케이션 예제 ..................................................................... 172

Page 6: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

5 Tmax C Programming Guide

4.1 기초 프로그램.................................................................................................................................. 172

4.1.1 동기형 통신 .................................................................................................................... 172

4.1.2 비동기형 통신................................................................................................................. 175

4.1.3 대화형 통신 .................................................................................................................... 180

4.2 DB 적용 프로그램 ........................................................................................................................... 186

4.2.1 오라클 Insert 프로그램 .................................................................................................. 187

4.2.2 오라클 Select 프로그램 ................................................................................................. 191

4.2.3 인포믹스 Insert 프로그램............................................................................................... 199

4.2.4 인포믹스 Select 프로그램 ............................................................................................. 207

4.3 응용 프로그램.................................................................................................................................. 217

4.3.1 글로벌 트랜잭션 처리 프로그램.................................................................................... 217

4.3.2 대화형 모드를 이용한 DB 사용 .................................................................................... 226

5 TMAX CLIENT MULTITHREAD / MULTICONTEXT ............................. 237

5.1 개요 ................................................................................................................................................. 237

5.1.1 Multithread 프로그램이란 무엇인가. ............................................................................. 237

5.1.2 Multicontext 프로그램이란 무엇인가. ............................................................................ 238

5.1.3 Tmax의 Multithread/Multicontext 지원사항 ................................................................... 238

5.2 MULTITHREAD/MULTICONTEXT 구현................................................................................................... 240

5.2.1 Multithread/Multicontext 시작 구문................................................................................ 240

5.2.2 Multithread/Multicontext 구현 구문................................................................................ 241

5.2.3 Multithread/Multicontext 종료 구문................................................................................ 241

5.3 MULTITHREAD/MULTICONTEXT API .................................................................................................... 242

5.3.1 tpgetctxt .......................................................................................................................... 242

5.3.2 tpsetctxt........................................................................................................................... 243

5.4 예제 ................................................................................................................................................. 244

5.4.1 클라이언트 프로그램...................................................................................................... 244

5.4.2 서버 프로그램................................................................................................................. 252

5.4.3 Makefile........................................................................................................................... 252

6 LOCAL RECURSIVE CALL .................................................................. 254

6.1 개요 ................................................................................................................................................. 254

6.2 주의 사항......................................................................................................................................... 254

6.3 예제 ................................................................................................................................................. 254

Page 7: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 6

7 TIP 을 이용한 프로그래밍 .................................................................... 258

7.1 개요 ................................................................................................................................................. 258

7.1.1 TIP 이란 무엇인가 ......................................................................................................... 258

7.2 TIP 의 사용 ..................................................................................................................................... 258

7.2.1 TIP의 구조 ...................................................................................................................... 258

7.2.2 TIP 의 사용 방법 ........................................................................................................... 260

7.2.3 에러의 확인 .................................................................................................................... 261

7.3 TIP을 사용한 예제 프로그램 ........................................................................................................... 262

7.3.1 환경 파일 ........................................................................................................................ 262

7.3.2 필드키 테이블................................................................................................................. 264

7.3.3 클라이언트 프로그램...................................................................................................... 275

8 INDEX.................................................................................................... 294

Page 8: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

7 Tmax C Programming Guide

1 개발에 앞서

1 장 에서는 어플리케이션 개발에 앞서 간단히 Tmax 시스템을 이용하여 개발된 어플리케이션의 대약적인 흐름을 소개하며 이를 통해 얻어지는 장점을 설명한다.

Tmax 어플리케이션 소개

Tmax API

Tmax 시스템의 데이터 버퍼

Tmax 시스템의 통신 유형

1.1 Tmax 어플리케이션 소개

Tmax 시스템은 기본적으로 서버/클라이언트 구조의 서비스 형태에 있어 서버측에는 관리와 개발을 용이하게 하고 클라이언트는 안정적인 서비스를 보장하기 위한 미들웨어로써 현재까지 공공, 금융, 통신, 교육, 군수관리 등 다양한 방면에서 그 안정성과 편리함을 인정받아 왔다.

여기 에서는 어플리케이션 개발에 앞서 Tmax 를 이용한 개발의 특징을 알아보며 Tmax 어플리케이션의 대략적인 흐름을 이해하도록 한다.

1.1.1 Tmax 어플리케이션의 구성

클라이언트 프로그램

클라이언트 프로그램은 서비스를 요청하고, 그 요청에 대한 응답을 서버에서 받아 사용자가 원하는 형식으로 결과를 전달하는 역할을 한다. 클라이언트 프로그램은 사용자 환경 파일의 환경 변수를 참조하여 Tmax 시스템에 접속하며 구조체 버퍼 혹은 필드 버퍼를 사용할 경우 각각에 해당되는 바이너리 파일을 참조한다.

서버프로그램

Page 9: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 8

서버프로그램은 클라이언트의 요청을 받아서 처리하여 적절한 응답을 만드는 역할을 하는 프로그램이다. 서버 프로그램은 Tmax 시스템에서 main() 루틴을 관리하며 개발자는 서비스 루틴만을 작성하면 된다. 서비스 루틴은 Tmax 의 유틸리티를 통해 생성되는 각각의 서비스 테이블과 같이 컴파일 하며 구조체 버퍼를 사용하는 경우 역시 유틸리티를 사용하여 얻어지는 컨버전 루틴도 같이 사용하여야 한다.

1.1.2 Tmax 어플리케이션의 특징

네트웍을 제어하는 루틴은 Tmax API 를 사용하며 이 API 들은 분산처리 국제 표준(X/Open DTP model)을 준수한다. 즉 규격을 준수하는 다른 미들웨어로 개발된 프로그램도 별다른 수정없이 사용할 수 있다.

서버프로그램 개발시 클라이언트의 요청을 처리하는 순수한 서비스 루틴 만을 작성한다. 클라이언트는 일반적인 C 언어 형식대로 프로그램(내부에 main() 루틴을 포함)을 개발한다.

다양한 통신 유형을 제공한다(동기형, 비동기형, 대화형) 동기형은 서비스를 요청하고 응답이 올 때까지 기다리며 비동기 통신은 서비스를 요청하고 원하는 시기에 응답을 받을 수 있다. 대화형 통신은 처음 연결을 설정한뒤 메시지를 주고 받으면서 서비스를 처리한다. 각각의 통신을 위한 API 를 제공하여 복잡한 프로토콜의 처리 없이쉽게 프로그램 개발이 가능하다.

다양한 버퍼를 사용할 수 있다. 타기종간에 데이터 통신을 할 때 개발자는 데이터 무결성을 보장하는데 어려움을 겪는다. 하지만 Tmax 에서는 일곱 가지 유형의 표준 버퍼타입을 지원하여 이러한 문제를 해결하며 개발자에게 선택의 폭을 넓혀준다.

원하는 서비스가 위치하는 정확한 서버의 주소를 몰라도 서비스를 요청할 수 있다.

트랜잭션 처리의 무결성을 제공한다. 프로그램에서는 트랜잭션의 범위만을 설정하면 Tmax 는 2PC (two-phase commit)방식으로 데이터의 무결성을 제공한다.

Page 10: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

9 Tmax C Programming Guide

1.1.3 Tmax 어플리케이션의 흐름

1.1.3.1 클라이언트 프로그램

사용자의 요청을 받아서 서버에 전달하고 서버에서 처리된 결과를 받아서 사용자에게 보여주는 역할을 하는 프로그램이다. 클라이언트는 세가지 통신 유형을 따라 서버로부터 결과를 받아오게 된다.

Tmax 클라이언트 프로그램의 개발 환경

Tmax 클라이언트의 개발환경은 Unix, WindowNT, Windows95/98/2000, Windows 3.1, MS-DOS 등이 가능하며 개발 Tool 은 ANSI C, VC++, BC++, VB, VB .Net, C#, 델파이, 파워빌더, Embedded VC 등을 지원한다. 자세한 내용은 Tmax 4GL Programming Guide 를 참조하도록 한다.

Tmax 클라이언트 프로그램의 흐름

main()

{

1 tpstart_t 버퍼 할당 및 초기화.

2 Tmax 시스템 접속.

3 송/수신 데이터 버퍼 할당.

4 송신 메시지 Buffer 에 유저의 요청 입력.

5 송신 메시지 Buffer 를 서버에 보냄(서비스 요청).

6 서버로부터 응답을 송신 메시지 Buffer 로 받음.

7 원하는 형태로 출력

8 송/수신 메시지 Buffer 제거

9 Tmax 연결해제

}

1,2 : 클라이언트는 제일 먼저 Tmax 시스템에 연결한다. tpstart() 는 환경변수(Tmax 시스템의 주소와 포트 번호)를 읽어서 연결을 설정하며, 연결시 보안등의 이유로 클라이언트의 정보를 넘길 필요가 있을 경우 tpstart_t 버퍼를 할당하여 사용한다.

3 : 원하는 통신버퍼 타입을 선언하고 메모리를 할당한다.

Page 11: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 10

4, 5 : 사용자가 원하는 데이터를 앞서 할당한 버퍼에 입력하고 서비스를 요청한다. 동기, 비동기 및 대화형 통신 방법을 사용한다.

6, 7 : 요청한 서비스에 대한 응답을 받아서 원하는 형태로 결과를 보여준다.

8, 9 : 앞서 할당한 버퍼를 제거하고 Tmax 와의 연결을 해제한다.

Tmax 클라이언트 프로그램의 특징

Tmax 에서는 통신 네트워크, Buffer 관리를 위한 함수들을 제공하여 응용 프로그램 개발을 용이하게 한다. 이 함수들은 라이브러리 형태로 제공되고 응용프로그램과 같이 컴파일 된다.

개발자는 어느 머신의 어느 서버에서 무슨 서비스를 제공하는지 관여하지 않아도 프로그램을 개발할 수 있다.

1.1.3.2 서버 프로그램

사용자의 요청을 받아서 처리하고 그 응답을 클라이언트에게 반환하는 프로그램이다. 일반적인 서버 프로그램인 TCS 방식의 경우 서비스 루틴 안에서 모든 처리가 일어나지만 UCS 방식 서버 프로그램의 경우는 서비스 루틴과 usermain() 을 적절히 사용하여 기존에는 구현하기 힘들었던 다양한 방식의 서비스를 제공할 수 있다.

Tmax 서버 프로그램의 개발 환경

Tmax 응용 서버프로그램의 O/S 환경은 하드웨어와는 무관한 모든 UNIX 기종을 지원한다. 유닉스 표준 편집기 vi 로 개발이 가능하다.

Tmax 서버 프로그램의 흐름(TCS 방식)

Tmax 에서 관리하는 main() 루틴 에서는 명령어 라인에 입력된 인수 처리, 필요할 경우 데이터베이스와의 연결과 해제 작업이 이루어지며 서비스 루틴에서 사용하는 TPSVCINFO 구조체 버퍼를 할당하고 관리한다. TMM, CLH 로 부터 전해지는 메시지를 기다리며 서비스 요청이 오면 데이터를 받아 서비스 루틴을 호출하여 실제 서비스가 이루어지도록 한다.

서비스 루틴은 클라이언트의 요청을 처리한다. main() 에서는 클라이언트에게 받은 서비스 요청을 여러가지 정보와 함께 TPSVCINFO

Page 12: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

11 Tmax C Programming Guide

구조체에 넣어 서비스 루틴에 넘기며 서비스 루틴은 서비스 수행의 결과를 클라이언트에게 넘겨준다.

그림 1 TCS 방식 서버 프로그램의 흐름

Tmax 서버 프로그램의 흐름(UCS 방식)

UCS 방식 서버 프로그램도 TCS 방식과 유사하며 추가적으로 usermain() 루틴을 갖고 있다. UCS 방식의 usermain() 루틴은 다른 명령이 없는 동안

Page 13: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 12

독자적으로 반복적인 작업을 수행하며 스케줄링 API 를 사용하여 CLH 나 TMM 으로부터 오는 명령들을 처리해준다.

그림 2 UCS 방식 서버 프로그램의 흐름

Tmax 서버 프로그램의 특징

Page 14: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

13 Tmax C Programming Guide

Tmax 응용 서버프로그램은 Tmax 에서 관리하는 main() 루틴과 개발자가 작성한 서비스 루틴으로 구성된다. 서버 프로그램은 응용 클라이언트 프로그램처럼 Tmax API 를 이용하여 작성된다. 이 함수들은 라이브러리(libsvr.a libsvr.so)로 제공되며 응용 서버프로그램과 같이 컴파일된다. 프로그래머는 서비스 루틴만을 개발하면 된다.

서버 프로그램은 하나 이상의 서비스로 이루어 지며 한 프로그램 내에서 다른 서버 프로그램의 서비스를 요청할 수도 있다. 클라이언트의 정보와 결과를 모두 보내어 클라이언트의 관리를 넘길 수도 있다.

통신 및 데이터 변환에 있어 사용이 간단한 Tmax API 를 제공하므로 개발자는 따로 프로토콜을 만들거나 복잡한 네트웍 프로그래밍에 대한 지식이 필요가 없어진다. 이는 상당한 개발 및 검증 기간의 단축으로 이어진다.

XA 모드의 경우 데이터베이스 연결과 해제가 Tmax 가 관리하는 루틴에서 이뤄지므로 개발자는 DB 연결과 관리에 대해 신경 쓰지 않아도 된다.

1.2 Tmax API

Tmax API 는 Tmax 어플리케이션 개발을 위해 제공하는 C 함수로써 X/Open 의 XATMI 와 TX 표준을 따른다. 기본적으로 클라이언트-서버간의 다양한 통신 방법을 제공하는 외에도 데이터베이스 관리, 다양한 종류의 버퍼 관리, 보안 설정, 트랜잭션 범위 설정 등 많은 기능을 제공하며 이기종간 통신의 데이터 변환 및 분산 트랜잭션 처리를 대행 해준다.

Tmax API 는 정적 혹은 공유 라이브러리 형태로써 서버와 클라이언트 두종류가 제공되며 어플리케이션 개발시에는 TMAXDIR/usrinc 디렉토리에 있는 헤더 파일을 인클루드하여 사용한다. atmi.h 는 가장 기본적인 버퍼관리 및 통신에 관련된 API 들이 정의되어 있고, tx.h 는 트랜잭션과 데이터베이스와 관련된 API 들이 정의되어 있다. 이외에도 Tmax 고유의 기능을 사용하기 위해 tmaxapi.h 나 ucs.h 를 사용할 수 있으며 필드버퍼를 사용하기 위한 API 들이 정의되어 있는 fbuf.h 등이 존재한다.

Page 15: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 14

1.2.1 XATMI API 함수(atmi.h)

XATMI 는 응용프로그램과 Tmax 간의 인터페이스로서 Buffer 의 할당 및 해제, 서버와 클라이언트 사이의 통신등을 제공한다. 이 API 들은 X/Open DTP 의 표준을 준수한다.

함 수 함수 이름 기 능

tpalloc() 데이터를 송수신할 Buffer 를 할당한다.

tprealloc() Buffer 의 크기를 변경한다.

tpfree() 할당된 Buffer 를 해제시킨다.

버퍼 관리 함수

tptypes() Buffer 의 유형 및 크기에 대한 정보를 제공한다.

tpcall() 서비스를 요청하고 응답이 올 때까지 기다린다.

tpacall() 서비스를 요청한 후 다른 일을 처리한다. tpgetrply() 호출로 처리결과를 수신한다.

tpcancel() 어떤 서비스 요청에 대한 응답을 취소한다.

서비스 요청

응답관련 함수

tpgetrply() tpacall()의 호출에 대한 응답을 받는다.

대화형 함수 tpconnect() 대화형 모드로 서비스와 연결을 설정한다.

Page 16: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

15 Tmax C Programming Guide

tpdiscon() 대화형 모드 서비스와 연결을 비정상적으로

종료한다.

tprecv() 대화형 모드에서 메시지를 수신한다.

tpsend() 대화형 모드에서 메시지를 송신한다.

서비스 종료 관련 함수

tpreturn() 서비스 요청에 대한 응답을 클라이언트에게

보내고 서비스 루틴을 종료한다.

표 1 XATMI API Function

1.2.2 TX 함수(tx.h)

TX 는 응용프로그램과 Tmax 간의 인터페이스로서 트랜잭션 범위를 설정하고 트랜잭션을 수행한다. 이 API 들은 X/Open DTP 표준을 준수한다.

함 수 함수 이름 기 능

tx_begin() 트랜잭션을 시작한다.

tx_commit() 트랜잭션을 저장한다.

tx_rollback() 트랜잭션을 원상태로 회복시킨다.

트랜잭션

관리함수

tx_open() resource manager 를 연다. (내부적으로

작동됨)

Page 17: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 16

tx_close() resource manager 를 닫는다. (내부적으로

작동됨).

tx_set_transaction_timeout()

트랜잭션 처리시 사용될 시간을 설정한다.

tx_info() 전역(global) 트랜잭션에 대한 정보를

리턴한다.

tx_set_commit_return()전역(global) 트랜잭션의 승인시점을

지정한다.

tx_set_transaction_control()

한 트랜잭션 완료시 자동으로 새로운 트랜잭션을 시작한다.

표 2 TX Functions

1.2.3 비표준 API 함수(tmaxapi.h / ucs.h / ulog.h)

비표준 API 는 다양한 어플리케이션 개발을 위한 Tmax 고유의 API 들로 UCS, RQ, 비요청 데이터 처리, 사용자 로그등 다양한 기능을 제공한다.

함 수 함수 이름 기 능

비요청

데이터 tpbroadcast()

서버나 클라이언트에서 시스템에 기록된 다수의 클라이언트 혹은 특정

클라이언트에게 일방적으로 비요청 데이터를 송신한다.

Page 18: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

17 Tmax C Programming Guide

함 수 함수 이름 기 능

tpsendtocli() Tmax 시스템에 연결된 특정

클라이언트에게 일방적으로 비요청 데이터를 송신한다.

tpnotify() 서버가 클라이언트 각자에게 일방적으로

비요청 데이터를 송신한다.

tpsetunsol() 비요청 데이터를 처리하는 함수를

지정한다.

tpgetunsol() 비요청 데이터를 수신한다.

tpsetunsol_flag() 알림 메시지를 수락하는 플래그를

설정한다.

tpchkunsol() 비요청 메시지의 도착을 확인한다.

tpstrerror() 에러 번호에 대한 스트링 메시지를

확인한다.

userlog() 지정된 메시지를 ulog 파일에 기록한다. ulog 파일은 Tmax 시스템 환경 파일에

지정된 ULOGDIR 에 생성된다.

에러 관련 함수

ulogsync() 메모리 Buffer 에 있는 ‘ulog’ 내용을

디스크에 저장한다.

Page 19: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 18

함 수 함수 이름 기 능

UserLog() userlog() + ulogsync()

gettperrno() Tmax 시스템 호출에서 발생한 에러넘버(tperrno)를 반환한다.

gettpurcode() 개발자가 설정한 urcode 를 반환한다.

tperrordetail() 시스템 호출에서 발생한 에러에 관한

세부적인 정보를 얻는다.

tpgetpeer_ipaddr() 클라이언트의 IP 주소를 제공한다.

tpgetpeername() 클라이언트의 name 을 확인한다. 소켓 정보 관련 함수

tpgetsockname() 클라이언트의 소켓 이름 제공한다.

블록 타임 아웃 설정

함수 tpset_timeout() 블록 타임 아웃을 설정한다.

장애 대책 함수

tptobackup() 백업 머신으로 연결을 맺는다.

연결 함수 tpstart() Tmax 시스템과의 연결 시작한다.

Page 20: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

19 Tmax C Programming Guide

함 수 함수 이름 기 능

tpend() Tmax 시스템과의 연결 종료한다.

tpenq() RQ 에 데이터를 저장한다.

tpdeq() RQ 로부터 데이터를 추출한다.

tpqstat() RQ 에 저장된 데이터 통계정보를 획득한다.RQ

tpextsvcname() RQ 에 저장된 데이터의 서비스 이름을

얻는다.

tmaxreadenv() 환경 변수를 파일로부터 읽는다.

tpputenv() 환경 변수값을 설정한다.

Set and Get

Environment

tpgetenv() 환경 변수에 대한 설정 값을 반환한다.

tpscmt() 트랜잭션 commit 모드를 변경 및 설정한다.

tpgetlev() 트랜잭션 모드 여부를 확인한다.

기 타

tpchkauth() 인증에 대한 설정여부를 확인한다.

Page 21: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 20

함 수 함수 이름 기 능

tpgprio() 설정된 우선 순위를 확인한다.

tpsprio() 우선 순위를 설정한다.

tpsleep() 지정된 시간 안에 메시지가 도착할 때까지

기다린다.

tp_sleep() 데이터의 도착을 초단위로 기다린다.

tp_usleep() 데이터의 도착을 백만분의 1 초 단위로

기다린다.

tpschedule() UCS 유형의 프로세스에서 TCS 채널을

검사한다.

tpuschedule() UCS 유형의 프로세스에서 TCS 채널을

검사한다.

표 3 Non-Standard API Functions

1.2.4 필드 버퍼 관련 함수(fbuf.h)

필드 버퍼는 Tmax 가 제공하는 버퍼 타입중 하나로 필드키와 데이터 값을 쌍으로 관리하여 유동적인 데이터 처리에 적합하다. 자세한 설명은 Tmax FDL Reference Manual 를 참조한다.

함 수 함수 이름 기 능

Page 22: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

21 Tmax C Programming Guide

함 수 함수 이름 기 능

fbget_fldkey() 필드이름에 대한 필드키(fieldkey) 값을

반환한다.

fbget_fldname() 필드키에 대한 이름을 반환한다.

fbget_fldno() 필드키로부터 해당 필드키 번호를 가져온다.

fbget_fldtype() 필드키로부터 필드형(type)을

가져온다.(정수값 리턴)

필드키

사상 함수

fbget_strfldtype()필드키로부터 형(type)에 대한 포인트 값을

가져온다.

fbisfbuf() 할당된 버퍼가 필드 버퍼인지 확인한다.

fbinit() 필드 버퍼로 할당된 메모리 공간을 초기화

시킨다.

fbcalcsize() 필드 버퍼의 크기를 계산한다.

fballoc() 필드 버퍼를 동적으로 할당한다.

Buffer

할당 함수

fbfree() 필드 버퍼를 해제한다.

Page 23: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 22

함 수 함수 이름 기 능

fbget_fbsize() 바이트 단위로 필드 버퍼 크기를 반환한다.

fbget_unused() 사용되지 않는 필드 버퍼 공간을 체크한다.

fbget_used() 사용중인 필드 버퍼 공간을 바이트(byte) 수

단위로 반환한다.

fbrealloc() 버퍼의 크기를 다시 줄이거나 늘릴 때

사용한다.

fbput() 필드 버퍼에 필드키 값을 추가하거나 덧붙일

때 사용된다.

fbinsert() 필드 버퍼에 있는 필드키의 필드 값을 지정된 필드키와 포지션에 저장한다.

fbchg_tu() 내용을 전송하기 전에 지정된 필드 버퍼에

내용을 이동한다.

fbdelete() 버퍼의 필드내용을 삭제한다.

fbdelall() 필드에 들어있는 모든 값들을 지운다.

필드 접근

수정 함수

fbdelall_tu() 필드키 어레이(fieldkey[])에 기재되어 있는

필드의 모든 내용을 지운다.

Page 24: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

23 Tmax C Programming Guide

함 수 함수 이름 기 능

fbget() 버퍼에 들어있는 필드 내용을 얻는다.

fbgetf() 필드 버퍼에 있는 지정된 필드키의 필드

값을 얻는다.

fbget_tu() 지정된 필드키의 값을 지정된 필드 순번에서

얻는다.

fbnext_tu() 필드 버퍼에서 지정된 필드키의 필드 값을

연속적으로 얻는다.

fbgetalloc_tu() 리턴된 데이터를 저장하기 위해 다른 버퍼를

내부적으로 할당하고 버퍼에게 단지 포인터만 반환한다.

fbgetval_last_tu()필드 버퍼에서 지정한 필드키에 있는 필드

데이터 중 마지막 데이터 값을 얻는다.

fbgetlast_tu() 필드 버퍼에서 지정한 필드키의 마지막

순번의 데이터를 리턴한다.

fbgetnth() 지정된 필드 값을 찾는다.

fbfldcount() 지정된 버퍼안에 포함된 필드 개수를

반환한다.

Page 25: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 24

함 수 함수 이름 기 능

fbkeyoccur() 필드키로 지정된 필드의 개수를 반환한다.

fbispres() FBUF 의 지정된 필드안에 요청된 내용이

있는지 검사한다.

fbgetval() 요청된 내용의 크기를 반환하고, 위치는

포인터로 리턴한다.

fbgetvall_tu() 필드의 실값을 long 값으로 반환한다.

fbupdate() 필드 버퍼에 있는 필드키의 필드 값을

지정된 순번에 갱신한다.

fbgetlen() 필드버퍼의 선택된 필드키에 맞는 필드

데이터의 첫번째 어커런스의 길이를 반환해준다.

fbtypecvt() 데이터 형을 변환시켜 준다.

fbputt() 새로운 데이터 값을 데이터 형과 같이 필드

버퍼에 덧붙여 준다.

변환 함수

fbget_tut() 필드 데이터를 지정한 필드 순번에 넣는다.

그리고 필드키의 타입을 지정한다.

Page 26: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

25 Tmax C Programming Guide

함 수 함수 이름 기 능

fbgetalloc_tut() 리턴된 데이터를 정의된 데이터 타입으로

변환하여 저장하기 위해 다른 버퍼를 내부적으로 할당한다.

fbgetvalt() 변환된 값에 포인터를 리턴한다.

fbgetvali() 어느 필드 데이터이든지 정수형으로

리턴한다.

fbgetvals() 어느 필드 데이터이든지 문자형으로

리턴한다.

fbgetvals_tu() 지정한 필드키의 필드 순번에 해당하는 필드

데이터를 문자형으로 리턴한다.

fbgetntht() 변형된 값을 리턴한다.

fbchg_tut() 필드키의 값을 필드 버퍼에 있는 다른 정의된 시작 순번에 있는 것과 바꾼다.

fbbufop() 두 필드 버퍼의 내용을 비교, 복사, 이동,

변경한다. 버퍼 조작 함수

fbbufop_proj() 필드키에 해당되는 버퍼를 변경한다.

Page 27: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 26

함 수 함수 이름 기 능

fbread() 파일로부터 필드 버퍼를 읽는다.

이 함수는 표준 I/O 라이브러리에 사용된다.

fbwrite() 파일에 적는다.

이 함수는 표준 I/O 라이브러리에 사용된다.

fbprint() 표준 I/O 에 버퍼 내용을 출력한다.

I / O

fbfprint() 필드 버퍼에 있는 활용가능한 데이터를 파일

스트림에 출력

fbstrerror() 필드 버퍼 조작시 에러 내용을 문자열로

얻는다. 에 러

getfberrno() 에러가 나타나면 에러 넘버로 리턴한다.

fbmake_fldkey() 새로운 필드키를 동적으로 생성하지만

FDLFILE 에는 써넣지 않는다.

fbftos() 필드 버퍼에 저장된 데이터를 C

구조체(stname)에 전송한다.

기 타

fbstof() C 구조체에 저장된 데이터를 구조체 파일로

쌓여져 있는 필드 버퍼로 전송한다.

Page 28: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

27 Tmax C Programming Guide

함 수 함수 이름 기 능

fbsnull() 필드 버퍼에 위치한 C 구조체의 선택된

필드키의 구조체의 멤버 변수가 NULL 인지 확인

fbstelinit() 필드 버퍼에 위치한 C 구조체의 각각의 멤버

변수를 NULL 로 초기화

fbstinit() 필드 버퍼에 위치한 C 구조체를 NULL 로

초기화한다.

표 4 FIELD Buffer Functions

1.3 Tmax 시스템의 데이터 버퍼

다수의 서버를 운영하면서 서로 다른 하드웨어 및 운영체제 간에 데이터를 교환할 필요가 있을 경우 플랫폼마다 메모리 할당 방식의 차이로 생기는 문제점을 극복하기 위해서는 모든 플랫폼에 대한 상세한 지식과 더불어 데이터를 전환하는 복잡한 과정이 필요하다. Tmax 는 다양한 종류의 표준 버퍼를 제공하여 이러한 문제를 해결하며 불필요한 네트웍 부하를 줄이고 개발자의 선택의 폭을 넓히며 개발기간을 단축하는 등의 부가적인 장점이 있다.

1.3.1 데이터 버퍼의 종류

STRING 버퍼

널 값으로 끝나는 문자열로써 따로 버퍼의 길이를 명시할 필요가 없다. 플랫폼의 차이로 인한 문제는 발생하지 않는다.

CARRAY , X_OCTET 버퍼

Page 29: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 28

길이가 지정된 바이트열로써 보통 바이너리 타입의 데이터를 보낼 때 사용되며 데이터 교환시에는 반드시 길이를 명시해야 한다. 플랫폼의 차이로 인한 문제는 발생하지 않는다.

STRUCT , X_C_TYPE 버퍼

C 언어의 구조체를 데이터 통신에 사용하고자 할때 사용한다. 구조체의 멤버로는 모든 원시 타입을 사용할 수 있으며 선언된 구조체 자체도 멤버로 사용할 수 있다. 또한 구조체의 배열도 사용할 수 있다.

X_COMMON 버퍼

멤버 타입이 char, int, long 으로 한정된 구조체이다.

필드 버퍼

필드키와 데이터 값을 한쌍으로 관리하는 데이터 버퍼로 모든 원시 타입의 데이터를 담을 수 있다. 교환되는 데이터형이 유동적일 경우 사용하며 다양한 방법의 데이터 접근 및 변환 API 를 제공한다.

1.3.2 Tmax 의 데이터 버퍼 관리

Tmax 는 버퍼의 무결성을 보장하기 위해 표준 통신형 버퍼를 사용한다. 표준 통신형 버퍼는 통신 이전에 데이터 타입과 메모리 할당 방식에 기준을 정하여 사용하는 것이다. 데이터를 송신하기 전에 로컬 버퍼의 데이터를 표준 통신형 버퍼로 변환하여 보내면 이를 수신한 측은 다시 해당 테이블을 참조하여 역변환할 수 있다.

이러한 과정을 통해 이기종간의 통신시에도 문자열이나 바이트열 뿐만 아니라 플랫폼마다 다른 원시 타입의 데이터형을 사용하는 구조체 버퍼나 필드 버퍼를 아무런 제약 없이 사용할 수 있게 된다.

1.3.2.1 구조체 버퍼

개발자는 사용하고자 하는 구조체를 구조체 파일(xxx.s) 파일에 기록하며 이 파일은 변환 테이블과 변환 프로그램을 만드는 기반이 된다. 구조체 파일에는 typdef 나 include 와 같은 명령어는 사용할 수 없으며 구조체의 멤버는 모든 원시 타입 데이터와 구조체를 사용할 수 있다.

구조체 버퍼를 표준 통신형으로 사용하기 위해서는 Tmax 에서 제공하는 sdlc 프로그램을 사용하여 표준 통신형 데이터로의 변환을 위한 정보 테이블과 표준

Page 30: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

29 Tmax C Programming Guide

통신형 변환/역변환 프로그램을 생성해야 한다. 변환/역변환 프로그램은 개발된 서비스 루틴과 함께 컴파일하여 사용하며 정보 테이블은 구조체 사용시 자동으로 사용된다.

다음의 그림은 구조체를 이용한 어플리케이션 개발시 서버/클라이언트 프로그램의 컴파일 순서이다.

그림 3 구조체 버퍼를 이용하는 어플리케이션의 작성

1.3.2.2 필드 버퍼

개발자는 사용하고자 하는 필드 버퍼를 필드 버퍼 파일(xxx.f) 파일에 기록하며 이 파일은 변환 테이블을 만드는 기반이 된다.

필드 버퍼를 표준 통신형으로 사용하기 위해서는 Tmax 에서 제공하는 fdlc 프로그램을 사용하여 정보 테이블을 생성하며 이 테이블은 필드버퍼 사용시 자동적으로 사용된다.

다음의 그림은 필드버퍼를 이용한 어플리케이션 개발시 서버/클라이언트 프로그램의 컴파일 순서이다.

Page 31: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 30

그림 4 필드 버퍼를 사용하는 어플리케이션의 작성

1.4 Tmax 시스템의 통신 유형

통신 유형이란 서버와 클라이언트가 데이터를 주고 받는 방법이다. 클라이언트와 서버가 구현하는 로직의 배분이나 방법에 따라 사용자는 크게 세가지의 방법을 사용할 수 있다. 첫번째는 동기형으로써 클라이언트는 서버가 응답을 줄때까지 기다린다. 두번째는 비동기형으로써 클라이언트는 서비스를 요청한 후 원하는 시점에 응답을 받을 수 있다. 세번째는 대화형으로써 클라이언트는 한번 서버에 연결하면 이벤트에 적절히 대응하며 데이터를 주고 받을수 있다.

동기형과 비동기형은 클라이언트가 메시지를 받는 방법을 기준으로 구분한 것으로 서버 프로그램측에서 볼때 서로 다른점은 없다. 그러나 대화형 통신일 경우 서버와 클라이언트 프로그램은 프로토콜을 따라 메시지를 주고 받으므로 서로 긴밀하게 개발되어야 할 필요가 있다.

1.4.1 동기형 통신

동기형 통신은 클라이언트가 서비스를 요청하고 설정된 타임아웃 시간동안 응답을 기다린다.

아래 그림은 동기형 통신을 사용하는 서비스의 흐름을 보여준다.

Page 32: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

31 Tmax C Programming Guide

그림 5 동기형 통신 모델

클라이언트는 tpcall() API 를 이용하여 서비스 요청 및 응답을 받는다.

클라이언트는 요청에 대한 응답을 받을때 까지 블록상태로 기다린다.

하나의 서버 프로세스는 클라이언트 하나의 요청을 처리한다.

1.4.2 비동기형 통신

비동기형 통신은 클라이언트가 서비스를 요청하고 응답을 받고자 할 때 해당 요청에 대한 응답을 받는다. 클라이언트는 그 시간 동안 다른 작업을 수행 할 수 있다.

아래 그림은 비동기형 통신을 사용하는 서비스의 흐름을 보여준다.

Page 33: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 32

그림 6 비동기형 통신 모델

클라이언트는 tpacall() API 를 이용하여 서비스를 요청한다. 이때 리턴되는 cd 값으로 해당 요청에 대한 응답을 구별할 수 있으므로 여러번 호출하는 것도 가능하다.

클라이언트는 앞서 받은 cd 로 tpgetrply() API 를 이용하여 해당 요청에 대한 응답을 받는다.

서비스를 요청하면 서버는 cd 값을 리턴하며 클라이언트는 응답을 받을 때 이 값을 사용한다.

1.4.3 대화형 통신

대화형 통신은 클라이언트와 서버가 연결을 설정하고 이벤트값을 이용하여 데이터의 송/수신측을 결정하며 이로써 지속적으로 데이터를 주고 받는다.

아래 그림은 대화형 통신을 사용하는 서비스의 흐름을 보여준다.

Page 34: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

33 Tmax C Programming Guide

그림 7 대화형 통신 모델

tpconnect() 로 연결한 후, tpsend() 와 tprecv() 를 호출하여 데이터를 주고 받는다

연결을 성공하면 서버는 cd 값을 리턴하며 클라이언트는 데이터를 주고 받는데 이 값을 사용한다.

데이터 송신의 주체는 플래그를 이용하여 결정하며 이 플래그 값에 의해 발생하는 이벤트에 따라 적절히 대응해 주어야 한다.

Page 35: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 34

2 Tmax 어플리케이션 개발(A)

2 장 에서는 실제 어플리케이션 개발에 앞서 가장 기본적인 API 의 사용법과 간단한 예제를 제시하며 개발된 프로그램을 컴파일 하여 실행파일을 만드는 과정을 설명한다.

Tmax 클라이언트 프로그램

Tmax 서버 프로그램(TCS)

Tmax 서버 프로그램(UCS)

2.1 Tmax 클라이언트 프로그램

클라이언트 프로그램은 사용자의 요청을 받아 Tmax 시스템에 서비스를 요청하고 받은 결과를 다시 사용자에게 보여주는 역할을 한다. Tmax 의 클라이언트 API 는 복잡한 네트웍 프로그래밍을 간단하게 처리해 주므로 개발자의 부담을 줄여주며 프리젠테이션 로직에만 전념할 수 있도록 한다.

2.1.1 Tmax 클라이언트 기본 API

아래는 클라이언트에서 사용할 수 있는 API 중 기본적인 것만을 요약한 것이다. API 들에 대한 상세한 설명은 Tmax Reference Manul 을 참고하도록 한다.

함 수 이 름 기 능

tpstart() Tmax 시스템에 접속한다. 연결 및 연결 해제

함수 tpend() Tmax 시스템과의 접속을 끊는다.

Page 36: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

35 Tmax C Programming Guide

tpalloc() 데이터를 송수신할 버퍼를 할당한다.

tpfree() 할당된 버퍼를 해제시킨다. 버퍼 관리

함수

tptypes() 할당된 버퍼의 타입과 서브타입을 조사한다.

tpcall() 서비스를 요청하고 결과값이 올 때까지

기다린다.

tpacall() 서비스를 요청하고 바로 리턴한다. tpgetrply()

호출로 요청 결과를 수신할 때까지 다른 일을 처리할 수 있다.

tpcancel() tpacall() 로 부른 서비스의 요청을 취소한다.

서비스 요청

응답 처리

함수

tpgetrply() tpacall() 의 호출에 대한 결과값을 받는다.

tpsetunsol_flag()

비요청 메시지 처리 방법을 설정한다.

tpsetunsol() 비요청 메시지 핸들러를 설정한다.

비요청 메시지

처리 함수

tpgetunsol() 비요청 메시지를 받는다.

표 5 클라이언트 기본 API

2.1.1.1 연결 및 연결 해제 함수

Tmax 시스템과의 연결과 연결 해제를 위한 API 들을 소개한다. 몇몇 API 들은 Tmax 와 연결이 되어 있지 않을 경우 내부적으로 접속을 시도하므로 반드시 Tmax 와 연결을 맺은후 다른 API 를 사용할 것을 권장한다.

Page 37: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 36

tpstart

int tpstart (TPSTART_T *tpinfo)

tpinfo

Tmax 시스템에 클라이언트의 정보를 넘길 필요가 있을 경우 사용하는 구조체로 tpalloc() 으로 할당하여 사용해야 한다. 그럴

필요가 없을 경우는 NULL 값을 넣어도 무방하다. 구조체의 멤버는 아래와 같다.

char cltname[MAXTIDENT + 2] MAXTIDENT=16

- 비요청 메시지 수신시 사용되는 사용자 구별 이름

char

dompwd[MAX_PASSWD_LENGTH+2]MAX_PASSWD_LENGTH

= 16

- 시스템 접속 제어 보안(1 단계 접속보안)을 위한 암호

char usrname[MAXTIDENT + 2]

- 사용자 인증 보안을 위한 사용자 계정(2 단계 접속 보안)

usrpwd[MAX_PASSWD_LENGTH + 2]

- usrname 에 해당하는 암호

int flags

- 비요청 메시지 유형과 시스템 접근 방법 결정

Tmax 시스템에 접속하는 API 이다. 클라이언트는 서비스 요청이나 비요청 메시지 핸들러를 설정하기 전에 Tmax 시스템에 접속된 상태이어야 하며 그렇지 않은 상태에서 서비스를 요청하거나 비요청 메시지 핸들러를 설정하는 경우 자동적으로 라이브러리 내부에서 tpstart(NULL) 를 수행하게 된다. tpstart() 는 Tmax 시스템에 클라이언트의 정보를 넣어서 넘길 수 있다.

Page 38: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

37 Tmax C Programming Guide

cltname 은 최대길이 18 자이며, NULL 로 끝나는 문자열이다. cltname 은 사용자 임의로 정하며 tpbroadcast() 등의 인자로 사용된다.

dompwd 는 접속 하고자 하는 Tmax 시스템의 단일 암호이다. 만약 시스템 접속 보안이 설정된다면 이 항목에 Tmax 환경파일 중 *DOMAIN 절의 OWNER 항목에 지정된 계정에 해당하는 암호를 등록하면 된다. 암호를 옳게 등록하여야만 시스템 접속에 성공한다. 특별히 등록하지 않으면 NULL 로 전달된다.

usrname, usrpwd 는 사용자 인증 보안을 위해 사용되는 항목이다. 만약 사용자 인증 보안이 설정된다면, Tmax 시스템에 인증 가능한 계정과 그에 해당하는 암호를 각각 등록하면 된다. 이를 등록하지 않거나 인증된 사용자가 아니면 Tmax 시스템 접속에 실패한다. 특별히 등록하지 않으면 NULL 로 전달된다.

flags 는 자발적인 메시지 처리와 시스템 접근 방법을 결정하기 위해 사용한다.

TPUNSOL_HND : 비요청 메시지를 받으며 핸들러를 통해 이를 처리한다. 핸들러가 설정되어 있지 않으면 메시지는 버려진다.

TPUNSOL_IGN : 비요청 메시지를 무시한다. 받은 메시지는 버려진다.

TPUNSOL_POLL : 비요청 메시지를 받는다.

위와 같이 TPSTART_T 버퍼를 사용하겠다면 tpstart() 를 호출하게 전에 tpalloc() 으로 버퍼를 할당해야 한다. 버퍼타입은 tpstart() 만을 위한 TPSTART 로 지정하여야 한다. TPSTART_T 구조체는 atmi.h 헤더 파일에 선언되어 있다.

tpend

int tpend (void)

인수 없음

Tmax 시스템과의 접속을 해제한다. 호출 시점이 트랜잭션의 범주에 속한다면 해당 트랜잭션은 롤백된다.

Page 39: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 38

<<Ex 1>>

# include <usrinc/atmi.h>

# include <usrinc/tmaxapi.h>

main ( )

{

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

error processing routine

}

buffer 할당.

사용자 입력을 받아 서비스 함수를 호출

서버로 부터 응답을 받음

. . . . .

buffer 해제.

if (tpend() == -1 ) {

error processing routine

}

}

<<Ex 2>> # include <usrinc/atmi.h>

# include <usrinc/tmaxapi.h>

main()

{

TPSTART_T *tpinfo;

/* TPSTART Buffer 할당 */

if((tpinfo = (TPSTART_T *)tpalloc(“TPSTART”, NULL,

sizeof(TPSTART_T)))

== NULL){

error processing routine

}

/* TPSTART_T 구조체 항목 */

Page 40: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

39 Tmax C Programming Guide

strcpy(tpinfo->dompwd, “tmax1234”);

strcpy(tpinfo->usrname, “tmax”);

strcpy(tpinfo->usrpwd, “tmax1234”);

/* Tmax 시스템에 접속 */

if(tpstart(tpinfo) == -1){

error processing routine

}

. . . . .

tpend( ) ;

}

2.1.1.2 버퍼 관리 함수

Tmax 시스템과 데이터를 주고 받기 위해서는 먼저 Tmax 시스템이 인식할 수 있는 버퍼를 설정하여야 한다. 일반적인 malloc() 등으로 할당된 버퍼는 데이터를 주고 받는 용도로는 사용할 수 없다. 여기에서는 버퍼를 할당하고 해제하는 등의 기본적인 API 를 소개한다.

tpalloc

int tpalloc (char *type, char *subtype, long size)

type

할당할 버퍼의 타입을 지정한다. STRING, CARRAY, STRUCT, FIELD, X_C_TYPE, X_COMMON, X_OCTET,

TPSTART 와 턱시도 호환을 위한 FML, FML32, VIEW, TPINIT 등이 지원된다.

subtype 구조체형 버퍼(X_C_TYPE, X_COMMON, STRUCT, VIEW) 를 사용할 경우 구조체의 이름을 지정한다. 기타의 경우

NULL 로 지정한다.

size 버퍼의 크기(Byte)를 지정한다. TPSTART 와 TPINIT 이외의 타입일 경우 1024 이하의 크기는 1024 로

지정된다.

Page 41: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 40

Tmax 시스템과의 통신을 위한 버퍼를 할당한다. 송신 및 수신을 위한 모든 버퍼는 tpalloc() 을 통해 할당되어야 한다. 호출이 성공하면 char 타입의 포인터를 반환한다. 따라서 STRING, CARRAY, X_OCTET 이외의 타입 버퍼는 적절한 형변환을 해주어야 한다. 호출이 실패하면 NULL 포인터를 반환한다. 에러는 지정되지 않은 버퍼타입을 사용하거나 구조체형 버퍼 사용시 존재하지 않는 subtype 을 지정했을 경우에 주로 발생한다.

< Ex 1>

struct account *accp;

. . .

accp = (struct account *) tpalloc(“X_C_TYPE”, “account”,

sizeof(struct account));

/* X_C_TYPE 타입은 subtype 을 지정하여야 함. */

< Ex 2 >

char *data;

long datalen;

. . .

datalen = 2048;

data = tpalloc(“CARRAY”, NULL, datalen);

< Ex >

char *data;

. . .

data = tpalloc(“STRING”, NULL, 0);

/* size 가 0 이면 디폴트로 1024 Byte 가 할당 됨. */

< Ex 3 >

Page 42: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

41 Tmax C Programming Guide

. . .

/* C 언어 구조체인 경우에는 반드시 적합한 형 변환. */

if ((strdata = (struct strdata *)tpalloc(“STRUCT”, “strdata”,

sizeof(struct strdata))) == NULL){

fprintf(stderr, “tpalloc failed\n”);

exit(0) ;

}

strdata->id = cltid;

strdata->passwd = cltpasswd;

strcpy(strdata->msg, cltmsg);

...

<<Ex 5>> ....

FBUF *sndbuf, *rcvbuf;

char sndata[30], rcvdata[30];

....

if ((sndbuf = (FBUF *)tpalloc("FIELD", NULL, 0)) == NULL) {

error processing routine

}

if ((rcvbuf = (FBUF *)tpalloc("FIELD", NULL, 0)) == NULL) {

error processing routine

}

....

fbput(sndbuf, INPUT, sndata, 0);

서비스 호출

fbget(rcvbuf, OUTPUT, rcvdata, 0);

...

tpfree

void tpfree (char *bufptr)

Page 43: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 42

bufptr tpalloc() 으로 할당된 버퍼의 포인터값이다.

tpalloc() 으로 메모리에 할당한 버퍼를 해제한다. tpalloc() 으로 할당되지 않은 버퍼를 해제하려고 할 경우 해당 버퍼는 해제되지 않는다.

< Ex >

char *octet_ptr;

char *ptr1, *ptr2;

octet_ptr= tpalloc(“X_OCTET”, NULL, 25);

. . .

octet_ptr= tprealloc(octet_ptr, 40);

tpfree(octet_ptr) ;

tptypes

long tptypes (char *ptr, char *type, char *subtype)

ptr tpalloc() 으로 할당된 버퍼의 포인터값이다.

type 해당 버퍼의 타입이다.

subtype 해당 버퍼의 서브타입이다.

tptypes() 는 tpalloc() 으로 할당된 버퍼의 타입과 서브타입을 반환한다. 호출에 실패하면 –1 을 반환하고 tperrno 에 에러를 설정한다.

< Ex >

char type[9], subtype[17];

long len;

char *octet_ptr

Page 44: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

43 Tmax C Programming Guide

. . .

octet_ptr = tpalloc(“X_OCTET”, NULL, 25);

. . .

len = tptypes(octet_ptr, &type, &subtype);

2.1.1.3 서비스 호출

할당한 버퍼를 이용하여 실제 서비스를 요청하고 결과값을 받아오는 기본적인 API 들에 대하여 설명한다. 여기에서는 동기형과 비동기형에 대해서만 다룬다. 대화형 API 는 “III.1 대화형 통신” 의 내용을 참조하도록 한다.

tpcall

int tpcall (char *svc, char *sbuf, long slen, char **rbuf, long *rlen, long flags)

svc Tmax 환경파일에 등록된 서비스 이름을 지정한다.

sbuf 서비스를 호출 할 때 전달되는 데이터로 NULL 이 아닌

경우는 반드시 tpalloc() 으로 할당된 버퍼를 사용하여야 한다.

slen 보내는 데이터의 길이를 지정한다. CARRAY, X_OCTET, 구조체 배열 타입 일 경우에는 반드시 설정해야 한다.

rbuf 서비스 수행 결과를 받아올 버퍼를 지정한다. 반드시 tpalloc()

으로 할당된 버퍼를 사용하여야 한다.

rlen 받아온 데이터의 길이가 설정된다. CARRAY, X_OCTET, 구조체 배열 타입 이외의 경우에는 이 값을 무시한다.

flags TPNOTIME,TPSIGRSTRT, TPNOTRAN, TPNOCHANGE,

TPNOFLAGS 가 지정될 수 있다. 자세한 사항은 아래와 같다.

Page 45: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 44

TPNOTRAN 호출 시점이 트랜잭션 영역일 경우 호출로 인한 결과를 트랜잭션 범주에서 제외한다.

TPNOCHANGE

서비스 호출 결과로 받아온 데이터 타입이 rbuf 의 타입과 다를 경우 형변환이 일어나는데 TPNOCHANGE 플래그를

설정하면 형변환 대신 에러가 발생한다. (TPEOTYPE)

TPNOTIME

클라이언트 혹은 서버측이 설정한 블록 타입아웃 시간을 무시하고 결과값을

받을때까지 기다린다. 그러나 트랜잭션 영역에서 호출했다면 트랜잭션 타임아웃

시간은 그대로 적용된다.

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때 사용한다. 개발자가 시그널을 사용할 경우 시스템 함수 호출 도중에 시그널이

발생하면 시스템 함수 호출은 중단되고 해당 API 는 TPGOTSIG 에러를 리턴하지만

TPSIGRSTRT 플래그를 설정할 경우 중단된 시스템 함수 호출은 재실행된다.

TPNOFLAGS 일반적으로 사용되는 플래그이다.

tpcall() 은 클라이언트가 서비스를 요청하고 응답이 올 때까지 기다리는 동기형 통신에 사용되는 API 이다.

Page 46: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

45 Tmax C Programming Guide

그림 8 동기형 통신

sbuf 와 rbuf 는 데이터를 주고 받을 버퍼에 대한 포인터로써 반드시 tpalloc() 으로 할당되어야 한다. 하나의 버퍼로 데이터를 주고 받을수도 있으며 이경우 응답 버퍼(rbuf)는 보내는 버퍼와 동일하게 설정한다. 즉 (char **)&sbuf 와 같이 지정해야 한다.

slen 은 보낼 버퍼 (sbuf)의 길이를 나타내며 CARRAY, X_OCTET 형과 구조체 배열을 사용하는 경우에는 반드시 설정해 주어야 한다. 이외의 타입에서는 0 으로 설정할 수 있다.

rlen 은 응답 버퍼 (rbuf)의 길이를 나타내며 CARRAY, X_OCTET, 구조체 배열 이외의 버퍼 타입을 사용한 경우 이 값은 무시된다.

만일 서버로부터 받는 데이터가 할당된 응답 버퍼의 크기보다 크면 받는 버퍼는 자동적으로 커지며 이경우 버퍼의 주소도 달라질 수 있다. 이것은 TPNOCHANGE 플래그의 영향을 받지 않는다.

< Ex 1 >

struct transf *transfp;

long nrecv;

. . .

if ((transfp = (struct transf *) tpalloc(“STRUCT”, “transf”,

sizeof(struct transf))) == NULL){

error processing routine

}

transfp->b_id = q_branchid;

transfp->balance = 0.0;

Page 47: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 46

strcpy(transfp->errmsg, “”);

if (tpcall(svc_name, (char *)transfp, 0, (char **)&transf, &nrecv,

TPNOFLAGS)

== -1){

/* 보낼 Buffer 와 받을 Buffer 를 같이 사용 */

error processing routine

}

else

printf(“Branch %ld balance is %.2f\n”, transfp->b_id,

transfp->balance) ;

<<Ex 2>>

struct send_dat *strdata;

char *data;

long len;

if ((strdata = (struct send_dat *)tpalloc(“STRUCT”, “send_dat”, 0))

== NULL){

error processing routine

}

if ((data = tpalloc(“STRING”, NULL, 512)) == NULL){

error processing routine

}

strdata->id=cltid;

strdata->passwd=cltpasswd;

strcpy(strdata->msg, cltdata);

if (tpcall(“sel_ora”, (char *)strdata, 0, &data, &len, TPNOTIME) ==

-1) {

error processing routine

}

tpacall

Page 48: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

47 Tmax C Programming Guide

int tpacall (char *svc, char *sbuf, long slen, long flags)

svc Tmax 환경파일에 등록된 서비스 이름을 지정한다.

rbuf 서비스 수행 결과를 받아올 버퍼를 지정한다. 반드시 tpalloc()

으로 할당된 버퍼를 사용하여야 한다.

rlen 받아온 데이터의 길이가 설정된다. CARRAY, X_OCTET, 구조체 배열 타입 이외의 경우에는 이 값을 무시한다.

flags TPNOTIME,TPSIGRSTRT, TPNOTRAN, TPNOREPLY,

TPBLOCK, TPNOFLAGS 가 지정될 수 있다. 자세한 사항은 아래와 같다.

TPNOTRAN 호출 시점이 트랜잭션 영역일 경우 호출로 인한 결과를 트랜잭션 범주에서 제외한다.

TPNOREPLY

이 플래그는 서비스 요청에 대한 응답을 받지 않겠다는 것으로 호출이 성공적으로 완료되면

구별자로 0 을 반환한다. tpacall() 의 호출이 트랜잭션 영역에서 일어난 경우는 응답을

반드시 받아야 하므로 TPNOREPLY 플래그를 사용할 수 없다. 꼭 사용하기 위해서는

TPNOTRAN 플래그와 함께 설정하여 트랜잭션

영역에서 제외해야 한다.

TPBLOCK 타임 아웃 시간 내에서 tpacall() 에 대한 응답이 올때까지 블록 상태로 기다린다.

Page 49: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 48

TPNOTIME

클라이언트 측에 설정된 블록 타입아웃 시간을 무시하고 결과값을 받을때까지 기다린다. 그러나 트랜잭션 영역에서

호출했다면 트랜잭션 타임아웃 시간은 그대로 적용된다.

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때 사용한다. 개발자가 시그널을 사용할 경우 시스템 함수 호출 도중에 시그널이

발생하면 시스템 함수 호출은 중단되고 해당 API 는 TPGOTSIG 에러를 리턴하지만

TPSIGRSTRT 플래그를 설정할 경우 중단된 시스템 함수 호출은 재실행된다.

TPNOFLAGS 일반적으로 사용되는 플래그이다.

tpacall() 은 클라이언트가 서비스를 요청하고 필요한 때에 응답을 받는 비동기형 통신에 사용되는 API 이다. tpacall() 은 해당 서비스로 데이터를 보낸후 구별자(cd)를 리턴하고 즉시 제어를 반환한다. 요청에 대한 응답은 리턴받은 cd 값을 이용하여 받아온다.

sbuf 와 slen 은 tpcall() 과 동일하다.

tpgetrply

int tpgetrply (int *cd, char **rbuf, long *rlen, long flags)

cd 앞서 수행한 tpacall() 호출에 대한 구별자이다.

Page 50: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

49 Tmax C Programming Guide

sbuf 서비스를 호출 할 때 전달되는 데이터로 NULL 이 아닌 경우는 반드시 tpalloc() 으로 할당된 버퍼를 사용하여야

한다.

slen 보내는 데이터의 길이를 지정한다.

flags TPNOTIME,TPSIGRSTRT, TPNOCHANGE, TPNOBLOCK,

TPGETANY, TPNOFLAGS 가 지정될 수 있다. 자세한 사항은 아래와 같다.

TPNOCHANGE

서비스 호출 결과로 받아온 데이터 타입이 rbuf 의 타입과 다를 경우 형변환이 일어나는데 TPNOCHANGE 플래그를

설정하면 형변환 대신 에러가 발생한다. (TPEOTYPE)

TPNOBLOCK

서비스 수행결과 받아온 데이터가 내부 버퍼에 존재하지 않을 경우 타임아웃

시간동안 Tmax 시스템과 접속된 소켓을 검사하게 되는데 TPNOBLOCK 플래그를

사용하면 원하는 메시지가 없는 경우 바로 에러를 리턴하게 된다. (TPEBLOCK)

TPNOTIME

클라이언트 측에 설정된 블록 타입아웃 시간을 무시하고 결과값을 받을때까지 기다린다. 그러나 트랜잭션 영역에서

호출했다면 트랜잭션 타임아웃 시간은 그대로 적용된다.

Page 51: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 50

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때 사용한다. 개발자가 시그널을 사용할 경우 시스템 함수 호출 도중에 시그널이 발생하면 시스템 함수 호출은 중단되고

해당 API 는 TPGOTSIG 에러를 리턴하지만 TPSIGRSTRT 플래그를 설정할 경우 중단된

시스템 함수 호출은 재실행된다.

TPGETANY

구별자의 값을 무시하고 현재 버퍼에 쌓여있거나 Tmax 시스템과 연결된 소켓에

준비된 비동기형 서비스 수행 결과 중 가장 먼저 도착한 값을 받아온다.

TPNOFLAGS 일반적으로 사용되는 플래그이다.

tpgetrply() 는 tpacall() 로 보낸 요청에 대한 응답을 받는데 사용한다. tpgetrply() 는 기본적으로 블럭킹 통신이다. 즉 일단 호출하면 응답을 받거나 블럭킹 타임 아웃이 발생할 때까지 기다린다. 타임 아웃이 발생하면 호출은 실패하고 tperrno 에는 TPETIME 이 설정된다.

그림 9 비동기형 통신

cd 는 tpacall() 이 반환한 구별자로써 요청에 대한 정확한 응답을 구별할 수 있도록 한다. rbuf 와 rlen 은 tpcall() 과 동일하다.

Page 52: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

51 Tmax C Programming Guide

만일 서버로부터 받는 데이터가 할당된 응답 버퍼의 크기보다 크면 받는 버퍼는 자동적으로 커지며 이경우 버퍼의 주소도 달라질 수 있다. 이것은 TPNOCHANGE 플래그의 영향을 받지 않는다.

< Ex >

...

if ((cd1 = tpacall(“service1”, buf1, 0 , TPNOFLAGS)) == -1)

error processing routine

if ((cd2 = tpacall(“service2”, buf2, 0 , TPNOFLAGS)) == -1)

error processing routine

...

if (tpgetrply(&cd1, &buf1, &buf1len, TPNOFLAGS) == -1)

error processing routine

if (tpgetrply(&cd2, &buf2, &buf2len, TPNOFLAGS) == -1)

error processing routine

...

tpcancel

int tpcancel (int cd)

cd 앞서 수행된 tpacall() 호출에 대한 구별자이다.

tpcancel() 은 tpacall() 로 반환된 구별자에 해당하는 결과값을 취소한다. 전역 트랜잭션에 참여중인 구별자를 취소하려고 하면 에러가 발생한다. 호출이 성공하면 cd 는 더 이상 사용되지 않는다. 실패하면 -1 이 반환된다.

< Ex 1 >

...

if ((cd = tpacall(“service1”, buf1, 0 , TPNOFLAGS)) == -1)

error processing routine

...

if (tpcancel(cd) == -1)

error processing routine

Page 53: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 52

...

2.1.1.4 비요청 메시지 처리

비요청 메시지는 어떤 요청에 대한 응답이 아닌 일방적으로 보내진 데이터이다. 이러한 메시지에 대한 대응 방법은 TPSTART_T 구조체에 설정하여 Tmax 시스템 접속시에 설정할 수도 있고 접속후에 임의로 변경할 수도 있다. 이러한 비요청 메시지를 처리하는 API 들을 소개한다.

tpsetunsol_flag

int tpsetunsol_flag(int flag)

flag 비요청 메시지에 대한 처리 방법을 설정한다.

TPUNSOL_POLL , TPUNSOL_IGN, TPUNSOL_HND 세가지가

있으며 자세한 내용은 다음과 같다.

TPUNSOL_IGN 비요청 메시지를 무시한다. 받은

메시지는 버려진다.

TPUNSOL_HND비요청 메시지를 받으며 핸들러를 통해

이를 처리한다.

TPUNSOL_POLL 비요청 메시지를 받는다.

비요청 메시지를 처리하는 방법을 설정한다. TPUNSOL_IGN 을 설정하거나 TPUNOL_HND 을 설정한 상태에서 비요청 메시지 핸들러를 설정하지 않으면 모든 비요청 메시지는 버려진다.

비설정 상태의 경우는 모든 비요청 메시지를 받는다.

tpsetunsol

Unsolfunc *tpsetunsol(*Unsolfunc func) Unsolfunc(char *, long, long)

Page 54: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

53 Tmax C Programming Guide

func 비요청 메시지 핸들러에 대한 포인터이다.

비요청 메시지를 핸들러를 통해 처리한다고 설정한 경우(TPUNSOL_HND) 비요청 메시지를 처리하는 함수를 설정한다. 다른 플래그가 설정되어 있는 경우 에러를 발생한다.

< Ex1 >

main(int argc, char *argv[])

{

...

TPSTART_T *tpinfo;

...

tpinfo = (TPSTART_T *)tpalloc("TPSTART", NULL, sizeof(TPSTART_T));

if (tpinfo == NULL) {

error processing routine

}

...

tpsetunsol(get_unsol);

...

}

void get_unsol(char *data, long len, long flag)

{

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

}

tpgetunsol

int tpgetunsol(int type, char **data, long *len, long flags)

type 받고자 하는 비요청 메시지의 종류이다.

UNSOL_TPBROADCAST, UNSOL_TPPOST, UNSOL_TPSENTOCLI, UNSOL_TPNOTIFY 가 있다.

Page 55: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 54

data 데이터를 받을 버퍼이다. tpalloc() 할당된 버퍼이어야 한다.

len 받아온 데이터의 길이가 설정된다. CARRAY, X_OCTET,

구조체 배열 이외의 타입일 경우는 무시한다.

flags TPGETANY, TPNOCHANGE, TPBLOCK, TPNOTIME,

TPSIGRSTRT 를 설정할 수 있다. 자세한 사항은 아래와 같다.

TPGETANY

현재 버퍼에 쌓여있거나 Tmax 시스템과 연결된 소켓에 준비된 비요청 메시지 중 가장 먼저 도착한 값을 받아온다. 버퍼

혹은 Tmax 시스템과의 연결 소켓에 있는

임의의 비요청 데이터를 읽어온다.

TPBLOCK

tpgetunsol() 은 기본적으로 버퍼에 있는 비요청 메시지를 체크한후 다시 Tmax

시스템과 접속된 소켓을 검사하여 해당하는 메시지가 없으면 에러를

리턴한다. TPBLOCK 플래그를 설정할 경우 해당하는 메시지가 도착할때까지

기다리게 된다.

TPNOTIME

TPBLOCK 플래그를 설정한 경우 타임아웃 시간도 무시하고 메시지가

도착할떄 까지 기다린다. 독자적으로는 의미가 없다.

Page 56: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

55 Tmax C Programming Guide

TPNOCHANGE

해당 하는 메시지의 데이터 타입이 data 의 타입과 다를 경우 형 변환이

일어나는데 TPNOCHANGE 플래그를 설정하면 형변환 대신 에러를 리턴한다.

(TPEOTYPE)

TPSIGRSTRT

tpgetunsol() 호출 도중에 시그널이 발생하여 시스템 함수 호출이

중지되었을때 다시 시스템 함수 호출을 시도한다.

비요청 메시지를 승낙한다고 설정한 경우(TPUNSOL_POLL 또는 TPUNSOL_HND) 버퍼 혹은 Tmax 시스템과 연결된 소켓에 쌓인 비요청 메시지 중 해당하는 타입의 데이터를 받아온다.

앞서 설명한 대로 데이터를 받는 버퍼의 크기보다 서버로부터 받은 데이터의 크기가 더 클 경우 해당 버퍼의 크기는 자동적으로 증가되며 필요에 따라 버퍼의 주소도 변화될 수 있다. 이것은 TPNOCHANGE 플래그의 영향을 받지 않는다.

<<Ex>>

...

if ((rc_buf = (char*)tpalloc(“STRING“, NULL, 512)) == NULL){

exit(0);

}

if ((val = tpgetunsol(UNSOL_TPSENDTOCLI, rc_buf, &len, TPBLOCK)) <

0){

error processing routine

}

...

tpchkunsol

int *tpchkunsol(void)

Page 57: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 56

tpchkunsol()함수는 이 함수를 호출할 당시에 서버로부터 비요청 메시지가 있다면 비요청 메시지를 처리하기 위한 함수를 호출하는 함수이다. tpchkunsol 함수를 호출하지 않으면 클라이언트에서 tpsetunsol 을 호출한 후 비요청 메시지를 처리하는 함수를 설정해 준 후 반드시 tpcall 이나 tpacall 을 호출한 후에야 비요청 메시지를 처리하는 함수가 호출되는 반면 이 함수를 호출하게 되면 tpcall 이나 tpacall 을 호출하기 전에도 비요청 메시지가 있는지 확인한 후 비요청 메시지를 가져올 수 있게 된다.

#include <stdio.h>

#include <usrinc/atmi.h>

#include <usrinc/ucs.h>

#include <usrinc/tmaxapi.h>

void get_unsol(char *data, long len, long flag)

{

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

}

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

char *sndbuf;

char *rcvbuf;

long rcvlen;

int RecvCnt = 0;

int cd;

TPSTART_T *tpinfo;

int i;

tpinfo = (TPSTART_T *)tpalloc("TPSTART", NULL, sizeof(TPSTART_T));

if (tpinfo == NULL) {

printf("tpalloc failed !<-tpinfo\n");

exit(1);

}

strcpy(tpinfo->usrname, "starbj81");

strcpy(tpinfo->cltname, "client");

if(tpstart((TPSTART_T *)tpinfo) == -1)

{

fprintf(stderr, "tpstart error\n");

exit(1);

}

Page 58: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

57 Tmax C Programming Guide

tpsetunsol_flag(TPUNSOL_HND);

tp_sleep(5);

if(tpsetunsol(get_unsol) == TPUNSOLERR){

printf("tpsetunsol failed..\n");

}

i = tpchkunsol();

if(i < 0)

{

printf("tpchkunsol failed\n");

}

else

{

printf("Received Unsol Data Count : %d\n", i);

}

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

error processing

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

error processing

if((cd = tpcall("LOGIN", sndbuf, 1024, (char **)&rcvbuf, (long

*)&rcvbuf, 0)) == -1)

error processing

printf("After tpcall() received Message from

server:%s\n", rcvbuf);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

}

2.1.1.5 타임아웃 시간 변경

클라이언트가 블록 상태로 메시지를 기다려 받아오는 최대 시간을 설정한다. tpsleep(). tpschedule() 과 같은 API 들은 서정된 시간의 영향을 받지 않는다.디폴트 값은 Tmax 시스템의 환경파일에 설정된 값이며 트랜잭션 타임아웃이나 서비스 타임아웃 시간과는 별도로 적용된다.

tpset_timeout

int tpset_timeout (int sec)

Page 59: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 58

sec 타임아웃 시간(초)이다.

서비스를 요청한 후 결과값을 받아올때 한계 시간을 설정한다. 지정된 시간까지 결과가 도착하지 않으면 해당 API 는 TPETIME 을 발생한다. tpset_timeout() 으로 설정된 값은 이후 모든 서비스 호출에 영향을 미친다.

< Ex >

main(int argc, char *argv[ ])

{

. . . .

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

printf(“Tpstart failed\n”);

exit(1);

}

printf(“tpstart-ok \n”);

if((sndbuf = (struct kstrdata *) tpalloc(“STRUCT”, “kstrdata”, 0))

== NULL) {

error processing routine

}

/* 10 초로 블로킹 타임아웃 시간을 변경 */

tpset_timeout(10);

if (tpcall(“BLOCK”, (char *)sndbuf, 0, (char **)&rcvbuf, &rcvlen,

TPNOFLAGS)== -1){

error processing routine

sleep(3);

}

/* 30 초로 블로킹 타임아웃 시간을 변경 */

tpset_timeout(30);

if (tpcall(“BLOCK2”, (char *)sndbuf, 0, (char **)&rcvbuf, &rcvlen,

TPNOFLAGS)== -1){

error processing routine

}

. . . .

Page 60: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

59 Tmax C Programming Guide

tpend() ;

}

2.1.2 Tmax 클라이언트 프로그램 컴파일

클라이언트 프로그램의 코딩이 끝났다면 이제 컴파일하여 실행 파일을 만들 차례다. 클라이언트 프로그램을 컴파일하기 위해서는 개발자가 작성한 클라이언트 프로그램, Tmax 클라이언트 라이브러리, 구조체 버퍼를 사용한다면 구조체 파일이, 그리고 필드 버퍼는 필드 테이블이 정의된 파일이 준비 되어야 한다.

클라이언트 프로그램:

개발자가 작성한 클라이언트 프로그램이다

Tmax 클라이언트 라이브러리( libcli.a / libcli.so)

Tmax 가 제공하는 라이브러리로 클라이언트 API 와 변수들을 사용하기 위해서 반드시 필요하다.

구조체 바이너리 테이블(SDLFILE)

구조체형 버퍼(STRUCT, X_C_TYPE, X_COMMON)를 사용하였다면 이를 정의하는 “xxxx.s” 형식의 구조체 파일이 필요하다. 이 구조체 파일은 sdlc –c 명령어를 이용하여 컴파일하며 그 결과 구조체의 멤버들을 표준 통신형으로 변환하는데 필요한 바이너리 테이블 파일이 생성된다. 이는 클라이언트 프로그램 실행시에 구조체형의 데이터를 표준 통신형으로 변환/역변환 하는데 사용된다.

필드버퍼 바이너리 테이블(FDLFILE)

필드 버퍼를 사용하였다면 “xxxx.f” 형식으로 정의된 필드 버퍼 파일이 필요하다. 이 파일은 fdlc 명령어를 이용하여 컴파일 하며 그 결과 필드키와 데이터를 대응시켜 주는 바이너리 테이블 파일과 필드키와 필드키 이름을 대응시켜주는 헤더 파일(xxxx_fdl.h)이 만들어 진다. 기존의 구조체 파일과는 달리 사용자가 원하는 필드의 값만을 조작하고 전달할 수 있으므로 다양한 타입의 데이터를 사용하는 경우 자원의 낭비를 줄일 수 있다. 하지만 데이터 값과 필드키 값을 같이 관리하므로 많은 필드를 사용하지 않는다면 역효과가 발생할 수도 있다.

Page 61: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 60

2.1.2.1 클라이언트 프로그램 컴파일 순서

클라이언트 프로그램을 컴파일하여 오브젝트 파일을 생성한다. 클라이언트 프로그램은 Tmax 에서 제공하는 헤더 파일들을 참조해야 하며 필요에 따라 구조체 파일이나 필드버퍼 헤더파일도 역시 참조되어야 한다. Ex ) cc -c -I/home/tmax/usrinc client.c -> client.o

오브젝트 형태의 클라이언트 프로그램과 클라이언트 프로그램에서 사용하는 라이브러리, 그리고 Tmax 에서 제공하는 클라이언트 라이브러리(libcli.a 또는 liblia.so)를 함께 링크하여 실행파일을 생성한다. Ex ) cc -o client client.o libcli.a -> client

그림 10 구조체 버퍼를 사용한 클라이언트 프로그램 컴파일

2.1.2.2 쉘 프로그램을 이용한 컴파일

Tmax 를 설치하면 예제 클라이언트 프로그램 디렉토리에는 기본적으로 예제 프로그램 외에 메이크 파일과 이를 이용하는 쉘 프로그램이 생긴다 (Makefile.c, compile).

Page 62: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

61 Tmax C Programming Guide

다음은 클라이언트 프로그램 메이크 파일(Makefile.c) 의 내용이다. $COMP _TARGET 에는 개발한 프로그램의 이름이 들어가며 쉘 프로그램 compile 을 이용하여 넘긴다..

Makefile.c

TARGET = $(COMP_TARGET)

APOBJS = $(TARGET).o

TMAXLIBD = $(TMAXDIR)/lib

TMAXLIBS = -lcli

#Solaris 의 경우 –lsocket –lnsl 이 추가된다.

CFLAGS = -O –I$(TMAXDIR)

#CFLAGS 는 사용 환경(32/64 비트)과 플랫폼에 따라 다르다.

#Solaris 32bit, Compaq, Linux: CFLAGS = -O –I$(TMAXDIR)

#Solaris 64bit: CFLAGS = -xarch=v9 -O –I$(TMAXDIR)

#HP 32bit: CFLAGS = -Ae -O –I$(TMAXDIR)

#HP 64bit: CFLAGS = -Ae +DA2.0W +DD64 +DS2.0 -O –I$(TMAXDIR)

#IBM 32bit: CFLAGS = -q32 –brtl -O –I$(TMAXDIR

#IBM 64bit: CFLAGS = -q64 –brtl -O –I$(TMAXDIR

#

.SUFFIXES : .c

.c.o:

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

#

# client compile

#

$(TARGET): $(APOBJS)

$(CC) $(CFLAGS) -L$(TMAXLIBD) -o $(TARGET) $(APOBJS)

$(TMAXLIBS)

#

clean:

Page 63: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 62

-rm -f *.o core $(TARGET)

compile 파일의 사용법은 다음과 같다

$./compile c toupper

2.2 Tmax 서버 프로그램(TCS)

TCS 서버 프로그램은 클라이언트가 보낸 데이터를 받아서 필요한 작업을 하며 그 결과를 다시 클라이언트로 보내주고 다음 요청을 기다린다. main() 루틴을 Tmax 시스템에서 관리하므로 개발자는 클라이언트를 직접 처리해 줄 필요 없이 비즈니스 로직에만 신경 쓰면 된다. 하나의 서버 프로그램은 하나 이상의 서비스 루틴을 가질수 있으며 한 서비스 내에서 다른 서비스를 호출할 수 있다. 그러나 한 프로세스 내의 재귀적인 호출은 불가능하다.

하나의 서버 프로세스는 한번에 한가지 서비스만을 수행 할 수 있으므로 많은 서비스 루틴을 하나의 서버 프로그램으로 구성하는 것은 바람직 하지 않다.

2.2.1 TCS 방식 서버 프로그램의 구성

TCS 서버프로그램은 Tmax 에서 관리하는 main() 과 서비스루틴으로 이루어진다. main() 은 데이터베이스 연결 및 해제, 명령어 라인 옵션 처리 등의 역할을 하는 루틴으로 이루어져 있으며, 서비스 루틴은 실제로 클라이언트의 요청을 받아 업무를 처리한다.

main() 루틴은 tpsvrinit() 이나 tpsvrdone() 루틴을 호출하고 TMM, CLH 의 제어 메시지에 대한 처리를 한다. 클라이언트의 서비스 요청이 있을 경우 클라이언트의 정보와 데이터를 TPSVCINFO 구조체에 넣어서 해당 서비스를 호출한다. TPSVCINFO 구조체는 서비스를 요청한 클라이언트에 대한 정보와 처리할 데이터 정보를 가지고 있다. TPSVCINFO 구조체는 atmi.h 헤더 파일에 선언되어 있으며, 구성요소는 아래와 같다.

TPSVCINFO

char

name[XATMI_SERVICE_NAME_LENGTH]XATMI_SERVICE_NAME_LENGTH=16

Page 64: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

63 Tmax C Programming Guide

클라이언트가 요청한 서비스의 이름.

char *data 클라이언트가 넘긴 데이터로 main() 루틴 내에서 tpalloc() 으로

할당된 버퍼이다. 클라이언트에서 사용된 버퍼 형식으로 형변환하여

사용한다. 사용자 임의로 tpfree() 할 수 없다.

long len 요청 데이터 길이. CARRAY, X_OCTET, 구조체 배열인 경우 값이

설정된다.

long flags 서비스 속성. 서비스가 트랜잭션 상태에 있는지 응답을 필요로

하는지 등의 정보가 저장되어 있다.

int cd 연결 구별자. 응답을 보낼 클라이언트를 식별하기 위한 구별자이다.

CLIENTID

cltid tpnotify()의 인수로 사용된다. 자세한 사용법은 Tmax Reference

Manual 을 참고하도록 한다.

서비스 루틴은 이 TPSVCINFO 구조체를 인자로 받아 해당 작업을 수행해야 한다. 서비스 루틴은 일반적으로 다음과 같이 선언한다.

<서비스 이름>(TPSVCINFO *msg)

서비스 이름은 NULL 종료문자를 포함하여 16 자 이내이며 _(언더바)로 시작되는 이름은 Tmax 에서 내부적으로 사용하므로 사용하지 말것을 권장한다.

<<ex>>

TOUPPER(TPSVCINFO *msg)

{

.....

}

2.2.2 TCS 방식 서버 프로그램 기본 API

여기서는 TCS 방식의 서버프로그램 작성시 사용되는 API 들에 대해 알아본다. 서버 또한 클라이언트 역할도 할 수 있기 때문에 클라이언트에서 사용하는 함수도

Page 65: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 64

사용이 가능하다. 추가적인 자세한 설명이나 여기에 빠진 API 에 대한 설명은 Tmax Reference Manual 을 참조하도록 한다.

함 수 이 름 기 능

tpreturn() 서비스 요청에 대한 응답을 클라이언트에게

보내고 서비스 루틴을 완료한다. 서비스 완료, 결과 반환 관련함수

tpforward() 다른 서비스로 클라이언트에 대한 제어권을

넘긴다.

tpsvrinit() 서버 프로세스의 초기화 루틴을 설정한다. 서버 초기화, 종료 관련

함수 tpsvrdone() 서버 프로세스의 종료 루틴을 설정한다.

tpbroadcast() Tmax 시스템에 접속한 있는 클라이언트들 중

원하는 그룹에게 메시지를 보낸다.

tpsendtocli () Tmax 시스템에 접속한 특정 클라이언트에게

메시지를 보낸다.

tpgetclid() Tmax 시스템에 접속한 클라이언트의 ID 를

리턴한다. 이 ID 는 tpsendtocil() 에 사용된다.

비요청 메시지 전송

관련

함수

tpchkclid() 해당 서버 프로세스가 위치한 노드에

클라이언트 ID 에 해당하는 클라이언트가 접속해 있는지 검사한다.

표 6 UCS / TCS 서버 기본 API

Page 66: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

65 Tmax C Programming Guide

2.2.2.1 서비스 완료, 결과 반환 관련함수

서비스 루틴의 완료를 표시하는 함수로 tpreturn() 과 tpforward() 가 있다. tpreturn() 은 클라이언트에게 응답을 보내고 서비스 수행을 완료하는 것이고 tpforward() 는 클라이언트에 대한 제어권을 다른 서비스 루틴으로 넘기고 서비스 수행을 완료한다.

tpreturn

void tpreturn (int rval, int rcode, char *data, long len, long flags)

rval 서비스 수행의 성공 / 실패 여부를 클라이언트에게

전달한다. TPSUCCESS, TPFAIL, TPEXIT 세가지가 있다. 자세한 내용은 다음과 같다.

TPSUCCESS 서비스가 수행이 성공함.

TPFAIL 서비스가 수행이 실패함. 클라이언트는 서비스 수행을 실패하며 tperrno 에는

TPESVCFAIL 이 설정된다.

TPEXIT

서비스가 수행이 실패함. 클라이언트는 서비스 수행을 실패하며 tperrno 에는

TPESVCFAIL 이 설정된다.

서버 프로세스는 종료하며 설정에 따라 재기동된다.

TPDOWN TPEXIT 와 동일하지만 서버 프로세스

종료후 재기동 되지 않는다.

Page 67: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 66

rcode

사용자에게 서비스 수행 결과에 대해 추가적인 정보를 주고자 할때 지정할 수 있다. 보통 DB 억세스 에러 값이 설정된다. 클라이언트는 gettpurcode() 를 사용하여 이 값을

얻을 수 있다.

data 보내고자 하는 데이터 버퍼이다. tpalloc() 할당된

버퍼이어야 하며 보낼 데이터가 없을 경우는 NULL 값을 설정하여도 된다.

len 보내고자 하는 데이터의 길이이다. CARRAY, X_OCTET, 구조체 배열 타입일 경우에는 반드시 명시해야 한다.

flags 현재 사용되지 않는다. TPNOFLAGS 를 설정한다.

tpreturn() 은 서비스 처리 결과를 클라이언트에게 보내고 컨트롤을 main() 루틴으로 반환한다. 서비스 루틴 내에 완료되지 않은 대화형 모드가 있다면 미리 완료되어야 하고 비동기형 서비스 요청은 tpgetrply() 로 모두 응답을 받거나 tpcancel() 로 무효화 시켜야 한다. 또한 서비스 루틴내에서 명시적으로 시작된 트랜잭션이 존재하는 경우 모두 완료해야 한다. 그렇지 않을 경우 이 메시지들은 모두 버려지고 트랜잭션은 롤백 처리되며 클라이언트의 서비스 요청은 실패하며 tperrno 에는 TPESVCERR 가 설정된다. Tmax 환경파일의 AUTOTRAN 항목 설정에 의해 자동적으로 시작된 트랜잭션은 tpreturn() 의 rval 값에 따라 커밋 혹은 롤백 된다. 트랜잭션이 체인모드로 되어 있어도 tpreturn() 에 의한 트랜잭션 완료는 새로운 트랜잭션을 시작하지 않는다.

< Ex 1 >

/* 클라이언트에게 sdata 의 내용을 len 만큼 보냄. */

tpreturn(TPSUCCESS, 0, sdata, len, TPNOFLAGS);

< Ex 2 >

Page 68: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

67 Tmax C Programming Guide

/* 클라이언트에게 TPESVCFAIL 값을 보내고 내용을 보내지 않는다. */

/* sqlcode 값을 urcode 로 설정한다. */

tpreturn(TPFAIL, sqlca.sqlcode, transb->data, 0, TPNOFLAGS);

tpforward

void tpforward (char *svc, char *data, long len, long flags)

svc 클라이언트에 대한 제어권을 넘기고자 하는 서비스

루틴을 설정한다.

data 보내고자 하는 데이터 버퍼이다. tpalloc() 할당된

버퍼이어야 하며 보낼 데이터가 없을 경우는 NULL 값을 설정하여도 된다.

len 보내고자 하는 데이터의 길이이다. CARRAY, X_OCTET, 구조체 배열 타입일 경우에는 반드시 명시해야 한다.

flags 현재 사용되지 않는다. TPNOFLAGS 를 설정한다.

tpforward() 는 클라이언트에 대한 관리를 다른 서비스로 넘기는 API 이다. 제어권을 넘겨 받은 서비스 루틴의 결과는 직접 해당 클라이언트에게 전달되며 제어권을 넘긴 서비스는 다른 클라이언트의 요청을 받을 수 있게 된다.

tpforward() 시 완료되지 않은 대화형 모드나 비동기형 서비스 요청이 있는경우, 서비스 루틴내에 tx_begin() 을 하고 완료하지 않은 경우는 내부적으로 에러가 발생한 경우는 바로 클라이언트에게 에러를 리턴하며 tperrno 에는 TPSVCERR 가 설정된다. AUTOTRAN 설정으로 인한 트랜잭션은 상황에 따라 커밋 혹은 롤백 된다.

다수의 tpforward() 을 사용하다 도중에 에러가 발생하는 경우 에러가 발생한 서비스 루틴에서 클라이언트로 메시지가 전달되며 클라이언트는 tmaxlastsvc() API 를 사용하여 어느 서비스 루틴에서 에러가

Page 69: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 68

발생하였는지 알 수 있다. 이 API 사용법은 Tmax Reference Manual 을 참조하도록 한다.

그림 11 tpforward

< Ex >

/* DEPOSIT 이라는 다른 서비스로 서비스를 요청함 */

/* 클라이언트로의 응답을 DEPOSIT 서비스에서 이루어진다. */

tpforward(“DEPOSIT”, transb->data, 0, TPNOFLAGS);

2.2.2.2 서버 초기화와 종료 루틴

서버의 main() 루틴 내에서 관리하는 서브루틴 으로 tpsvrint() 와 tpsvrdo ne() 이 있다. 이들은 각각 서버 프로세스가 처음 시작될때와 종료될때 수행하는 루틴으로 주로 NON-XA 모드로 데이터베이스와의 연결을 설정하거나 해제하고 필요에 따라 명령라인 인수를 처리하는 등의 기능을 제공한다. 이 서브 루틴들은 개발자가 임의로 작성할 수 있으며 그렇지 않을 경우 디폴트 루틴이 설정된다.

tpsvrinit

int tpsvrinit (int argc, char **argv)

Page 70: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

69 Tmax C Programming Guide

argc 명령라인 인수의 갯수

argv 명령라인 인수

tpsvrinit() 는 서버 프로세스가 처음 시작될 때 초기화를 위한 루틴이며, 만일 사용자가 작성하지 않으면 기본으로 제공되는 초기화 루틴이 포함된다. 일반적으로 Non-XA 모드로 데이터베이스를 열거나 명령어 라인 인수를 처리하는 작업을 한다.

tpsvrinit() 가 사용하는 명령어 라인 인수는 Tmax 시스템 환경파일 서버절의 CLOPT 에 설정된 값이다. 자세한 내용은 Tmax Administration Guide 를 참조하도록 한다.

< Ex >

#include <stdio.h>

#include <usrinc/atmi.h>

EXEC SQL INCLUDE sqlca.h;

tpsvrinit(int argc, char **argv)

{

EXEC SQL begin declare section;

char user_name[30];

char user_passwd[30];

EXEC SQL end declare section;

int c;

/*명령어 라인 옵션을 받아서 처리한다.*/

while ((c = getopt(argc,argv, "U:P:")) != EOF) {

switch((char)c) {

case 'U':

strcpy(user_name, optarg);

break;

case 'P':

Page 71: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 70

strcpy(user_passwd, optarg);

break;

}

}

/* 데이터베이스 연결 */

EXEC SQL CONNECT :user_name IDENTIFIED BY :user_passwd;

if (sqlca.sqlcode != 0) {

error processing routine

}

return(0);

}

tpsvrdone

void tpsvrdone(void)

인수없음

서버가 종료되는 경우(tmdown 혹은 서비스 실패로 인한 비정상적인 종료)에 수행되는 루틴으로 만일 사용자가 작성하지 않으면 Tmax 에서 기본적으로 제공되는 종료 루틴이 실행된다. 일반적으로 Non-XA 모드로 연결된 데이터베이스와의 연결을 끊는 작업을 한다.

< Ex >

void tpsvrdone()

{

EXEC SQL COMMIT WORK RELEASE;

}

2.2.2.3 비요청 메시지 API

Tmax 시스템은 현재 접속해 있는 클라이언트들에게 비요청 메시지를 보낼 수 있다. 클라이언트가 Tmax 시스템에 접속할때 넘긴 클라이언트의 정보를 바탕으로 메시지를 보낼 수도 있고 Tmax 시스템이 내부적으로 관리하는 클라이언트

Page 72: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

71 Tmax C Programming Guide

아이디를 사용할 수도 있다. 또한 클라이언트 혹은 서버가 자신이 원하는 이벤트를 등록하고 해당 이벤트가 발생하면 메시지를 수령하는 것도 가능하다.

여기에서는 Tmax 시스템이 내부적으로 관리하는 클라이언트 아이디를 이용하여 메시지를 보내는 API 들에 대한 설명을 하며 기타 다른 방법을 사용하는 API 들은 “브로드 캐스트 / 멀티 캐스트” 를 참조하도록 한다.

tpgetclid

int tpgetclid ( void)

인수없음

클라이언트의 아이디를 반환한다. 클라이언트 아이디는 클라이언트가 접속한 최초의 노드와 CLH 를 바탕으로 만들어지며 해당 클라이언트의 연결이 종료될때 까지 다른 클라이언트에 의해 재사용 되지 않으며 중간에 내용이 변하거나 하지 않는다.

클라이언트 아이디는 하나의 Tmax 시스템 내(Tmax 도메인)에서 유일한 값이며 클라이언트가 접속해 있는 노드의 위치에 상관없이 사용할 수 있다. tpsendtocli() 의 인수로 사용된다.

<<EX>> ...

clid = tpgetclid();

if (clid < 0)

{

error processing routine

}

...

tpchkclid

int tpchkclid ( int clid)

Page 73: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 72

clid 접속 상태를 알고자 하는 클라이언트 아이디를 지정한다.

클라이언트 아이디에 해당하는 클라이언트가 해당 서버 프로세스가 위치한 노드에 접속한 상태인지를 확인한다. 주로 RDP 방식의 서버 프로그램 개발시 서비스 루틴에서 접속한 클라이언트 아이디를 저장하고 usermain() 루틴에서 tpsendtocli() 로 메시지를 보내는 경우 사용하면 불필요한 에러를 사전에 막을 수 있다. (RPD 방식에서는 서버 프로세스가 위치한 노드에 직접 연결된 상태가 아니면 tpsendtocli() 를 사용할 수 없다.)

클라이언트가 접속되지 않았거나 에러상황시는 –1 을, 서버 프로세스가 위치한 노드의 클라이언트 아이디에 대해서는 1 을 리턴한다. 다른 노드에 접속된 클라이언트 아이디는 –2 를 리턴하며 이경우 클라이언트의 접속 상태는 정확히 알 수 없다.

<<EX>>

ret = tpchkclid(clid);

if (ret<0)

{

error processing routine

}

tpsendtocli

int tpsendtocli (int clid, char *data, long len, long flags)

clid

Tmax 시스템에 접속한 모든 클라이언트에게 부여하는 유일한 아이디로 내부적으로 관리되는 번호이다. 즉

tpsendtocli() 는 클라이언트는 사용할 수 없는 API 이다.

clid 는 tpgetclid() API 를 사용하여 얻을 수 있다.

data 보내고자 하는 데이터 버퍼이다. tpalloc() 으로 할당된 버퍼이어야 하며 보낼 데이터가 없을 경우는 NULL 값을

Page 74: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

73 Tmax C Programming Guide

설정하여도 된다.

len 보내고자 하는 데이터의 길이이다. CARRAY, X_OCTET, 구조체 배열 타입일 경우에는 반드시 명시해야 한다.

flagsTPNOBLOCK, TPUDP, TPFLOWCONTROL, TPNOFLAGS 가

사용되며 내용은 다음과 같다.

TPNOBLOCK 송신 버퍼나 클라이언트 측의

수신버퍼가 차서 메시지가 블록되는 경우 TPEBLOCK 에러를 발생한다.

TPUDP 내부 송신버퍼에 데이터가 가득 차 있을

경우 데이터를 버려도 됨. 데이터를 버려도 에러를 발생하지 않는다.

TPFLOWCONTRO

L

클라이언트의 수신 버퍼를 점검하여 메시지를 수신할 수 있는 상황이면

메시지를 보낸다. 그렇지 않으며 에러를 리턴하고 tperrno 에는 TPEQFULL 이

설정된다.

TPNOFLAGS 일반적으로 사용되는 플래그이다.

tpsendtocli() 는 서버에서만 사용할 수 있고, 클라이언트에서는 사용할 수 없다. TCS, UCS 방식인 경우 서버 프로세스가 위치한 노드로 처음 접속하지 않은 클라이언트에게도 메시지를 보낼 수 있으나 RDP 방식의 경우는 보낼 수 없으므로 주의하도록 한다.

Page 75: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 74

TPUDP 플래그는 UDP 방식으로 메시지를 보내는 것을 의미하는 것이 아니라 필요에 따라 메시지를 버릴 수도 있다는 것을 의미한다. 예를 들어 TPUDP 플래그를 설정하고 tpsendtocli() 로 메시지를 여러번 보내는 경우 나중에 보낸 메시지가 앞서 보낸 메시지를 대신할 수도 있다.

TPFLOWCONTROL 은 메시지를 버리지는 않으나 해당 클라이언트의 송신버퍼가 어느 수준 이상으로 쌓여 있으면 에러를 발생한다.

<<Ex>> ...

int clid, ret;

...

clid = tpgetclid();

if (clid < 0)

{

error processing routine

}

...

ret = tpchkclid(clid);

if (ret<0)

{

error processing routine

}

ret = tpsendtocli(clid, unsolmsg, strlen(unsolmsg), 0);

if (ret < 0)

{

error processing routine

}

2.2.3 TCS 방식 서버 프로그램 컴파일

개발자가 서버프로그램을 모두 작성하였다면 이제 컴파일하여 실행 파일을 만들 차례다. 서버 프로그램을 컴파일하기 위해서는 개발자가 작성한 서버 프로그램, Tmax 서버 라이브러리, 서비스 테이블이 필요하다. 구조체 버퍼를 사용한 경우는 구조체-표준버퍼 변환/역변환 프로그램과 구조체 바이너리 테이블이 있어야 하고 필드 버퍼를 사용하였다면 필드버퍼 헤더 파일과 필드버퍼 바이너리 테이블이 있어야 한다.

Page 76: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

75 Tmax C Programming Guide

서버프로그램

개발자가 작성한 서비스 루틴이다. SQL 문을 사용하였다면 해당 DB 벤더가 제공하는 툴을 이용하여 프리 컴파일을 마쳐야 한다.

Tmax 서버 라이브러리

Tmax 가 제공하는 라이브러리로 서버 API 와 변수들을 사용하기 위해서 반드시 필요하다.

서비스 테이블

서비스 테이블은 클라이언트가 요청한 서비스의 위치를 알기 위해 각각의 서버 프로세스가 제공하는 서비스 이름들이 나열되어 있는 파일로써 Tmax 환경파일을 참조하여 gst 명령으로 만든다. 서비스 테이블은 서비스 수행시 실제적으로 서버내에서 해당 서비스 루틴의 위치를 찾기 위해 사용된다. 서비스 테이블은 Tmax 시스템 관리자가 제공해야 한다. 이에 대한 자세한 내용은 Tmax Administration Guide 를 참조한다.

구조체 바이너리 테이블(SDLFILE)

구조체형 버퍼(STRUCT, X_C_TYPE, X_COMMON)를 사용하였다면 이를 정의하는 “xxxx.s” 형식의 구조체 파일이 필요하다. 이 구조체 파일은 sdlc –c 명령어를 이용하여 컴파일하며 그 결과 구조체의 멤버들을 표준 통신형으로 변환하는데 필요한 바이너리 테이블 파일이 생성된다. 이는 서버 프로그램 실행시에 구조체형의 데이터를 표준 통신형으로 변환/역변환 하는데 사용된다.

구조체-표준버퍼 변환/역변환 프로그램

서버 프로그램 내에서 구조체 버퍼를 사용하기 위해서는 sdlc 명령어로 만들어진 구조체-표준버퍼 변환/역변환 프로그램(xxxx_sdl.c, xxxx_sdl.h)을 컴파일하여 같이 링크해야 한다. 구조체를 사용하지 않을 경우에는 TMAXDIR/lib/sdl.o 를 링크하도록 한다.

필드버퍼 바이너리 테이블(FDLFILE)

필드 버퍼를 사용하였다면 “xxxx.f” 형식으로 정의된 필드 버퍼 파일이 필요하다. 이 파일은 fdlc 명령어를 이용하여 컴파일 하며 그 결과

Page 77: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 76

필드키와 데이터를 대응시켜 주는 바이너리 테이블 파일과 필드키와 필드키 이름을 대응시켜주는 헤더 파일(xxxx_fdl.h)이 만들어 진다. 기존의 구조체 파일과는 달리 사용자가 원하는 필드의 값만을 조작하고 전달할 수 있으므로 다양한 타입의 데이터를 사용하는 경우 자원의 낭비를 줄일 수 있다. 하지만 데이터 값과 필드키 값을 같이 관리하므로 많은 필드를 사용하지 않는다면 역효과가 발생할 수도 있다.

2.2.3.1 서버 프로그램 컴파일 순서

아래는 일반적인 C 컴파일러를 이용한 컴파일 방법이다. 이 과정은 기본적으로 Tmax 를 설치하면 생성되는 쉘 프로그램을 사용하거나 mksvr 유틸리티를 이용하여 간단하게 할 수 있다. 아래의 예는 리눅스에서의 실행 결과이며 개발 환경(32/64 비트)과 플랫폼에 따라 사용되는 플래그 및 라이브러리가 조금씩 다르다. 자세한 내용은 다음절 “쉘 프로그램을 이용한 컴파일” 을 참조하도록 한다.

서버 프로그램을 컴파일하여 오브젝트 파일을 생성한다. 서버 프로그램은 Tmax 에서 제공하는 헤더 파일들을 참조해야 하며 필요에 따라 구조체 파일이나 필드버퍼 헤더파일도 참조되어야 한다. 만약 SQL 문을 사용하였다면 먼저 해당 DB 벤더가 제공하는 툴로 프리 컴파일을 마쳐야 한다.

$cc -c -I/home/tmax/usrinc app.c -> app.o

구조체 통신인 경우 구조체 파일을 컴파일한다. 이 단계는 sdlc 을 이용하여 구조체-표준버퍼 변환/역변환 프로그램을 생성하는 단계와 생성한 프로그램을 다시 오브젝트 파일로 컴파일 하는 2 단계로 이루어진다. 구조체 파일을 사용하지 않는다면 TMAXDIR/lib/sdl.o 를 사용한다.

$sdlc -i demo.s -> demo_sdl.c

$cc -c -I/home/tmax/usrinc demo_sdl.c -> demo_sdl.o

시스템 관리자가 제공해준 서비스 테이블을 컴파일하여 오브젝트 파일 형태를 생성한다.

$cc -c app_svctab.c -> app_svctab.o

만들어진 오브젝트 파일들과 Tmax 시스템에서 제공하는 서버 라이브러리를 함께 링크하여 서버 실행 프로그램을 생성한다.

$cc -o app app.o demo_sdl.o app_svctab.o libsvr.a libnodb.a -> aptest

Page 78: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

77 Tmax C Programming Guide

위의 예는 DB 를 사용하지 않는 경우이다. DB 를 사용하는 경우 DB 에 따라 liboras.so(a) / libinfs.so(a) / libdb2.so(a) / libsybs.so(a) 를 사용한다.

아래는 구조체 버퍼를 사용하는 서버 프로그램의 작성 순서이다.

그림 12 서버 프로그램 컴파일(sdl)

아래는 필드 버퍼를 사용하는 서버 프로그램의 작성 순서이다.

Page 79: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 78

그림 13 서버 프로그램 컴파일(fdl)

2.2.3.2 쉘 프로그램을 이용한 컴파일

Tmax 를 설치하면 예제 서버 프로그램 디렉토리에는 기본적으로 예제 프로그램 외에 네개의 메이크 파일과 이를 이용하는 쉘 프로그램이 생긴다(Makefile.c, Makfile.sdl, Makfile.pc, Makefile.psdl, compile).

다음은 구조체 버퍼를 사용하고 DB 를 사용하지 않는 Tmax 서버 프로그램 메이크 파일(Makefile.sdl)의 예이다. $COMP_TARGET 에는 개발한 프로그램의 이름이 들어가며 쉘 프로그램 compile 을 이용하여 넘긴다.

Makefile.sdl

# Server makefile

TARGET = $(COMP_TARGET)

APOBJS = $(TARGET).o

SDLFILE = demo.s

#Not use Db

LIBS = -lsvr -lnodb

Page 80: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

79 Tmax C Programming Guide

#Solaris 의 경우 –lsocket –lnsl 이 추가된다.

#Oracle 의 경우 –lnodb 대신 -loras, Informix 의 경우 –linfs

#Db2 의 경우 –ldb2, Sybase 의 경우 –lsybs 가 들어간다.

OBJS = $(APOBJS) $(SDLOBJ) $(SVCTOBJ)

SDLOBJ = ${SDLFILE:.s=_sdl.o}

SDLC = ${SDLFILE:.s=_sdl.c}

SVCTOBJ = $(TARGET)_svctab.o

CFLAGS = -O -I$(TMAXDIR)

#CFLAG 는 사용 환경(32/64 비트)과 플랫폼에 따라 다르다.

#Solaris 32bit, Compaq, Linux: CFLAGS = -O –I$(TMAXDIR)

#Solaris 64bit: CFLAGS = -xarch=v9 -O –I$(TMAXDIR)

#HP 32bit: CFLAGS = -Ae -O –I$(TMAXDIR)

#HP 64bit: CFLAGS = -Ae +DA2.0W +DD64 +DS2.0 -O –I$(TMAXDIR)

#IBM 32bit: CFLAGS = -q32 –brtl -O –I$(TMAXDIR

#IBM 64bit: CFLAGS = -q64 –brtl -O –I$(TMAXDIR

APPDIR = $(TMAXDIR)/appbin

SVCTDIR = $(TMAXDIR)/svct

LIBDIR = $(TMAXDIR)/lib

#64 비트 환경을 사용하는 경우 $(TMADIR)/lib64 가 된다.

#

.SUFFIXES : .c

.c.o:

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

#

# server compile

#

$(TARGET): $(OBJS)

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

mv $(TARGET) $(APPDIR)/.

Page 81: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 80

rm -f $(OBJS)

$(APOBJS): $(TARGET).c

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

$(SVCTOBJ):

touch $(SVCTDIR)/$(TARGET)_svctab.c

$(CC) $(CFLAGS) -c $(SVCTDIR)/$(TARGET)_svctab.c

$(SDLOBJ):

$(TMAXDIR)/bin/sdlc -i ../sdl/$(SDLFILE)

$(CC) $(CFLAGS) -c ../sdl/$(SDLC)

#

clean:

-rm -f *.o core $(TARGET)

각 메이크 파일의 사용법은 다음과 같다. svr1, svr2, svr3, fdltest, sdltest 는 모두 Tmax 설치시 제공되는 샘플프로그램이다. 자세한 내용은 해당 메이크 파일을 참조하라.

$./compile sdl svr1

$./compile c svr2

$./compile c svr3

$./compile pc fdltest

$./compile psdl sdltest

2.2.3.3 mksvr 유틸리티를 이용한 컴파일

mksvr 유틸리티를 사용하는 경우 Tmax 시스템 환경파일을 작성할 때 미리 서비스 이름을 써 줄 필요가 없으며 gst 를 이용한 서비스 테이블 생성 과정도 필요로 하지 않는다. 그러나 구조체를 사용하는 경우 구조체-표준버퍼 변환/역변환 프로그램은 미리 생성되어 있어야 하며 DB 를 사용할 경우 미리 프리컴파일 과정이 끝난 파일을 사용하거나 RM 파일을 지정해 줘야 한다. 자세한 mksvr 의 이용 방법은 Tmax Reference Manual 을 참고한다.

$cfl –i sample.m

$sdlc –i demo.s

Page 82: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

81 Tmax C Programming Guide

$sdlc –c –i demo.s –o tmax.sdl

$mksvr –s SDLTOUPPER,SDLTOLOWER –o svr1 –f svr1.c –S ../sdl/demo_sdl.c

$mksvr –s TOUPPER,TOLOWER –o svr2 –f svr2.c

$fdlc –c –i demo.s –o tmax.fdl

$mksvr –s FDLTOPPER, FDLTOLOWER –o svr3 –f svr3.c

$proc iname=fdltest include $TMAXDIR

$mksvr –s FDLINS,FDLSEL,FDLDEL,FDLUPT –o fdltest –f fdltest.c

$mksvr –s SDLINS,SDLSEL,SDLDEL,SDLUPT –o sdltest –f sdltest.c

–S ../sdl/demo_sdl.c –r ORACLE

2.3 Tmax 서버 프로그램(UCS)

UCS 서버 프로그램은 클라이언트의 요청을 기다리고 있는 일반 TCS 서버 프로그램과는 달리 클라이언트의 요청이 없을 때도 다른 작업을 할수 있도록 Tmax 에서 프로세스 관리를 해준다. TCS 와 마찬가지로 main() 루틴은 Tmax 시스템이 관리하며 개발자는 클라이언트의 요청이 없는 동안 원하는 작업이 이루어지는 usermain() 루틴을 작성해 주면 되며 필요에 따라 서비스 루틴을 추가할 수도 있다.

TCS 와 마찬가지로 하나의 서비스 내에서 다른 서비스를 호출할 수 있으나 한 프로세스 내의 재귀적인 호출은 불가능하다.

2.3.1 UCS 방식 서버 프로그램의 구성

UCS 서버프로그램은 Tmax 에서 관리하는 main() 과 usermain() 루틴, 여기에 필요에 따라 서비스 루틴으로 이루어진다. main() 은 데이터베이스 연결 및 해제, 명령어 라인 옵션 처리 등의 역할을 하며 usermain() 은 특별한 메시지(서비스 요청이나 제어 메시지)가 없는 동안에 독자적인 작업을 수행하는 루틴이다. 서비스 루틴은 실제로 클라이언트의 요청을 받아 업무를 처리한다.

UCS 방식의 main() 루틴은 일반적인 초기화 작업을 하고 usermain() 루틴을 호출한다. TMM, CLH 로 부터 도착하는 메시지는 usermain() 에서 이루어 진다. 만약 usermain() 이 종료되면 main() 루틴은 tpsvrdone() 루틴을 수행하고 같이 종료된다.

Page 83: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 82

usermain() 루틴은 독자적인 작업을 하다가 일정 시점에 스케줄링 API 를 통하여 TMM, CLH 로부터의 제어 명령이나 서비스 수행 명령을 처리한다. usermain() 이 종료될 경우 해당 서버 프로세스 역시 종료되므로 일반적으로 무한 루프 형식으로 작성된다. 클라이언트의 서비스 요청이나 TMM, CLH 제어 메시지를 처리하기 위해 이 무한 루프 안에는 반드시 하나 이상의 스케줄링 API 가 사용되어야 한다.

usermain() 은 명령어 라인 인수를 받을 수 있으며 이 값은 Tmax 시스템 환경파일 서버절의 CLOPT 에 설정된 값으로 tpsvrinit() 에 전달되는 값과 동일하다. 자세한 내용은 Tmax Administration Guide 를 참조하도록 한다.

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

{

.....

while(1) {

......

tpschedule(-1);

.....

}

return 0;

}

서비스 루틴은 이 TPSVCINFO 구조체를 인자로 받아 해당 작업을 수행해야 한다. 서비스 루틴은 일반적으로 다음과 같이 선언한다.

<서비스 이름>(TPSVCINFO *msg)

서비스 이름은 NULL 종료문자를 포함하여 16 자 이내이며 _(언더바)로 시작되는 이름은 Tmax 에서 내부적으로 사용하므로 사용하지 말것을 권장한다.

UCS 방식 서버 프로그램의 경우 서비스 루틴은 존재하지 않아도 무관하며 이경우 서버 프로세스는 데몬 프로세스와 비슷한 성격을 갖게 된다.

TOUPPER(TPSVCINFO *msg)

{

.....

}

Page 84: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

83 Tmax C Programming Guide

2.3.2 UCS 방식 서버 프로그램 기본 API

여기서는 UCS 방식의 서버 프로그램 작성시 사용되는 API 들에 대해 알아본다. 클라이언트 API 뿐 아니라 일반 TCS 방식의 API 서버 API 도 동일하게 사용이 가능하다. 여기에서는 UCS 방식 서버 프로세스에서만 사용할 수 있는 API 들에 대해 설명한다.

함 수 이 름 기 능

tpschedule() 지정 시간(초)동안 CLH 혹은 사용자 설정 FD에 메시지

가 도착했는지 확인한다. 스케줄링 관련

API

tpuschedule() 지정 시간(마이크로초)동안 CLH 혹은 사용자 설정 FD

에 메시지가 도착했는지 확인한다.

tpgetfd()

UCS 스케줄러에 FD를 등록한다. tpschedule()

/tpuschedule() 은 해당 FD에 도착한 메시지도 검사하

게 된다.

tpissetfd() 해당 FD에 메시지가 도착했는지 검사한다.

소켓 FD 관련

매크로

tpclrfd() 해당 FD를 UCS 스케줄러에서 해제한다.

tpgetctx() 서버 라이브러리 내의 CTX_T 구조체의 값을 사용자 변

수에 저장한다.

tpcancelctx() 서버 라이브러리 내의 CTX_T 구조체의 내용을 지운다.

tpsavectx() 서버 라이브러리 내에 클라이언트의 정보를 저장한다. 서비스 포워딩

tprelay()

tpgetctx() 혹은 tpsavectx() 로 얻은 클라이언트 정보/

트랜잭션 정보와 함께 다른 서비스 루틴으로 클라이언트

의 관리를 넘긴다(TCS 방식 서버 프로그램에서 사용되

는 tpforward() 와 유사하다)

tpregcb() 비동기형 서비스 요청을 처리하는 콜백 펑션을 설정한

다. usermain()

루틴 내에서의

비동기형 통신 tpunregcb() 설정된 콜백 펑션을 해제한다.

Page 85: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 84

표 7 서버 함수

2.3.2.1 스케줄링 관련 API

UCS 방식은 사용자가 개발한 usermain() 루틴이 main() 루틴처럼 사용되므로 스케줄링 API 를 통하여 TMM 과 CLH 로부터 오는 여러가지 메시지를 처리해 줄 필요가 있다.

tpschedule

int tpschedule (int timeout)

timeout

TMM, CLH 혹은 사용자 지정 소켓 FD 로 부터 메시지가 도착했는지 확인하는 시간을 설정한다. timeout

시간은 양의 정수, 0, -1 값을 줄 수 있으며 각각의 의미는 다음과 같다.

양의 정수 해당 시간 동안 메시지를 기다린다(초).

0 메시지가 도착할때 까지 계속 기다린다.

-1 도착한 메시지가 있는지 확인만 하고 바로

리턴한다.

tpschedule() 은 TMM,CLH 로부터 메시지가 도착했는지 확인하여 서비스 요청이나 제어 메시지에 대한 처리를 해주는 API 이다. 사용자가 지정한 소켓 FD 에 도착한 메시지도 확인할 수 있다.

지정한 시간동안 메시지가 도착하지 않았으면 –1 을 리턴하고 tperrno 에는 TPETIME(13) 이 설정된다. API 수행에 실패한 경우에도 –1 을 리턴하므로 반드시 tperrno 의 값을 확인해야 한다.

Page 86: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

85 Tmax C Programming Guide

만약 tpsetfd() 등으로 사용자가 지정한 소켓 FD 에 메시지가 도착한 경우는 UCS_USER_MSG (2)를, 그 이외의 경우는 UCS_TMAX_MSG(1) 를 리턴한다.

usermain()

{

.....

while(1){

......

ret=tpschedule(5);

if (ret<0 && tperrno!=TPETIME){

error process routine

}

.....

}

}

tpuschedule

int tpuschedule (int timeout)

timeout tpschedule() 과 동일하며 다만 설정한 timeout 시간

단위가 마이크로초 (usec)이다. 기타 사항은 tpschedule() 과 완전히 동일하다.

예제

ret=tpuschedule(5);

if (ret<0 && tperrno!=TPETIME){

error process routine

}

2.3.2.2 소켓 FD 관련 매크로

소켓 관련 매크로는 앞서 설명한 tpschedule() 등의 UCS 스케줄러에 사용자의 소켓 FD 를 같이 사용하기 위한 것으로 일반 네트웍 프로그램에서 사용하는 FD_SET, FD_CLR, FD_ISSET 과 유사하다.

Page 87: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 86

tpsetfd

int tpsetfd (int fd)

fd UCS 스케줄러에 등록되는 소켓 FD 값이다. tpschedule() /tpuschedule() 은 이 소켓 FD 에 도착한 메시지도 같이

검사하게 된다.

tpsetft() 는 보통 UCS 서버 프로그램에서 외부 호스트/클라이언트와 소켓 연결을 맺고 통신을 하는 경우 사용하는 API 이다. UCS 스케줄러는 TMM, CLH 뿐만 아니라 해당 소켓 FD 에 도착한 메시지도 같이 검사하게 된다.

사용자가 지정한 소켓에 메시지가 도착했을 경우 tpschedule() 은 별다른 처리없이 정상 결과(UCS_USER_MSG)를 리턴하며 어떤 소켓에 메시지가 도착했는지를 알기 위해서는 아래에 설명된 tpisetfd() 를 사용해야 한다.

tpissetfd

int tpissetfd (int fd)

fd 해당 fd 에 메시지가 도착했는지를 검사한다.

해당 소켓 FD 에 메시지가 도착했는지를 검사하는 API 이다. 메시지가 도착했을 경우는 양의정수를, 도착하지 않은 경우 0 을 리턴한다. 에러가 발생하는 경우 –1 을 리턴한다.

tpclrfd

int tpclrfd (int fd)

fd 해당 소켓 fd 를 UCS 스케줄러에서 제외한다.

더이상 해당 소켓 FD 의 메시지를 스케줄링 하지 않는다.

Page 88: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

87 Tmax C Programming Guide

usermain()

{

.....

while(1) { if (client_fd < 0) { client_fd = network_connect(HOST_ADDR, PORT); if (client_fd > 0) tpsetfd(client_fd); ..... } if (tpschedule(0) < 0) { error process routine } ..... /* 해당 socket fd 로 data 가 도착했는지를 시험한다. */ if (tpissetfd(client_fd)>0) { if ((n = request_from_client(client_fd)) < 0) { tpclrfd(client_fd); close(client_fd); client_fd = -1; } } }

2.3.2.3 서비스 포워딩

Tmax 시스템이 아닌 일반 호스트 시스템과 연동을 하여 운영하는 경우 일반적으로 서버 프로그램에서 소켓을 열고 데이터를 주고 받는 과정을 클라이언트를 대신하여 수행한다. 그러나 외부 호스트 시스템과의 연결이 불안정하거나 서비스 시간이 길경우 해당 서버 프로그램은 블록 상태에 놓이게 되고 추가적인 서비스를 하지 못하게 된다.

Page 89: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 88

이러한 경우를 해결하기 위해 서비스 루틴은 클라이언트의 요청을 받아 클라이언트의 정보를 저장하고 외부 호스트로 요청을 보내는 부분까지만 하고 응답은 usermain() 루틴을 이용하여 받아 저장된 클라이언트의 정보와 함께 다른 서비스 루틴으로 넘겨서 그 서비스 루틴이 클라이언트에게 결과값을 보내도록 한다면 서버 프로그램은 블록되지 않고도 모든 과정을 수행 할 수 있게 된다.

그림 14 UCS 방식 서비스 포워딩

tpsavectx

CTX_T * tpsavectx (void)

인수없음

라이브러리 내부에 현재 접속된 클라이언트의 정보를 저장하며 이 저장된 정보에 대한 포인터를 리턴한다. 리턴된 값은 tprelay() 및 tpcancelctx() 에 인수로 사용될 수 있으며 사용자 임의로 내용을 수정하거나 해제해서는 안된다. 하나의 클라이언트에 대해 한번만

Page 90: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

89 Tmax C Programming Guide

수행되어야 하며 두번 이상 수행될 경우 불필요한 에러 메시지를 발생 시킬 수 있다.

Tmax 는 링크드 리스트 형식으로 이 클라이언트의 정보들을 관리하며 tprelay() 된 클라이언트 데이터는 자동적으로 링크드 리스트에서 제거된다. 만약 서비스 루틴이 종료될때 아직 해결되지 않은 CTX_T 정보가 존재할 경우 클라이언트는 계속 응답을 기다리게 된다.

tpsavectx() 은 서비스 루틴 내에서만 사용할 수 있다.

RELAY_SVC(TPSVCINFO *msg)

{

CTX_T *ctxp;

.....

ctxp = (CTX_T *)tpsavectx();

if (ctxp==NULL) {

error process routine

}

.....

}

tpgetctx

int tpgetctx (CTX_T *ctxp)

ctxp tpsavectx() 로 저장된 클라이언트의 정보를 CTX_T

구조체로 받아온다.

현재 클라이언트의 정보를 사용자가 선언, 할당한 CTX_T 구조체에 복사해온다. tpgetctx() 를 사용했을 경우 tprelay() 로 이 정보를 사용하지 않을 경우 해당 서비스 루틴이 완료되더라도 클라이언트는 계속 응답을 기다리게 된다. tpgetctx() 로 얻어진 정보는 tpcancelctx() 로 취소할 수 없으므로 반드시 tprelay() 를 사용해 줘야 한다.

tpgetctx() 는 서비스 루틴 내에서만 사용할 수 있다.

RELAY_SVC(TPSVCINFO *msg)

{

Page 91: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 90

CTX_T *ctxp;

ctxp=(CTX_T *)malloc(sizeof(CTX_T);

.....

ret = tpgetctx(ctxp);

if (ret<0) {

error process routine

}

.....

}

tpcancelctx]

int tpcancelctx (CTX_T *ctxp)

ctxp 라이브러리 내부에 저장된 CTX_T 구조체의 내용을 지운다.

tpsavectx() 로 저장된 클라이언트 정보들 중 해당 구조체의 내용을 취소한다. 즉 tprelay() 하지 않아도 서비스 루틴이 종료되면 정상적으로 결과가 리턴된다.

tpgetctx() 는 서비스 루틴 내에서만 사용할 수 있다.

RELAY_SVC(TPSVCINFO *msg)

{

.....

ctxp = (CTX_T *)tpsavectx();

.....

ret=tpcancelctx(ctxp);

if (ret<0) {

error process routine

}

.....

tpreturn(TPFAIL, sqlca.sqlcode, NULL, 0, TPNOFLAGS);

}

tprelay

int tprelay(char *svc, char *data, long len, long flags, CTX_T *ctxp)

Page 92: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

91 Tmax C Programming Guide

svc Tmax 환경파일에 등록된 서비스 이름을 지정한다.

data 서비스를 호출 할 때 전달되는 데이터로 NULL 이 아닌 경우는 반드시 tpalloc() 으로 할당된 버퍼를 사용하여야

한다.

len 보내는 데이터의 길이를 지정한다. CARRAY, X_OCTET, 구조체 배열 타입 일 경우에는 반드시 설정해야 한다.

flags 현재 사용되지 않으며 TPNOFLAGS 를 설정한다.

ctxp tpgetctx() 혹은 tpsavectx() 로 받아온 정보 구조체이다.

데이터와 함께 tpgetctx() 혹은 tpsavectx() 로 얻은 클라이언트의 정보를 보내어 클라이언트에 대한 관리를 지정한 서비스 루틴으로 이전한다. 서비스를 완료하는 tpforward() API 와 유사하지만 tpforward() 의 경우 API 수행 후 바로 서비스가 완료되고 tprelay() 의 경우 나머지 서비스 루틴을 모두 수행한다. tpsavectx() 나 tpgetctx() 를 사용하는 경우 서비스 루틴의 tpreturn() 은 클라이언트에게 아무 메시지도 보내지 않는다.

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

{

.....

ptr=tpalloc(“STRING”, NULL, 0);

while(1)

{

.....

tpscedule(0);

.....

Page 93: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 92

ret=tprelay(("SELECT_ORA", ptr, 0, TPNOFLAGS, ctxp);

if (ret < 0) {

error process routine

}

.....

}

return 0;

}

2.3.2.4 usermain() 루틴 내에서의 비동기형 통신

usermain() 루틴 내에서 서비스 시간이 긴 비동기형 통신을 사용하는 경우 tpgetreply() 에서 블록이 일어나 스케줄링이 늦어지는 경우가 있다. 이때 서비스 결과를 tpgetreply() 로 받지 않고 콜백 펑션을 지정하면 스케줄링에 지장이 없이 결과값을 처리할 수 있다. 그러나 루프 시간이 짧은 usermain() 내에서 매번 비동기형 통신이 일어나는 경우 최대 비동기형 서비스 수를 초과하게 되어 에러가 발생하게 되므로 주의하도록 한다.

tpregcb

typedef int (__cdecl *UcsCallback)(UCSMSGINFO*) int tpregcb (UcsCallback)

UcsCallback 비동기형 서비스 호출 즉 tpacall() 에 대한 응답을

받는 콜백 함수를 설정한다.

usermain() 루틴에서 사용된 tpacall() 에 대한 응답을 콜백 펑션으로 처리하고 싶을때 사용한다. 처리시점은 tpschedule() 혹은 tpuschedule() 이 수행 되었을 때이다. 콜백 펑션의 인수로 사용되는 UCSMSGINFO 구조체의 내용은 아래와 같다.

UCSMSGINFO

Page 94: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

93 Tmax C Programming Guide

long urcode 사용자가 지정한 urcode 값이다.

int errcode 에러 상황일 경우 에러코드가 저장된다.

int msgtypeTmax 시스템이 내부적으로 사용하는 메시지

타입이다. tpacall() 에 대한 정상적인 응답은

1004 로 나타난다.

int cd 연결 구별자. tpacall() 로 얻어지는

구별자이다.

long len 요청 데이터 길이. CARRAY, X_OCTET,

구조체 배열인 경우 값이 설정된다.

char *data

해당 서비스에서 온 결과값으로 main() 루틴

내에서 tpalloc() 으로 할당된 버퍼이다. 클라이언트에서 사용된 버퍼 형식으로 형변환 하여 사용한다. 사용자 임의로

메모리 해제할 수 없다.

usermain()

{

tpregcb(reply_receive)

while(1){

tpacall(“SVC”, msg->data, msg->len, TPNOFLAGS);

.....

}

}

int reply_receive(UCSMSGINFO *reply)

{

printf("errcode : %d\n", reply->errcode);

printf("msgtype : %d\n", reply->msgtype);

printf("cd : %d\n", reply->cd);

printf("data....%s\n", reply->data);

Page 95: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 94

return 0;

}

tpunregcb

int tpunregcb (void)

인수없음

설정된 콜백펑션을 해제하는 함수이다.

2.3.3 UCS 방식 서버 프로그램 컴파일

UCS 방식 서버 프로그램의 컴파일은 TCS 방식의 서버 프로그램과 크게 다르지 않다. 준비 사항과 컴파일 순서는 완전히 동일하며 다만 서버 라이브러리를 libsvr.a (혹은 libsvr.so) 가 아닌 libsvrucs.a (혹은 libsvrucs.so) 를 사용하면 된다.

2.3.3.1 서버 프로그램 컴파일 순서

아래는 일반적인 C 컴파일러를 이용한 컴파일 방법이다. 이 과정은 적당한 쉘 프로그램을 사용 만들어 사용하거나 mksvr 유틸리티를 이용하면 간단하게 처리 할 수 있다. 아래의 예는 리눅스에서의 실행 결과이며 개발 환경(32/64 비트)과 플랫폼에 따라 사용되는 플래그 및 라이브러리가 조금씩 다르다. 사용 라이브러리를 제외하고는 TCS 방식과 완전히 동일하므로 자세한 내용은 “TCS 방식 서버 프로그램 컴파일” 을 참조하도록 한다.

서버 프로그램을 컴파일하여 오브젝트 파일을 생성한다. 서버 프로그램은 Tmax 에서 제공하는 헤더 파일들을 참조해야 하며 필요에 따라 구조체 파일이나 필드버퍼 헤더파일도 참조되어야 한다. 만약 SQL 문을 사용하였다면 먼저 해당 DB 벤더가 제공하는 툴로 프리 컴파일을 마쳐야 한다.

$cc -c -I/home/tmax/usrinc app.c -> app.o

구조체 통신인 경우 구조체 파일을 컴파일한다. 이 단계는 sdlc 을 이용하여 구조체-표준버퍼 변환/역변환 프로그램을 생성하는 단계와 생성한 프로그램을 다시 오브젝트 파일로 컴파일 하는 2 단계로 이루어진다..

$sdlc -i demo.s -> demo_sdl.c

Page 96: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

95 Tmax C Programming Guide

$cc -c -I/home/tmax/usrinc demo_sdl.c -> demo_sdl.o

구조체 파일을 사용하지 않는다면 이 과정을 수행할 필요 없이 TMAXDIR/lib 디렉토리 내의 sdl.o 를 사용하여 같이 컴파일 하도록 한다.

시스템 관리자가 제공해준 서비스 테이블을 컴파일하여 오브젝트 파일 형태를 생성한다.

$cc -c app_svctab.c -> app_svctab.o

만들어진 오브젝트 파일들과 Tmax 시스템에서 제공하는 서버 라이브러리를 함께 링크하여 서버 실행 프로그램을 생성한다.

$cc -o app app.o demo_sdl.o app_svctab.o libsvrucs.a libnodb.a -> app

$cc -o app app.o sdl.o app_svctab.o libsvrucs.a libnodb.a -> app

위의 예는 DB 를 사용하지 않는 경우이다. DB 를 사용하는 경우 DB 에 따라 liboras.so(a) / libinfs.so(a) / libdb2.so(a) / libsybs.so(a) 를 사용한다.

쉘 프로그램을 사용하는 경우 해당 메이크 파일의 –lsvr 을 –lsvrucs 로 바꾼다. 사용법은 동일하다.

2.3.3.2 mksvr 유틸리티를 이용한 컴파일

mksvr 유틸리티를 사용하는 경우 Tmax 시스템 환경파일을 작성할 때 미리 서비스 이름을 써 줄 필요가 없으며 서비스 테이블 생성(gst)과정도 필요로 하지 않는다. 그러나 구조체를 사용하는 경우 구조체=표준버퍼 변환/역변환 프로그램은 미리 생성되어 있어야 하며 DB 를 사용할 경우 미리 프리컴파일 과정이 끝난 파일을 사용하거나 RM 파일을 지정해야 한다. 자세한 mksvr 의 이용 방법은 Tmax Reference Manual 을 참고한다.

$cfl –i sample.m

$sdlc –i demo.s

$sdlc –c –i demo.s –o tmax.sdl

$mksvr –s UCSSAMPLE –o ucs_svr –f ucs_svr.c –S ../sdl/demo_sdl.c –t UCS

Page 97: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 96

3 Tmax 어플리케이션 개발(B)

3 장 에서는 이전장에서 설명한 것 이외에 Tmax 시스템이 제공하는 고유의 기능을 사용하기 위한 API 의 사용법과 간단한 예제를 제시하며 개발 과정에 발생하는 에러메시지에 대한 간략한 설명을 포함한다.

대화형 통신

트랜잭션 관리

RQ 시스템

RDP

멀티 캐스트

Windows 환경 프로그래밍

Tmax 보안 시스템

디버깅

3.1 대화형 통신

대화형 통신은 클라이언트와 서버간에 이루어지는 반이중 통신이다. 처음 대화형 모드로 접속할때 대화 주도권을 설정하며 대화 주도권을 잡는 쪽은 송신, 상대편은 수신만이 가능하다. 대화 주도권을 갖고 있는 쪽은 언제든지 상대편에게 주도권을 넘길 수 있으므로 메시지를 주고 받은 것이 가능하다. 이러한 대화 주도권의 제어는 송신측의 플래그를 사용하여 이루어지며 수신측은 이러한 변화를 이벤트값을 통해 알 수 있다.

Page 98: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

97 Tmax C Programming Guide

3.1.1 대화형 통신의 흐름

대화형 통신은 tpconnect() 를 호출함으로써 시작된다. 이 함수는 해당 대화형 서비스에 데이터를 보내는 동시에 대화 주도권을 설정하게 된다. tpconnect() 가 성공적으로 수행되면 각각의 대화모드를 구분하기 위한 ‘연결 구분자(cd)’ 를 반환하며 이것을 이용하여 해당 대화 모드를 이용하여 메시지를 송수신 할 수 있게 된다.

대화형 통신은 서비스 중의 문맥(context)에 따라 추가적인 정보가 필요한다던가 하는 경우에 사용한다. 그러나 연결 시간이 길고 서버 자원의 사용도가 낮아지므로 가급적 일반적인 동기형/비동기형 통신을 사용하여 개발하는 것을 권장한다.

일반적으로 대화형 통신은 서버 측에서 tpreturn() 을 호출하여 완료된다. 이경우 상대방은 데이터와 함께 TPEV_SVCSUCC 이벤트를 수신하게 된다. 대화를 시도한 측에서 tpdiscon() 를 호출함으로써 대화형 통신을 강제적으로 종료할 수도 있으며 이 경우 전송중의 데이터는 사라질 수도 있고 진행 중인 트랜잭션은 롤백된다.

대화 주도권은 주도권을 갖고 있는 쪽에서만 상대방에게 넘겨줄 수 있으며 tpsend() API 의 TPRECVONLY 플래그를 이용한다. 상대방은 데이터와 함께 TPEV_SENDONLY 이벤트를 수신하게 되고 대화 주도권을 잡게 된다.

그림 15 대화형 통신

Page 99: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 98

3.1.2 대화형 통신 API

아래는 대화형 통신의 대표적인 API 만을 요약한 것이다. API 들에 대한 상세한 설명은 Tmax Reference Manul 을 참고하도록 한다.

함 수 이 름 기 능

tpconnect()

대화형 서비스와 연결을 설정하고 각각의 대화모드를 구분하기 위한 연결 구분자를

반환한다. 연결 설정시 반드시 대화 주도권을 설정해야 한다.

tpdiscon() 대화형 서비스와의 연결을 즉시 종료한다.

처음 연결을 주도한 측에서만 사용할 수 있는 API 이다.

tprecv() 대화형 모드에서 메시지를 수신한다.

대화형 통신 API

tpsend() 대화형 모드에서 메시지를 송신한다.

표 8 대화형 통신 API

3.1.2.1 대화형 통신 API

대화형 통신에 사용되는 API 들의 사용법에 대해 설명한다. 대화를 시작하는 측은 처음 대화를 누가 시작할지를 지정해야 하며 대화 주도권을 갖고 있는 측은 플래그를 설정하여 대화 주도권을 넘길 수 있다.

Page 100: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

99 Tmax C Programming Guide

대화를 일방적으로 단절하는 tpdiscon() 의 경우는 대화 주도권에 관계없이 먼저 대화를 시작한 쪽에서만 사용할 수 있다.

tpconnect

int tpconnect (char *svc, char *sbuf, long slen, long flags)

svc Tmax 환경파일에 등록된 서비스 이름을 지정한다.

sbuf 서비스를 호출 할 때 전달되는 데이터로 NULL 이 아닌 경우는 반드시 tpalloc() 으로 할당된 버퍼를

사용하여야 한다.

slen 보내는 데이터의 길이를 지정한다. CARRAY, X_OCTET, 구조체 배열 타입 일 경우에는 반드시 설정해야 한다.

flags TPNOTIME, TPSIGRSTRT, TPNOTRAN, TPSENDONLY,

TPRECVONLY 가 지정될 수 있다. 자세한 사항은 아래와 같다.

TPNOTRAN 호출 시점이 트랜잭션 영역일 경우

호출로 인한 결과를 트랜잭션 범주에서 제외한다.

TPNOTIME

클라이언트 혹은 서버측이 설정한 블록 타입아웃 시간을 무시하고 결과값을 받을때까지 기다린다.

그러나 트랜잭션 영역에서 호출했다면 트랜잭션 타임아웃

시간은 그대로 적용된다.

Page 101: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 100

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때 사용한다. 개발자가 시그널을 사용할 경우 시스템 함수

호출 도중에 시그널이 발생하면 시스템 함수 호출은 중단되고 해당

API 는 TPGOTSIG 에러를 리턴하지만 TPSIGRSTRT 플래그를 설정할 경우 중단된 시스템 함수

호출이 재실행된다.

TPSENDONLY 대화 주도권을 클라이언트측이

갖는다. 클라이언트는 반드시 tpsend() 로 대화를 시작해야 한다.

TPRECVONLY 대화 주도권을 서버측이 갖는다. 클라이언트는 반드시 tprecv() 로

대화를 시작해야 한다.

tpconnect() 로 보내진 데이터는 일반적인 동기형/비동기형 서비스와 마찬가지로 TPSVCINFO 구조체에 넣어져 대화형 서비스 루틴에 전달된다. 이때 TPSENDONLY 와 TPRECVONLY 중 하나는 반드시 설정되어야 한다.

tpconnect() 가 정상적으로 수행되면 다른 대화형 모드와의 구분을 위한 연결 구분자(cd)가 리턴된다. 이 값은 해당 대화형 모드로 데이터를 주거나 받을때 인수로 사용된다.

...

if ((cd = tpconnect(“ACCOUNT”, NULL, 0, TPSENDONLY)) == -1)

{

error processing routine;

}

tpsend(cd, ..... )

Page 102: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

101 Tmax C Programming Guide

Page 103: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 102

tpsend

int tpsend (int cd, char *sbuf, long slen, long flags, long *revent)

cd tpconnect() 로 얻어진 연결 구분자이다.

sbuf 서비스를 호출 할 때 전달되는 데이터로 NULL 이 아닌 경우는 반드시 tpalloc() 으로 할당된 버퍼를 사용하여야

한다.

slen 보내는 데이터의 길이를 지정한다. CARRAY, X_OCTET, 구조체 배열 타입 일 경우에는 반드시 설정해야 한다.

flags TPNOTIME,TPSIGRSTRT, TPRECVONLY, TPNOFLAGS 가

지정될 수 있다. 자세한 사항은 아래와 같다.

TPNOTIME

클라이언트 혹은 서버측이 설정한 블록 타입아웃 시간을 무시하고 결과값을

받을때까지 기다린다. 그러나 트랜잭션 영역에서 호출했다면 트랜잭션 타임아웃

시간은 그대로 적용된다.

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때 사용한다. 개발자가

시그널을 사용할 경우 시스템 함수 호출 도중에 시그널이 발생하면 시스템 함수

호출은 중단되고 해당 API 는 TPGOTSIG 에러를 리턴하지만 TPSIGRSTRT

플래그를 설정할 경우 중단된 시스템 함수 호출이 재실행된다.

Page 104: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

103 Tmax C Programming Guide

TPRECVONLY 대화 주도권을 상대편에게 넘긴다.

TPNOFLAGS 일반적으로 사용되는 플래그이다.

revent

이벤트 발생시 발생 이벤트 값이 설정된다. 이벤트가 발생하면 API 는 실패하고 데이터는 송신되지 않으며

tperrno 는 TPEEVENT 가 설정된다. 자세한 내용은 다음과 같다.

TPEV_DISCO

NIMM

대화모드 종속자에게 전달되며 대화모드 시작자가 tpdiscon() 으로 연결을

해제하였음을 나타낸다.

cd=tpconnect( ..... )

...

/* 연결 컨트롤을 상대방에게로 넘김. */

if (tpsend(cd, line, 0 , TPRECVONLY, &revent) == -1) {

error processing routine

}

tprecv(cd , ..... )

tprecv

int tprecv(int cd, char **rbuf, long *rlen, long flags, long *revent)

cd tpconnect() 로 얻어진 연결 구분자이다.

Page 105: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 104

rbuf 서비스를 호출 할 때 전달되는 데이터로 NULL 이 아닌 경우는 반드시 tpalloc() 으로 할당된 버퍼를 사용하여야

한다.

rlen 보내는 데이터의 길이를 지정한다. CARRAY, X_OCTET, 구조체 배열 타입 일 경우에는 반드시 설정해야 한다.

flags TPNOTIME,TPSIGRSTRT, TPNOBLOCK, TPNOCHANGE, TPNOFLAGS 가 지정될 수 있다. 자세한 사항은 아래와

같다.

TPNOTIME

클라이언트 혹은 서버측이 설정한 블록 타입아웃 시간을 무시하고 결과값을

받을때까지 기다린다. 그러나 트랜잭션 영역에서 호출했다면 트랜잭션 타임아웃

시간은 그대로 적용된다.

TPSIGRST

RT

이 플래그는 시그널 인터럽트를 수용하고자 할때 사용한다. 개발자가 시그널을 사용할 경우 시스템 함수 호출 도중에 시그널이

발생하면 시스템 함수 호출은 중단되고 해당 API 는 TPGOTSIG 에러를 리턴하지만

TPSIGRSTRT 플래그를 설정할 경우 중단된 시스템 함수 호출이 재실행된다.

TPNOBLO

CK

서비스 수행결과 받아온 데이터가 내부 버퍼에 존재하지 않을 경우 타임아웃

시간동안 Tmax 시스템과 접속된 소켓을 검사하게 되는데 TPNOBLOCK 플래그를

사용하면 원하는 메시지가 없는 경우 바로

Page 106: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

105 Tmax C Programming Guide

에러를 리턴하게 된다. (TPEBLOCK)

TPNOCHA

NGE

서비스 호출 결과로 받아온 데이터 타입이 rbuf 의 타입과 다를 경우 형변환이 일어나는데 TPNOCHANGE 플래그를

설정하면 형변환 대신 에러가 발생한다.(TPEOTYPE)

TPNOFLA

GS 일반적으로 사용되는 플래그이다.

revent

이벤트 발생시 발생 이벤트 값이 설정된다. 이벤트가 발생하면 API 는 실패하고 데이터는 송신되지 않으며

tperrno 는 TPEEVENT 가 설정된다. 자세한 내용은 다음과 같다.

TPEV_DISCONIM

M

대화모드 종속자에게 전달되며 대화모드 시작자가 tpdiscon() 으로 연결을 해제하였음을

나타낸다.

TPEV_SENDONLY

대화 주도권이 넘어왔음을 의미한다.

TPEV_SV

CSUCC

대화 시작자에게 수신되며 서비스가 성공적으로 완료 되었음을 알린다. 즉 tpreturn

() 의 rval 값이 TPSUCCESS 인 경우이다.

TPEV_SV 서비스가 실패하였음을 알린다. tpreturn () 의

Page 107: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 106

CFAIL rval 값이 TPFAIL 이다.

TPEV_SV

CERR

tpreturn() 과정에 시작된 로컬 트랜잭션이 완료되지 않은 경우나 아직 받지 않은

비동기형 응답이 존재하는 등 비정상적인 경우

rval 값에 무관하게 발생한다.

SVC(tpsvcinfo *msg)

{

...

if (tprecv(msg->cd, &rcvbuf, &rlen, TPNOFLAGS, &revent)==-1)

{

/*제어권이 넘어온 경우는 정상*/

if (revent != TPEV_SENDONLY)

{

tpreturn(TPFAIL, 0, rcvbuf, 0, 0);

}

}

...

}

tpdiscon

void tpdiscon (int cd)

cd tpconnect() 로 얻어진 연결 구분자.

tpdiscon() 은 이미 설정된 대화형 모드를 즉시 해제하는 API 로써 처음 tpconnect() 를 호출하여 연결을 설정한 측에서만 사용할 수 있다. 그렇지 않을경우 tpdiscon() 은 에러를 리턴하며 tperrno 는 TPEPROTO 가 설정된다.

API 가 성공적으로 수행되면 상대방은 TPEV_DISCONIMM 이벤트를 수신하며 해당 cd 는 더이상 사용할 수 없다. 만약 트랜잭션이 진행

Page 108: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

107 Tmax C Programming Guide

중이었다면 롤백되고 전송중의 메시지는 버려진다. 그러므로 대화형 모드에서 연결을 끊는 적당한 방법으로 서버 쪽에서 tpreturn()를 호출하는 것을 권장한다.

연결 해제에 tpdiscon() 을 사용하는 경우 메시지가 유실될 우려가 있으므로 일반적으로 대화형 통신의 완료는 tpreturn() 을 통해 이루어지게 된다. tpreturn() 의 인수값에 따라 이벤트 값은 TPEV_SVCSUCC 또는 TPEV_SVCFAIL 로 설정된다.

if ((cd = tpconnect(“ACCOUNT”, NULL, 0, TPSENDONLY)) == -1) {

error

}

. . .

if (error){

tpdiscon(cd); /* 예외적인 경우 발생 */

}

3.1.2.2 대화형 통신 이벤트

대화형 통신에서는 5 가지의 이벤트가 존재한다. 아래의 표는 5 개의 이벤트가 발생되는 함수와 의미를 나타내고 있다.

Event 받는 함수 의 미

TPEV_DISCONIMN

(0x0001)

tpsend()

tprecv()

연결이 비정상적으로 끊어졌을 때를 의미하며 대화형 모드를 설정한 측에서 tpdiscon() 을

호출하였거나 기타 네트웍 장애로 대화형 통신

API 의 수행이 실패하였을때에도 발생한다.

TPEV_SVCERR

(0x0002) tprecv()

tpreturn() 과정에 에러가 발생하거나 서비스가 완전히 완료되지 않은 경우에 발생한다.

TPEV_SVCFAIL

(0x0004) tprecv()

tpreturn() 의 rval 에 TPFAIL 나 TPEXIT 를 지정하여 호출할 때 발생한다.

Page 109: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 108

TPEV_SVCSUCC

(0x0008) tprecv()

tpreturn() 의 rval 에 TPSUCCES 를 지정하였으며 서비스를 정상적으로

완료하였음을 의미한다.

TPEV_SENDONLY

(0x0020) tprecv()

상대방에게서 대화 주도권이 넘어 왔음을 의미한다.

표 9 대화형 통신 시의 이벤트

3.2 트랜잭션 관리

트랜잭션은 하나의 자원에 접근하는 다수의 다단계 구성의 업무 처리과정에 있어 일관적으로 자원의 상태 변화를 적용하기 위해 모든 구성단계를 하나의 작업 단위로 묶은 것이다. 트랜잭션 과정은 이른바 ACID 특성을 지원함으로써 자원은 일관성을 보장받게 된다.

로컬 트랜잭션 : 하나의 자원관리자(DB) 가 참여하는 트랜잭션.

전역 트랜잭션 : 둘 이상의 자원관리자가 참여하는 트랜잭션

현재 Tmax 시스템은 중첩(nested) 트랜잭션을 지원하지 않는다.

3.2.1 Tmax 시스템의 트랜잭션 관리

Tmax 시스템에서 자원 관리자를 사용하는 경우 두가지 방식으로 운영이 가능하다.

첫째 XA 모드 Tmax 시스템은 따로 트랜잭션 관리자(TMS)를 두어 트랜잭션 전체를 관리하도록 하는 것을 말한다. XA 모드로 운영되는 경우 모든 트랜잭션은 일단 전역 트랜잭션으로 간주되며 데이터의 무결성 확보를 위해 2PC(Two-Phase Commit)를 사용한다.

XA 모드인 경우 따로 Tmax 환경 파일에 자원관리자와의 접속과 접속 해제를 위한 설정이 필요하며 트랜잭션 관리는 Tmax API 를 사용하여 처리하게 된다. 분산환경의 전역 트랜잭션의 관리하는데 사용된다.

아래는 XA 모드를 사용하는 Tmax 환경 파일의 예이다(부분). 자세한 내용은 Tmax Administration Guide 를 참조하도록 한다.

Page 110: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

109 Tmax C Programming Guide

*SVRGROUP

svg1 NODENAME = tmax,

DBNAME = ORACLE,

OPENINFO = “ORACLE_XA+Acc=P/scott/tiger+SesTm=600”,

TMSNAME = svg1_tms

*SERVER

svr1 SVGNAME = svg1

둘째 Non-XA 모드 Tmax 시스템은 자원 관리자에 직접 트랜잭션 명령을 내리는 것으로 분산환경에서의 전역 트랜잭션은 사용할 수 없다. 간단한 작업이나 수행시간이 긴 배치성 작업을 하는데 적당하다.

Non-XA 모드의 경우 특별히 다른 설정을 필요로 하지 않으나 어플리케이션에서 따로 자원관리자와 연결을 맺고 트랜잭션을 선언해 주어야 한다.

3.2.2 트랜잭션 관리 API

아래는 트랜잭션 처리의 기본적인 API 만을 요약한 것이다. API 들에 대한 상세한 설명은 Tmax Reference Manul 을 참고하도록 한다.

함 수 이 름 기 능

tx_begin() 트랜잭션을 시작한다.

tx_commit() 트랜잭션을 완료한다(커밋).

트랜잭션

처리 함수

tx_rollback() 트랜잭션을 완료한다(롤백).

Page 111: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 110

tx_set_transaction_timeout()

트랜잭션 처리 한계시간을 설정한다.

tx_set_transaction_control()

트랜잭션 완료후 바로 트랜잭션을 시작할 것이지 설정한다.

tx_set_commit_return()

커밋 명령의 리턴 시점을 결정한다.

tx_info() 트랜잭션 상태정보를 보여준다.

표 10 트랜잭션 관리 API

tx_begin

int tx_begin (void)

인수 없음.

전역 트랜잭션의 시작을 선언한다. 트랜잭션에 참여하는 데이터베이스는 미리 열린 상태(리소스 관리자와 연결된 상태)이어야 하며 전역 트랜잭션을 시작한 프로세스는 tx_commit() 이나 tx_rollback() 으로 트랜잭션을 완료할 의무를 가진다. 다른 프로세스에서 트랜잭션 완료 API 를 호출하면 TX_PROTOCOL_ERROR 가 발생한다. 트랜잭션 중에 tpend() 를 수행하거나 프로그램이 종료되면 트랜잭션은 롤백된다.

트랜잭션이 체인 모드에 있다면(tx_set_transaction_control() 참조) 커밋 혹은 롤백으로 트랜잭션이 완결됨과 동시에 tx_begin() 호출이 없이 바로 다음 트랜잭션이 시작된다. 이미 트랜잭션 상태에 있을 경우나 서버 프로그램 내에서 데이터베이스가 열려져 있지 않은 상태에서 tx_begin() 을 호출한 경우 TX_PROTOCOL_ERROR 를 리턴하게 된다.

반환되는 에러 값은 아래와 같다

Page 112: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

111 Tmax C Programming Guide

TX_OUTSIDE ( -1 )

- 이미 외부의 다른 전역 트랜잭션에 참여하고 있어서 새로운 트랜잭션을 시작할 수 없을 때 반환되는 에러이다.

TX_PROTOCOL_ERROR ( -5 )

- Tmax 시스템과 연결이 설정되어 있지 않거나 트랜잭션 내에서 다시 트랜잭션을 시작하는 등 적당하지 않은 문맥에서 tx_begin() 이 호출될 때 반환되는 에러이다.

TX_ERROR ( -6 )

- 새로운 트랜잭션을 시작하려고 할 때 TM(transaction manager)이나 RM(resource manager)에서 일시적인 에러가 발생하여 반환되는 값이다.

TX_FAIL ( -7 )

- 메모리 할당이나 데이터베이스와의 연결 실패와 같은 심각한 에러가 발생하여 트랜잭션을 시작하는데 실패하였다.

예제

...

ret = tx_begin();

if (ret < 0){

error processing routine

}

printf("tx begin ok!\n");

tx_commit

int tx_commit (void)

인수 없음.

Page 113: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 112

tx_commit() 은 트랜잭션을 완료하고 정보를 갱신한다.

만일 트랜잭션이 체인모드 라면 (tx_set_transaction_control() 참조) 커밋 완료후 새로운 트랜잭션을 시작하고 체인상태로 설정되어 있지 않으면 비 트랜잭션 상태로 전환된다.

tx_commit() 이 성공하면, TX_OK ( 0 )를 반환하고, 실패하면 아래와 같은 에러값을 반환한다

TX_NO_BEGIN ( -100 )

- 트랜잭션이 체인모드로 설정되어 있는 경우에 발생하며 현재 트랜잭션은 커밋에 성공하였지만 새로운 트랜잭션을 시작하는데 실패하였다.

TX_ROLLBACK ( -2 )

- 타임아웃이나 에러등으로 커밋이 불가능한 상황에 발생하며 트랜잭션은 커밋되지 않고 롤백 된다.

TX_ROLLBACK_NO_BEGIN ( -102 )

- 트랜잭션이 체인모드로 설정되어 있는 경우에 발생하며 트랜잭션은 롤백되었고 새로운 트랜잭션을 시작하는데 실패하였다.

TX_MIXED ( -3 )

- 트랜잭션이 부분적으로 실행(commit)되고 부분적으로 취소(rollback)되었다. 트랜잭션이 체인상태로 설정된 경우 새로운 트랜잭션은 시작될 수 있다.

TX_MIXED_NO_BEGIN ( -103 )

- 트랜잭션이 부분적으로 실행되고 부분적으로 취소되었고, 트랜잭션이 체인상태로 설정된 경우 새로운 트랜잭션을 시작할 수 없다.

TX_HAZARD ( -4 )

Page 114: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

113 Tmax C Programming Guide

- 외부 장애로 인해, 트랜잭션이 부분적으로 실행(commit)되고 부분적으로 취소(rollback)되었다. 트랜잭션이 체인상태로 설정된 경우 새로운 트랜잭션은 시작될 수 있다.

TX_HAZARD_NO_BEGIN (-104 )

- 외부 장애로 인해, 트랜잭션이 부분적으로 실행되고 부분적으로 취소되었으며 트랜잭션이 체인상태로 설정된 경우 새로운 트랜잭션을 시작할 수 없다.

TX_PROTOCOL_ERROR ( -5 )

- Tmax 시스템과 접속되지 않은 상태나 트랜잭션이 시작되지 않은 상태, 아직 완료되지 않은 대화형 모드나 비동기형 모드가 존재하는 경우와 같은 적절하지 않은 상황에서 tx _commit() 이 호출되었다.

TX_FAIL ( -7 )

- 메모리 할당이나 데이터베이스와의 연결 실패와 같은 심각한 에러가 발생하여 더 이상 트랜잭션을 처리할 수 없을 때 반환되며 비 트랜잭션 상태로 전환된다.

예제

...

ret = tx_commit();

if (ret < 0)

{

error processing routine

}

printf("tx commit ok!\n");

tx_rollback

Page 115: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 114

int tx_rollback (void)

인수 없음.

tx_rollback() 은 트랜잭션을 완료 하고 이전 상태로 복구한다.

만일 트랜잭션이 체인모드 라면 (tx_set_transaction_control() 참조) 롤백 완료후 새로운 트랜잭션을 시작하고 체인상태로 설정되어 있지 않으면 비트랜잭션 상태로 전환된다.

tx_rollback() 이 성공하면, TX_OK ( 0 )를 반환하고, 실패하면 아래와 같은 에러값을 반환한다

TX_NO_BEGIN ( -100 )

- 트랜잭션이 체인모드로 설정되어 있는 경우에 발생하며 현재 트랜잭션은 롤백에 성공하였지만 새로운 트랜잭션을 시작하는데 실패하였다.

TX_COMMITTED ( -9 )

- 트랜잭션이 데이터베이스에 의해 독자적으로(heuristically) 실행되어 데이터베이스에 따라 부분적으로 commit 되거나 rollback 되었다.

TX_COMMITTED_NO_BEGIN ( -109 )

- 트랜잭션이 체인모드로 설정되어 있는 경우에 발생하며 트랜잭션은 커밋되었고 새로운 트랜잭션을 시작하는데 실패하였다.

TX_MIXED ( -3 )

- 트랜잭션이 부분적으로 실행(commit)되고 부분적으로 취소(rollback)되었다. 트랜잭션이 체인상태로 설정된 경우 새로운 트랜잭션은 시작될 수 있다.

TX_MIXED_NO_BEGIN ( -103 )

Page 116: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

115 Tmax C Programming Guide

- 트랜잭션이 부분적으로 실행되고 부분적으로 취소되었고, 트랜잭션이 체인상태로 설정된 경우 새로운 트랜잭션을 시작할 수 없다.

TX_HAZARD ( -4 )

- 외부 장애로 인해, 트랜잭션이 부분적으로 실행(commit)되고 부분적으로 취소(rollback)되었다. 트랜잭션이 체인상태로 설정된 경우 새로운 트랜잭션은 시작될 수 있다.

TX_HAZARD_NO_BEGIN ( -104 )

- 외부 장애로 인해, 트랜잭션이 부분적으로 실행되고 부분적으로 취소되었으며 트랜잭션이 체인상태로 설정된 경우 새로운 트랜잭션을 시작할 수 없다.

TX_PROTOCOL_ERROR ( -5 )

- Tmax 시스템과 접속되지 않은 상태나 트랜잭션이 시작되지 않은 상태, 아직 완료되지 않은 대화형 모드나 비동기형 모드가 존재하는 경우와 같은 적절하지 않은 상황에서 tx _commit() 이 호출되었다.

TX_FAIL ( -7 )

- 메모리 할당이나 데이터베이스와의 연결 실패와 같은 심각한 에러가 발생하여 더 이상 트랜잭션을 처리할 수 없을 때 반환되며 비 트랜잭션 상태로 전환된다.

예제

...

ret = tx_rollback();

if (ret < 0)

{

error processing routine

}

printf("tx rollback ok!\n");

tx_set_transaction_timeout

Page 117: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 116

typedef long TRANSACTION_TIMEOUT

int tx_set_transacion_timeout (TRANSACTION_TIMEOUT timeout)

timout 트랜잭션 타임아웃 시간 (초)

트랜잭션 시작에서 완료까지의 제한 시간을 설정한다. 이 함수는 현재 트랜잭션 상태 여부에 관계없이 호출 가능하며 트랜잭션 상태에서 호출되었다면 그 값은 다음 트랜잭션부터 영향을 준다. 기본적으로 지정되는 제한시간은 0 으로 트랜잭션의 제한 시간이 없다는 것을 의미한다.

호출이 성공하면 TX_OK, 실패하면 아래와 같은 에러 값을 반환한다

TX_EINVAL

- 지정된 제한시간이 정당하지 않다

TX_PROTOCOL_ERROR

- 서버 프로세스와 데이터베이스와의 연결이 설정되지 않은 상태에서 서버 프로세스내에서 해당 API 를 호출하는 경우 발생한다.

TX_FAIL

- 트랜잭션 관리자에 치명적인 에러가 발생하여 더 이상 처리를 수행할 수 없다.

예제

...

tx_set_transaction_timeout(20);

Page 118: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

117 Tmax C Programming Guide

tx_set_transaction_control

int tx_set_transacion_control (TRANSACTION_CONTROL control)

control 트랜잭션 모드를 설정한다. 사용 가능한 값은 다음과

같다.

TX_UNCHAINED 트랜잭션이 완료된 시점에서 다시

새로운 트랜잭션을 시작하지 않는다.(default)

TX_CHAINED 트랜잭션이 완료된 시점에서 다시

새로운 트랜잭션을 시작한다.

트랜잭션 모드를 설정한다. 이 함수는 트랜잭션을 시작한 프로세스에만 영향을 미치며 값을 변경하면 다음 트랜잭션 완료 시점부터 적용된다.

예제

...

tx_set_transaction_control(TX_CHAINED);

tx_set_commit_return

int tx_set_commit_return (COMMIT_RETURN when_return)

when_return 2PC 트랜잭션에서 커밋 명령의 리턴 시점을

결정한다.

TX_COMMIT_DECISION_LO

GGED

2PC 의 1 단계 준비과정이 모두 끝나면 커밋 명령을 내리고 바로

콘트롤을 리턴한다.

Page 119: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 118

TX_COMMIT_COMPLETED

2PC 의 1 단계 준비과정이 모두 끝나면 커밋 명령을 내리고 반환

값이 도착하면 컨트롤을 리턴한다. (default)

2PC 의 1 단계 준비작업이 모두 끝났을때 커밋 명령을 내리면 일반적인 경우 성공적으로 커밋된다. 그러나 네트웍 불량이나 기타의 이유로 커밋이 제대로 수행되지 않는 경우가 있으며 이 경우 커밋 명령은 제대로 된 에러 메세지를 받지 못하므로 상황을 알 수 없다.

예제

...

tx_set_commit_return(TX_COMMIT_DECISION_LOGGED);

tx_info

int tx_info (TXINFO *txinfo)

tpinfo 트랜잭션 상태에 대한 정보가 기록되는 구조체로 각 멤버는

다음과 같다.

XID xid

- 내부적으로 사용되며 트랜잭션 처리를 위한 정보가

들어있는 구조체이다.

COMMIT_RETURN when_return

- 2PC 트랜잭션에서 커밋 명령의 리턴 시점

TRANSACTION_CONROL transaction_control

- 트랜잭션 모드

Page 120: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

119 Tmax C Programming Guide

TRANSACTION_TIMEOUT transaction_timeout

- 트랜잭션 처리 한계시간

TRANSACTION_STATE transaction_state

- 트랜잭션 상태 여부

tx_info() 는 트랜잭션 상태정보를 TXINFO 구조체(usrinc/tx.h 참조)를 통하여 전달해준다. 호출의 반환값이 1 이면 트랜잭션 상태이고 0 이면 트랜잭션 상태가 아니다. 트랜잭션이 아닌 상태에서 호출되면 xid 는 null 이 설정된다.

예제

...

TXINFO info;

...

ret = tx_info(&info);

if (ret < 0)

{

error processing routine

3.2.3 트랜잭션 관련 에러

트랜잭션에 관련해서 발생할 수 있는 에러는 TX 와 XA 두가지 종류가 있다. TX 에러는 Tmax 시스템이 사용하는 에러 메시지로 usrinc/tx.h 에 정의되어 있고 XA 에러는 운용중인 데이터베이스에서 사용하는 에러 메시지로 해당 데이터베이스 벤더가 제공한다.

오라클의 경우 $ORACLE_HOME/rdbms/demo/xa.h 를 참조하면 된다.

3.2.3.1 TX error

리 턴 값 기 능

Page 121: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 120

TX_NOT_SUPPORTED 1 트랜잭션을 지원하지 않는 모드

TX_OK 0 정상적으로 처리됨

TX_OUTSIDE -1 로컬 트랜잭션이 실행중.

TX_ROLLBACK -2 COMMIT 을 할수 없음. ROLLBACK

TX_MIXED -3 일부 COMMIT 되고 일부 ROLLBACK 되었음

TX_HAZARD -4 정상적으로 완료하지 못하였음

TX_PROTOCOL_ERROR -5 트랜잭션이 비정상적으로 호출되었음.

TX_ERROR -6 데이터베이스 장애

TX_FAIL -7 심각한 장애가 발생

TX_EINVAL -8 잘못된 인수를 받았음

TX_COMMITTED -9 트랜잭션이 데이터베이스 독자적으로 수행됨

TX_NO_BEGIN -100 트랜잭션은 COMMIT 되었지만 새 트랜잭션은 시작할수 없음

표 11 트랜잭션 에러(TX)

Page 122: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

121 Tmax C Programming Guide

3.2.3.2 XA 에러

리 턴 값 기 능

XA_OK 0 정상처리됨

XAER_RMERR -3 OPENINFO 절에서 설정된 Resource Manager 에러

XAER_NOTA -4 부여된 XID 가 유효하지 않음

XAER_INVAL -5 잘못된 인수를 받았음

XAER_PROTO -6 부적절한 단계에서 호출되었음

XAER_RMFAIL -7 데이터베이스와 연결에 실패했음

XAER_DUPID -8 이미 부여된 XID 를 사용하였음

XAER_OUTSIDE -9 트랜잭션모드에서 벗어나 있음

표 12 트랜잭션 에러(XA)

Page 123: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 122

3.3 RQ 시스템

신뢰성 있는 서비스 수행을 위하여 RQ 를 관리하는 서비스가 존재할때 이 RQ 를 사용하는 것은 전적으로 클라이언트 프로그램이 작성되는 방법에 의해 결정된다. 클라이언트의 요청으로 저장된 RQ 의 데이터는 시스템의 장애나 오류로 인해 Tmax 시스템이 재시동 되더라도 추후에 관리자에 의해 재수행 될 수 있다.

3.3.1 RQ API

아래는 RQ 사용을 위한 가장 기본적인 API 만을 요약한 것이다. API 들에 대한 상세한 설명은 Tmax Reference Manul 과 Tmax RQ Programming Guide 를 참고하도록 한다.

함 수 이 름 기 능

tpenq() RQ 에 데이터를 저장한다.

tpdeq() RQ 에 저장된 데이터를 꺼낸다.

tpqstat() RQ 에 저장된 데이터의 갯수를 보여준다. RQ 관련 함수

tpextsvcname() RQ 에서 꺼내온 데이터의 서비스 이름을

가져온다.

표 13 RQ 관련 API

tpenq

int tpenq(char *qname, char *svc, char *data, long len, long flags)

Page 124: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

123 Tmax C Programming Guide

qname 데이터를 저장할 RQ 의 이름을 지정한다. 이 이름은 Tmax

환경파일에 등록된 이름이어야 한다.

svc

NULL 또는 Tmax 환경파일에 등록된 서비스 이름을 지정한다.

NULL 이 지정된 경우 Reply 큐에 데이터가 기록된다. 따라서 tpdeq() 로 해당 데이터를 얻어 온 후 처리해야

한다. 서비스 이름이 지정된 경우 Request 큐에 데이터가 기록된 후 해당 서비스가 처리된다. svc 로 명명된 서비스가 없거나 서비스가 실패한 경우 또는 서비스를 수행하고 처리

결과를 받지 않은 상태에서 시스템 장애가 발생할 경우에 이 데이터는 내부적으로 Fail 큐에 저장된다

data 서비스를 호출 할 때 전달되어야 하는 데이터를 지정한다. NULL 로 들어가는 경우를 제외하면 반드시 tpalloc() 으로

할당된 버퍼에 대한 포인터이어야 한다.

len data 의 길이를 지정한다.

flags TPRQS, TPNOREPLY, TPFUNC, TPNOFLAGS 가 지정될 수

있다. 자세한 사항은 아래와 같다.

TPRQS

tpenq()의 첫번째 인자를 서비스 이름으로 호출하는 경우 TPRQS 인자가 지정된다면

Request 큐에 기록되고 해당 서비스가 호출되어 수행 된 후 Reply 큐에 결과값이 기록된다. tpenq()의 첫번째 인자를 NULL 로

호출하는 경우는 Reply 큐에 데이터가 기록된다.

Page 125: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 124

TPNOREPLY

tpenq()의 첫번째 인자가 NULL 이 아닌 서비스 이름으로 지정된 경우 해당 서비스를

수행 한 후 그 결과를 Reply 큐에 저장하지 않는다.

TPFUNC tpenq()의 첫번째 인자를 서비스 이름으로

호출하는 경우 Reply 큐에 데이터가 기록되고 서비스를 호출하지 않는다.

TPNOFLAGS

tpenq()의 첫번째 인자가 NULL이 아닌 서비스

이름으로 지정된 경우 해당 서비스를 수행 한 후

서버가 리턴한 (TPSVCSUCCESS 나

TPSVCFAIL에 관계없이) 결과는 클라이언트의

버퍼에 저장된다. 이 값을 받아오기 위해서는

tpdeq()시에도 플래그를 TPNOFLAGS로 주어야

한다. 서버가 결과값을 리턴하기 전에 에러가

발생하면 데이터는 Fail 큐에 저장되며 이값은

tpdeq()시에 TPRQS플래그로 받아와야 한다..

서비스 요청 데이터를 RQ 에 저장하는 함수이다. tpenq() 의 두번째 인자를 지정하면 데이터는 Request 큐에 저장되며, 두번째 인자를 NULL 을 지정하면 데이터는 Reply 큐에 저장된다. Fail 큐에는 tpenq()를 사용하여 인위적으로 데이터를 저장할 수 없다.

또한 tpenq() 로 저장된 데이터들은 도착 순서에 따라 링크드 리스트로 관리되며 데이터를 읽을때는 들어온 순서대로 처리 된다(FIFO). 현재 Tmax 버전은 LIFO 나 우선순위 처리를 지원하지 않는다.

예제

...

ret = tpenq(“rq1”, “TOUPPER”, ibuf, strlen(ibuf), TPRQS);

if (cd == -1)

{

Page 126: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

125 Tmax C Programming Guide

error processing routine

}

Page 127: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 126

tpdeq

int tpdeq(char *qname, char *svc, char **data, long *len, long flags)

qname 데이터를 수신할 RQ 의 이름을 지정한다. 이 이름은 Tmax

환경파일에 등록된 이름이어야 한다.

svc

tpenq()시에 두번째 인자로 지정된 값을 설정한다. tpenq()의두번째 인자가 서비스 명인 경우 Reply 큐에서 같은

서비스 명을 가진 데이터들을 순차적으로 수신한다. 만약 tpenq()의 두번째 인자가 NULL 이었다면 Reply 큐에서

서비스 명이 NULL 인 데이터들을 순차적으로 수신한다.

또한 이 값을 _rq_sub_queue_name[TMAX_FAIL_QUEUE]으로 지정하면

Fail 큐에 있는 데이터를 수신할 수 있다.

data RQ 에 저장된 데이터를 받아 올 버퍼를 지정한다. 반드시

tpalloc()으로 할당된 버퍼에 대한 포인터이어야 한다.

len tpdeq()가 성공적으로 수신한 데이터의 길이이다. tpdeq()는 필요하다면 응답 내용이 지정된 버퍼에 수신될 수 있도록

버퍼 크기를 증가시킨다.

flags TPRQS, TPFUNC, TPNOFLAGS 가 지정될 수 있다. 자세한

사항은 아래와 같다.

TPRQS Reply 큐에서 데이터를 수신하고자 할 때

지정된다.

Page 128: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

127 Tmax C Programming Guide

TPFUNC tpenq()시 TPFUNC 로 플래그를 지정한 경우

Reqly 큐에 저장된 데이터를 수신하고자 할 때 TPRQS 와 함께 지정된다.

TPNOFL

AGS

tpenq()시에 svc 에 서비스 이름을 지정하고 flags 값을 TPNOFLAGS 로 지정한 경우 그

결과값을 클라이언트의 버퍼에 송신하게 된다. 이런 경우 tpdeq()시에도 그 결과값을 수신하기 위해서는 flags 값을 TPNOFLAGS 로 지정해야

한다.

RQ 에 저장된 데이터를 읽을때 사용하는 함수이다. tpdeq()를 읽어온 데이터는 RQ 에서 제거되기 때문에 한번 수신한 데이터를 다시 읽을수는 없다. tpenq() 에서 설명한 대로 먼저 저장된 데이터 부터 순서대로 읽어온다.

...

ret = tpdeq(“rq1”, “TOUPPER”, &obuf, &(strlen(obuf)), TPRQS);

if (ret < 0)

{

error processing routine

}

Ex 2)

...

/*_fail 큐에 저장되어 있는 값을 가져옴*/

ret = tpdeq("rqtest", "+fail", &rcvbuf, &rlen, TPRQS);

if (ret < 0)

{

error processing routine

}

Page 129: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 128

tpqstat

int tpqstat(char *qname, long flags)

qname 통계값을 수신 할 RQ 의 이름을 지정한다. 이 이름은 Tmax

환경파일에 등록된 이름이어야 한다.

flags 이 flags 에 지정된 값을 통해 Request, Reply, Fail 큐의 세부분의

통계값을 수신할 수 있다. 값은 다음과 같다.

0(TMAX_ANY_QUEUE) Request, Reply, Fail 큐의 통계를 낸다.

1(TMAX_FAIL_QUEUE) Fail 큐의 통계를 낸다.

2(TMAX_REQ_QUEUE) Request 큐의 통계를 낸다.

3(TMAX_RPLY_QUEUE) Reply 큐의 통계를 낸다.

현재 큐에 저장된 데이터의 통계 값을 반환하는 함수이다. 즉, 현재 RQ 에 적체되어있는 데이터의 통계를 구한다.

...

if (tpqstat(“rq1”, TMAX_FAIL_QUEUE) < 0)

{

error processing routine

}

Page 130: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

129 Tmax C Programming Guide

tpextsvcname

int tpextsvcname(char *data, char *svc)

data tpdeq()로 RQ 로부터 읽은 데이터가 저장되어 있는 포인터로 tpalloc()으로 할당된 주소값을 사용한다.

svc 알아오고자 하는 서비스 명이 수신될 버퍼이다.

tpdeq()로 RQ 에서 데이터를 읽은 경우, 해당 데이터의 서비스명을 알고자 할 때 사용하는 함수이다. 이 함수는 보통 Fail 큐에 저장되어 있는 데이터를 tpdeq()로 읽은 경우에 사용한다.

예제

char svc[16];

...

if (tpdeq("rqtest", "+fail", &rcvbuf, &rlen, TPRQS)<0)

{

error processing routine

}

if (tpextsvcname(rcvbuf, svc) < 0 )

{

error processing routine

}

tpacall(svc, rcvbuf, rlen, TPNOFLAGS);

...

Page 131: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 130

3.4 RDP(Realtime Data Processor)

RDP 는 지속적으로 변하는 데이터를 클라이언트에게 효율적이고 빠르게 전달하는 상황에 효과적으로 대처하기 위하여 UCS 타입의 프로세스를 커널 수준에서 수정한 서버 프로세스 방식이다. 데이터를 전달하는데 있어서 Tmax 시스템 내부적인 부하가 걸리는 CLH 를 거치지 않고 서버 프로세스 자체에서 바로 클라이언트로 보내므로 위와 같은 특별한 상황의 시스템 운영에 있어 일반 UCS 프로그램에 비해 프로세스 점유율이나 처리 속도의 측면에서 월등한 성능을 보인다.

하나의 노드에는 한 종류의 RDP 타입 서버 프로그램만을 사용할 수 있으며 해당 노드의 모든 서비스 수행 결과는 이 서버 프로세스들을 통해 클라이언트로 전달된다.

RDP 방식은 클라이언트에게 비요청 메시지를 보내는 경우 제한 사항이 존재한다. 자세한 내용은 “II. 2.2 TCS 방식 서버 프로그램 기본 API” 를 참조하도록 한다.

RDP 프로그램의 구조는 일반 UCS 프로그램과 동일하며 다만 환경 파일 설정과 컴파일시의 링크 라이브러리만 다르다. 환경 파일 설정에 대한 자세한 설명은 Tmax Administration Guide 을 참조하도록 한다.

3.4.1 RDP 방식 서버 프로그램 환경설정

CLH 프로세스 수보다 RDP 프로세스의 수가 같거나 많아야 한다. CLH 프로세스 수는 MIN 과 MAX 값이 같도록 설정해야 한다.

노드절에 REALSVR=<svrname> 을 지정하고 필요에 따라 RSCPC 값을 설정한다. RSCPC 는 RDP 프로세스와 여타 다른 서버 프로세스와의 통신 채널수이다. <svrname>은 RDP 타입의 서버 프로세스의 이름이다.

서버절의 해당 RDP 서버 프로세스는 SVRTYPE=REALSVR 라고 설정한다.

RDP 를 사용하는 환경 파일의 예

*DOMAIN

tmax1 SHMKEY =70990, MINCLH=2, MAXCLH=2

*NODE

Page 132: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

131 Tmax C Programming Guide

tmaxi1 TMAXDIR = "/home/navis/tmax",

APPDIR = "/home/navis/tmax/appbin",

PATHDIR = "/home/navis/tmax/path",

REALSVR = “real", RSCPC = 2

*SVRGROUP

svg1 NODENAME = "tmaxi1"

svg2 NODENAME = "tmaxi1"

*SERVER

deal SVGNAME = svg2, MIN=1

real SVGNAME = svg1, MIN=2, MAX=4, SVRTYPE = REALSVR,

*SERVICE

IN SVRNAME = deal

OUT SVRNAME = deal

WORK SVRNAME = real

3.4.2 RDP 방식 서버 프로그램 컴파일

RDP 방식 서버 프로그램의 컴파일은 일반 TCS 방식이나 UCS 방식 서버 프로그램과 크게 다르지 않다. 준비 사항과 컴파일 순서는 완전히 동일하며 다만 서버 라이브러리를 libsvrrs.a (혹은 libsvrrs.so) 를 사용하면 된다.

3.4.2.1 서버 프로그램 컴파일 순서

아래는 일반적인 C 컴파일러를 이용한 컴파일 방법이다. 이 과정은 적당한 쉘 프로그램을 사용 만들어 사용하거나 mksvr 유틸리티를 이용하면 간단하게 처리 할 수 있다. 아래의 예는 리눅스에서의 실행 결과이며 개발 환경(32/64 비트)과 플랫폼에 따라 사용되는 플래그 및 라이브러리가 조금씩 다르다. 사용 라이브러리를 제외하고는 TCS 방식과 완전히 동일하므로 자세한 내용은 “TCS 방식 서버 프로그램 컴파일” 을 참조하도록 한다.

서버 프로그램을 컴파일하여 오브젝트 파일을 생성한다. 서버 프로그램은 Tmax 에서 제공하는 헤더 파일들을 참조해야 하며 필요에 따라 구조체 파일이나 필드버퍼 헤더파일도 참조되어야 한다.

$cc -c -I/home/tmax/usrinc app.c -> app.o

Page 133: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 132

구조체 통신인 경우 구조체 파일을 컴파일한다. 이 단계는 sdlc 을 이용하여 구조체-표준버퍼 변환/역변환 프로그램을 생성하는 단계와 생성한 프로그램을 다시 오브젝트 파일로 컴파일 하는 2 단계로 이루어진다.

$sdlc -i demo.s -> demo_sdl.c

$cc -c -I/home/tmax/usrinc demo_sdl.c -> demo_sdl.o

구조체 파일을 사용하지 않는다면 이 과정을 수행할 필요 없이 TMAXDIR/lib 디렉토리 내의 sdl.o 를 사용하여 같이 컴파일 하도록 한다.

시스템 관리자가 제공해준 서비스 테이블을 컴파일하여 오브젝트 파일 형태를 생성한다.

$cc -c app_svctab.c -> app_svctab.o

만들어진 오브젝트 파일들과 Tmax 시스템에서 제공하는 서버 라이브러리를 함께 링크하여 서버 실행 프로그램을 생성한다.

$cc -o app app.o demo_sdl.o app_svctab.o libsvrrs.a libnodb.a

$cc -o app app.o sdl.o app_svctab.o libsvrrs.a libnodb.a

쉘 프로그램을 사용하는 경우 해당 메이크 파일의 –lsvr 을 –lsvrrs 로 바꾼다. 사용법은 동일하다

3.4.2.2 mksvr 유틸리티를 이용한 컴파일

mksvr 유틸리티를 사용하는 경우 Tmax 시스템 환경파일을 작성할 때 미리 서비스 이름을 써 줄 필요가 없으며 서비스 테이블 생성(gst)과정도 필요로 하지 않는다. 그러나 구조체를 사용하는 경우 구조체=표준버퍼 변환/역변환 프로그램은 미리 생성되어 있어야 하며 DB 를 사용할 경우 미리 프리컴파일 과정이 끝난 파일을 사용하거나 RM 파일을 지정해야 한다. 자세한 mksvr 의 이용 방법은 Tmax Reference Manual 을 참고한다.

$cfl –i sample.m

$sdlc –i demo.s

$sdlc –c –i demo.s –o tmax.sdl

$mksvr –s RDPSAMPLE –o rdp_svr –f rdp_svr.c –S ../sdl/demo_sdl.c –t REALSVR

Page 134: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

133 Tmax C Programming Guide

3.5 브로드 캐스트 / 멀티 캐스트

Tmax 는 다양한 방법으로 클라이언트에게 데이터를 전달할 수 있다. 관리나 기타 개발상의 목적으로 다수의 클라이언트에게 데이터를 보내야 하는 경우가 있을 경우 모든 클라이언트의 아이디를 관리하여 각각 메시지를 보내는 것도 한 방법이겠지만 시스템의 동시 사용자가 많은 경우 그리 효율적인 방법이 되지 않는다.

다수의 클라이언트를 몇개의 그룹으로 구분할 수 있다면 하나의 API 를 이용하여 해당되는 모든 클라이언트에게 메시지를 보내는 것이 가능해지게 된다. Tmax 는 클라이언트의 접속 정보를 활용하거나 이벤트를 이용하는 방법으로 이러한 브로드 캐스트 및 멀티 캐스트를 구현하고 있다.

두 방식 모두 일반적인 의미의 브로드 캐스트 및 멀티 캐스트가 모두 가능하지만 구분의 편의상 전자를 브로드 캐스트 API, 후자를 멀티 캐스트 API 라 부르겠다.

3.5.1 클라이언트 정보를 활용하는 API

tpbroadcast

int tpbroadcast (char *lmid, char *usrname, char *cltname, char *data, long *len, long falgs)

lmid

메시지를 받을 대상이 되는 노드 이름. 해당 노드에 접속된 모든 클라이언트에게 메시지를 보낸다. ‘*’로

설정하면 모든 노드의 클라이언트에게 메시지를 보낸다. 이외의 와일드카드 문자 사용은 허용되지 않는다

usrname

메시지를 받을 대상이 되는 사용자 이름으로 tpstart() 시 tpinfo 구조체를 통해 전달되는 값이다. ‘?’, ‘*’ 와 같은

와일드카드 문자를 사용할 수 있다.

cltname

메시지를 받을 클라이언트 그룹으로 tpstart() 시 전달되는 값이다. ‘?’, ‘*’ 와 같은 와일드카드 문자를 사용할 수

있다.

Page 135: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 134

data 보내고자 하는 데이터 버퍼이다. tpalloc() 으로 할당된

버퍼이어야 하며 보낼 데이터가 없을 경우는 NULL 값을 설정하여도 된다.

len 보내고자 하는 데이터의 길이이다. CARRAY, X_OCTET, 구조체 배열 타입일 경우에는 반드시 명시해야 한다.

flags TPNOBLOCK, TPNOTIME, TPSIGRSTRT, TPNOFLAGS 가

사용되며 내용은 다음과 같다.

TPNOBLOCK

송신 버퍼나 클라이언트 측의 수신버퍼가 꽉 차서 메시지가 블록되는 경우 에러를 발생한다.

(TPEBLOCK)

TPNOTI

ME 메시지 블록 상황에서 타임아웃 시간을

무시한다.

TPSIGRSTRT

호출 도중에 시그널이 발생하여 시스템 함수 호출이 중지되었을때 시스템 함수 호출을 다시

시도한다.

TPNOFLAGS

일반적으로 사용되는 플래그이다.

이 함수는 클라이언트와 서버가 다른 클라이언트에게로 비요청 메시지를 보내고자 할 때 사용한다. 이 때 비요청 메시지를 받을 클라이언트는 Tmax 에 접속되어 있어야 하며, tpstart()에서 비요청 메시지를 받겠다는 플래그로 접속되어 있어야만 한다. 이 API 는 클라이언트와 서버 모두 사용할 수 있다.

Page 136: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

135 Tmax C Programming Guide

< Ex >

...

ret = tpbroadcast(NULL, "user", “cli1”, (char *)msg->data, 0, 0);

if (ret < 0)

{

error processing routine

}

...

3.6 이벤트를 활용하는 API

Tmax 는 이벤트를 통해 다수의 클라이언트 뿐만 아니라 서비스 루틴에도 메시지를 보낼수 있다. 모든 클라이언트와 서비스 루틴은 개발자 임의로 이벤트에 가입하거나 취소할 수 있고 이벤트를 발생시킬 수 있다. 또한 하나의 이벤트에 중복 가입하거나 동시에 여러가지 이벤트에 가입할 수도 있다.

발생된 이벤트에 의한 이벤트 데이터 전송과 그에 따른 결과는 트랜잭션의 범주에 들지 않으므로 주의하도록 한다.

tpsubscribe

int tpsubscribe(char *eventname, char *filter, TPEVCTL *ctl, long flags)

eventname eventname 은 가입 하고자 하는 이벤트의 이름으로

NULL 로 끝나는 15 자 이내의 문자열이다. 현재 와일드

카드 문자는 지원되지 않는다.

filter 현재 사용되지 않으며 NULL 로 지정한다.

ctl 메시지 처리 방법에 대한 구조체로 클라이언트의 경우 NULL 을 지정하도록 한다. 서버의 경우는 아래에 다시

Page 137: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 136

설명한다.

flags 현재 의미있는 플래그는 존재하지 않는다. TPNOFLAGS

로 설정하도록 한다.

지정한 이벤트에 가입한다. 클라이언트 프로그램에서 사용되는 경우 이벤트가 발생하면 앞서 설명한 tpsetunsol() 이나 tpgetunsol() 을 이용하여 이벤트 데이터를 수신할 수 있다. 서버 프로그램 측에서 사용되는 경우는 ctl 구조체에 지정된 방식으로 전달된다. ctl 구조체의 내용은 다음과 같다.

TPEVCTL

long ctlflags 현재 사용되지 않으며 0 으로 지정한다.

long post_flags 현재 사용되지 않으며 0 으로 지정한다.

char svc[XATMI_SERVICE_NAME_LENGTH]XATMI_SERVICE_NAM

E_LENGTH=16

해당 이벤트 데이터를 받을 서비스 이름을 지정한다.

char qname[RQ_NAME_LENGTH] RQ_NAME_LENGTH=16

해당 이벤트 데이터를 받을 RQ 이름을 지정한다.

svc 와 qname 은 하나만 지정하여 사용한다. 서비스 이름을 지정한 경우 메시지는 지정된 서비스에 tpacall(svc, data, len, TPNOREPLY) 의 형식으로 전달된다. RQ 이름을 지정한 경우는 tpenq(qname, NULL, data, len,

Page 138: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

137 Tmax C Programming Guide

TPNOFLAGS) 의 형식으로 저장된다. 자세한 내용은 Tmax RQ Programming Guide 를 참조한다.

tpsubscribe() 는 해당 이벤트의 핸들러를 리턴하며 이 핸들러는 이벤트 가입을 취소하고자 할때 사용한다. 이벤트의 발생은 클라이언트와 서버 어느쪽에서든 일어날 수 있으며 하나의 이벤트에 여러번 가입할 수도, 여러가지 이벤트에 중복 가입할 수도 있다.

< Ex >

long sd=-1;

long Tpsubscribe(void);

main() {

.....

}

long Tpsubscribe()

{

sd=tpsubscribe(sub, NULL, NULL, TPNOFLAGS);

if (sd<0) {

printf("err in sub ..%s\n", tpstrerror(tperrno));

printf("sd : %d\tflag : %d", sd, flag);

Uunix_err("sub");

tpend();

exit(1);

}

flag=1;

return 0;

}

Page 139: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 138

tpunsubscribe

int tpunsubscribe(long sd, long flags)

sd tpsubscribe() 에서 얻어진 이벤트 핸들러이다.

flags 현재 의미있는 플래그는 존재하지 않는다. TPNOFLAGS 로

설정하도록 한다.

이벤트 가입을 취소한다. 더이상 이벤트 메시지를 수신하지 않는다.

< Ex >

long sd=-1;

long Tpunsubscribe(void);

long Tpunsubscribe()

{

int ret;

ret=tpunsubscribe(sd, TPNOFLAGS);

if (ret<0) {

printf("err unsub ..%s\n", tpstrerror(tperrno));

printf("sd : %d\tflag : %d", sd, flag);

Uunix_err("unsub");

tpend();

exit(1);

}

flag=0;

sd=-1;

return 0;

}

tppost

int tppost(char *eventname, char *data, long len, long flags)

Page 140: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

139 Tmax C Programming Guide

eventname eventname 은 가입 하고자 하는 이벤트의 이름으로

NULL 로 끝나는 15 자 이내의 문자열이다. 현재 와일드 카드 문자는 지원되지 않는다.

data 보내고자 하는 데이터 버퍼이다. tpalloc() 으로 할당된 버퍼이어야 하며 보낼 데이터가 없을 경우는 NULL

값을 설정하여도 된다.

len 보내고자 하는 데이터의 길이이다. CARRAY, X_OCTET, 구조체 배열 타입일 경우에는 반드시 명시해야 한다.

flags 현재 의미있는 플래그는 존재하지 않는다. TPNOFLAGS

로 설정하도록 한다.

이벤트를 발생시킨다. 해당 이벤트에 참가하고 있는 모든 클라이언트 프로그램에는 비요청 데이터가 보내지고 참가하고 있는 서버 프로그램은 가입시 설정한 대로 서비스가 수행되거나 RQ 에 데이터가 저장된다. 이벤트에 의해 서비스가 수행되는 경우 트랜잭션의 범주에 들지 않는다.

< Ex >

strcpy(sndbuf, "data");

ret=tppost(sub, sndbuf, 0, TPNOFLAGS);

if (ret<0) printf("tppost failed.. %s\n", tpstrerror(tperrno));

3.7 Windows 환경 프로그래밍

개발된 서비스가 일반 사용자를 위한 것일 경우 클라이언트 프로그램은 주로 개인 PC 에 많이 사용되는 윈도우즈 환경을 기반으로 하여 개발된다. Tmax 는 이를 위해 다양한 개발툴을 위한 인터페이스를 제공한다. Tmax 가 지원하는 개발툴은 다음과 같으며 자세한 사용법은 Tmax 4GL Programming Guide 를 참조하도록 한다.

Page 141: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 140

파워빌더

델파이

VC++

BC++

VB

VB .Net

C# .Net

또한 개발자의 편의를 위해 다양한 종류의 라이브러리를 제공한다. 라이브러리에 따라 API 가 추가되었거나 대체되는 API 가 있을 수 있다.

tmax.lib (dll) : VC++, 델파이, C# 에 사용된다 (cdecl)

tmax4gl. lib (dll) : BC++, 파워빌더, VB, VB.Net 에 사용된다 (stdcall)

tmaxmt. lib (dll) : 멀티 쓰레드 형태를 지원하기 위한 라이브러리 (cdecl)

Wintmax. lib (dll) : 멀티 윈도우를 지원하기 위한 라이브러리 (cdecl)

tmaxce.lib (dll):윈도우 ce 를 위한 라이브러리 (cdecl)

3.7.1 tmaxmt.dll

윈도우 프로그래밍 환경에서 사용되는 Message-Driven 방식의 서비스 요청을 위해 두가지 API 를 추가하였다.

WinTmaxAcall()

WinTmaxAcall2()

두 API 는 거의 동일하며 지정한 윈도우로 메시지를 넘기느냐 지정한 콜백 펑션으로 넘기느냐 하는 차이가 있을 뿐이다. API 를 수행할 때마다 쓰레드를 하나씩 생성하여 메시지를 처리한다.

헤더 파일은 tmaxpi.h 를 사용한다.

Page 142: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

141 Tmax C Programming Guide

WinTmaxAcall

int WinTmaxAcall (TPSTART_T *sinfo, HANDLE wHandle, unsigned int msgType, char *svc, char *sndbuf, int len, int flags);

tpinfo Tmax 시스템에 클라이언트의 정보를 넘길 필요가 있을 경우 사용하는 구조체로 tpstart() 의 인수와 동일하다.

wHandle 메시지를 받을 윈도우의 핸들러를 지정한다.

msgtype 도착 메시지를 지정한다. 일반적으로 WM_USER 를 개발자

임의로 define 하여 사용한다.

svc Tmax 환경파일에 등록된 서비스 이름을 지정한다.

sndbuf 서비스를 호출 할 때 전달되는 데이터로 NULL 이 아닌 경우는 반드시 tpalloc() 으로 할당된 버퍼를 사용하여야

한다.

len 보내는 데이터의 길이를 지정한다. CARRAY, X_OCTET, 구조체 배열 타입 일 경우에는 반드시 설정해야 한다.

flags tpacall() 의 플래그를 그대로 사용한다. 자세한 내용은

다음과 같다.

TPNOTRAN 호출 시점이 트랜잭션 영역일 경우 호출로 인한 결과를 트랜잭션 범주에서 제외한다.

Page 143: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 142

TPNOREPLY

이 플래그는 서비스 요청에 대한 응답을 받지 않겠다는 것으로 호출이 성공적으로

완료되면 구별자로 0 을 반환한다. WinTmaxAcall () 의 호출이 트랜잭션

영역에서 일어난 경우는 응답을 반드시 받아야 하므로 TPNOREPLY 플래그를 사용할 수 없다. 꼭 사용하기 위해서는 TPNOTRAN 플래그와 함께 설정하여 트랜잭션 영역에서 제외해야 한다.

TPBLOCK 타임 아웃 시간 내에서 WinTmaxAcall () 에

대한 응답이 올때까지 블록 상태로 기다린다.

TPNOTIME

클라이언트 측에 설정된 블록 타입아웃 시간을 무시하고 결과값을 받을때까지 기다린다. 그러나 트랜잭션 영역에서

호출했다면 트랜잭션 타임아웃 시간은 그대로 적용된다.

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때 사용한다. 개발자가 시그널을 사용할 경우 시스템 함수 호출 도중에 시그널이

발생하면 시스템 함수 호출은 중단되고 해당

API 는 TPGOTSIG 에러를 리턴하지만 TPSIGRSTRT 플래그를 설정할 경우 중단된

시스템 함수 호출은 재실행된다.

TPNOFLAGS 일반적으로 사용되는 플래그이다.

WinTmaxAcall() 은 Tmax 시스템에 접속하여 서비스를 요청하고 결과를 받아 다시 원하는 윈도우의 윈도우 프로시저로 넘긴후 연결을 종료한다.

Page 144: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

143 Tmax C Programming Guide

사용자는 이 메시지를 처리하는 루틴을 만들고 윈도우 프로시저에 등록하면 된다.

< ex >

#define WM_TMAX_RECV WM_USER + 1

....

BEGIN_MESSAGE_MAP(CTmaxmt_callbackDlg, CDialog)

//{{AFX_MSG_MAP(CTmaxmt_callbackDlg)

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_MESSAGE(WM_TMAX_RECV, OnTmaxReceive)

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

ON_BN_CLICKED(IDC_BUTTON2, OnButton2)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

void CTmaxmtDlg::OnButton1()

{

....

buf = tpalloc("STRING", NULL, 0);

if (buf == NULL){

sprintf(msg, "buf tpalloc fail...[%d][%s]\n", tperrno,

tpstrerror(tperrno));

AfxMessageBox(msg);

}

lstrcpy((LPTSTR)buf, (LPCTSTR)m_szEdit1);

ret=WinTmaxAcall((TPSTART_T *)NULL, m_hWnd, WM_TMAX_RECV,

"TOUPPER", buf, 0, TPNOFLAGS);

if (ret<0) {

sprintf(msg, "wintmaxacall... [%s]\n", tpstrerror(tperrno));

AfxMessageBox(msg);

free(buf);

tpend();

}

....

}

LRESULT CTmaxmt_callbackDlg::OnTmaxReceive(WPARAM wp, LPARAM lp)

Page 145: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 144

{

CString temp;

sprintf(msg, "%s", ((TPSVCINFO *)wp)->data);

.....

SetDlgItemText(IDC_EDIT2, msg);

return 0;

}

Page 146: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

145 Tmax C Programming Guide

WinTmaxAcall2

int WinTmaxAcall2 (TPSTART_T *sinfo, WinTmaxCallback fn, char *svc, char *sndbuf, int len, int flags);

tpinfo Tmax 시스템에 클라이언트의 정보를 넘길 필요가 있을 경우 사용하는 구조체로 tpstart() 의 인수와 동일하다.

fn 서비스 요청에 대한 응답을 받을 콜백 펑션을 지정한다.

svc Tmax 환경파일에 등록된 서비스 이름을 지정한다.

sndbuf 서비스를 호출 할 때 전달되는 데이터로 NULL 이 아닌 경우는 반드시 tpalloc() 으로 할당된 버퍼를 사용하여야

한다.

len 보내는 데이터의 길이를 지정한다. CARRAY, X_OCTET, 구조체 배열 타입 일 경우에는 반드시 설정해야 한다.

flags tpacall() 의 플래그를 그대로 사용한다. 자세한 내용은

다음과 같다.

TPNOTRAN 호출 시점이 트랜잭션 영역일 경우 호출로 인한 결과를 트랜잭션 범주에서 제외한다.

TPNOREPLY이 플래그는 서비스 요청에 대한 응답을 받지 않겠다는 것으로 호출이 성공적으로

완료되면 구별자로 0 을 반환한다.

Page 147: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 146

WinTmaxAcall2 () 의 호출이 트랜잭션 영역에서 일어난 경우는 응답을 반드시

받아야 하므로 TPNOREPLY 플래그를 사용할

수 없다. 꼭 사용하기 위해서는 TPNOTRAN 플래그와 함께 설정하여 트랜잭션 영역에서

제외해야 한다.

TPBLOCK 타임 아웃 시간 내에서 tpacall() 에 대한 응답이 올때까지 블록 상태로 기다린다.

TPNOTIME

클라이언트 측에 설정된 블록 타입아웃 시간을 무시하고 결과값을 받을때까지 기다린다. 그러나 트랜잭션 영역에서

호출했다면 트랜잭션 타임아웃 시간은 그대로 적용된다.

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때 사용한다. 개발자가 시그널을 사용할 경우 시스템 함수 호출 도중에 시그널이

발생하면 시스템 함수 호출은 중단되고 해당 API 는 TPGOTSIG 에러를 리턴하지만

TPSIGRSTRT 플래그를 설정할 경우 중단된 시스템 함수 호출은 재실행된다.

TPNOFLAGS 일반적으로 사용되는 플래그이다.

WinTmaxAcall() 은 Tmax 시스템에 접속하여 서비스를 요청하며 응답은 지정한 콜백 펑션으로 넘어간다.

< Ex >

int Callbackfn(WPARAM wp, LPARAM lp);

Page 148: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

147 Tmax C Programming Guide

....

void CTmaxmtDlg::OnButton2()

{

....

buf = tpalloc("STRING", NULL, 0);

if (buf == NULL){

sprintf(msg, "buf tpalloc fail...[%d][%s]\n", tperrno,

tpstrerror(tperrno));

AfxMessageBox(msg);

}

lstrcpy((LPTSTR)buf, (LPCTSTR)m_szEdit2);

ret=WinTmaxAcall2((TPSTART_T *)NULL, Callbackfn, "TOUPPER",

buf, 0, TPNOFLAGS);

if (ret<0) {

sprintf(msg, "wintmaxacall... [%s]\n",

tpstrerror(tperrno));

AfxMessageBox(msg);

free(buf);

tpend();

}

....

}

int Callbackfn(WPARAM wp, LPARAM lp)

{

CString temp;

TPSVCINFO *get = (TPSVCINFO *)wp;

if (lp < 0){

.....

}

.....

AfxMessageBox(get->data);

return 0;

Page 149: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 148

}

3.7.2 WinTmax.dll

윈도우 프로그래밍 환경에서 사용되는 Message-Driven 방식의 서비스 요청을 위한 API 를 추가하였다. 독립적인 쓰레드를 이용하여 메시지를 처리하므로 tpstart() 나 tpend() 대신 WinTmaxStart(), WinTmaxEnd() 를 사용한다.

WinTmaxStart()

WinTmaxEnd()

WinTmaxSetContext ()

WinTmaxSend ()

tmaxmt.dll 과 유사한 방식으로 동작하지만 Tmax 시스템에 자동으로 접속/해제 작업을 하지 않으며 API 당 하나씩 쓰레드를 생성하는 대신 하나의 쓰레드로 모든 메시지를 처리한다. 에러 메시지와 비요청 메시지를 처리하기 위해 따로 윈도우를 지정하지 않으면 메시지는 무시된다.

디버그 및 관리의 목적으로 MAX_DEBUG 환경 변수에 지정된 파일에 로그를 남길 수 있다.

헤더 파일은 WinTmax.h 를 사용한다.

WinTmaxStart

int WinTmaxStart (TPSTART_T *tpinfo)

tpinfo Tmax 시스템에 클라이언트의 정보를 넘길 필요가 있을 경우 사용하는 구조체로 tpalloc() 으로 할당하여 사용해야 한다. 그럴 필요가 없을 경우는 NULL 값을 넣어도 무방하다.

메시지를 처리하는 쓰레드를 만들고 사용 메모리를 초기화 하는 외에 기능상 tpstart() 와 같으며 사용 인수도 동일하다. tpstart() 의 내용을 참조하도록 한다.

WinTmaxEnd

Page 150: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

149 Tmax C Programming Guide

int WinTmaxEnd (void)

인수없음

메시지를 처리하는 쓰레드를 종료하고 사용 메모리를 해제하는 외에 기능상 tpend() 와 같으므로 tpend() 의 내용을 참조하도록 한다.

< Ex >

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

error process routine..

return FALSE;

}

.....

WinTmaxEnd();

WinTmaxSetContext

int WinTmaxSetContext (HANDLE winhandle, unsigned int msgtype, int slot)

winhandle 메시지를 받은 윈도우의 핸들러이다.

msgtype 해당 윈도우에서 처리하기 위한 메시지 번호를

지정한다.

slot

메시지 전달 정보가 기록될 슬롯 번호를 지정한다. 사용 범위는 0~255 이다. –1 일 경우 2~255 중에서 사용하지 않는 슬롯을 임의로 설정하며 이미 설정된 슬롯 번호를

사용자가 지정하는 경우 이전의 내용은 무시된다.

Tmax 시스템에서 도착한 데이터를 보낼 윈도우와 메시지 번호를 지정한다. 비요청 메시지의 경우 0 번 슬롯에 지정된 윈도우로 보내지고 에러메시지는 1 번 슬롯에 지정된 윈도우로 보내진다. 해당 슬롯에 값이

Page 151: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 150

설정되지 않았을 경우 데이터는 버려진다. 리턴값은 설정된 슬롯 번호이며 WinTmaxSend() API 에 인수로 사용된다.

< Ex >

#define WM_TMAX_RECV_STD WM_USER+1

#define WM_TMAX_RECV_STD WM_USER+2

.....

int context;

WinTmaxSetContext(m_hWnd, WM_TMAX_RECV_STD, 0);

WinTmaxSetContext(m_hWnd, WM_TMAX_RECV_ERR, 1);

context=WinTmaxSetContext(m_hWnd, WM_TMAX_RECV_ERR, -1);

.....

Page 152: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

151 Tmax C Programming Guide

WinTmaxSend

int WinTmaxSend (int recvContext,char *svc, char *data, long len, long flags)

recvContext 결과 데이터를 저리할 윈도우의 슬롯 번호이다.

WinTmaxSetContext() API 로 지정된 번호 이어야 한다.

svc Tmax 환경파일에 등록된 서비스 이름을 지정한다.

data 서비스를 호출 할 때 전달되는 데이터로 NULL 이 아닌 경우는 반드시 tpalloc() 으로 할당된 버퍼를 사용하여야

한다.

len 보내는 데이터의 길이를 지정한다. CARRAY, X_OCTET, 구조체 배열 타입 일 경우에는 반드시 설정해야 한다.

flags TPNOTRAN, TPNOREPLY, TPNOTIME, TPBLOCK,

TPSIGRSTRT, TPNOFLAGS 가 지정될 수 있다. 자세한 사항은 아래와 같다.

TPNOTRAN 호출 시점이 트랜잭션 영역일 경우 호출로 인한 결과를 트랜잭션 범주에서 제외한다.

TPNOREPLY

이 플래그는 서비스 요청에 대한 응답을 받지 않겠다는 것으로 호출이 성공적으로

완료되면 구별자로 0 을 반환한다. WinTmaxSend () 의 호출이 트랜잭션

영역에서 일어난 경우는 응답을 반드시 받아야 하므로 TPNOREPLY 플래그를 사용할 수 없다. 꼭 사용하기 위해서는

Page 153: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 152

TPNOTRAN 플래그와 함께 설정하여 트랜잭션 영역에서 제외해야 한다.

TPNOTIME

클라이언트 혹은 서버측이 설정한 블록 타입아웃 시간을 무시하고 결과값을

받을때까지 기다린다. 그러나 트랜잭션 영역에서 호출했다면 트랜잭션 타임아웃

시간은 그대로 적용된다.

TPBLOCK 타임 아웃 시간 내에서 WinTmaxSend () 에

대한 응답이 올때까지 블록 상태로 기다린다.

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자

할때 사용한다. 개발자가 시그널을 사용할 경우 시스템 함수 호출 도중에 시그널이 발생하면 시스템 함수 호출은 중단되고

해당 API 는 TPGOTSIG 에러를 리턴하지만

TPSIGRSTRT 플래그를 설정할 경우 중단된

시스템 함수 호출은 재실행된다.

TPNOFLAGS 일반적으로 사용되는 플래그이다.

WinTmaxSend() 는 기능적으로 tpacall() 과 동일하다. 그러나 WinTmax.dll 내부의 메시지 처리 쓰레드가 도착한 결과 데이터를 처리해 주므로 tpgetrply() 와 같은 메시지를 받는 API 는 존재하지 않는다.

< Ex >

context=WinTmaxSetContext(m_hWnd, WM_TMAX_RECV_ERR, -1);

Page 154: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

153 Tmax C Programming Guide

int Result = WinTmaxSend(context, “TOUPPER”, (char*)buf, 0,

TPNOFLAGS);

if (Result<0) {

error process routine ....

}

3.7.3 윈도우즈 환경 어플리케이션의 컴파일

여기 에서는 C 를 이용하여 작성된 윈도우즈 환경의 프로그램을 컴파일 하는 방법에 대해 알아본다. MS VC++ 가 설치된 환경이라고 가정한다.

윈도우즈 환경에서는 별도의 mksvr 유틸을 제공하지 않는다.

VC++ 의 nmake 유틸리티를 사용한다. 사용방법은 다음과 같다.

$nmake /f <메이크 파일명>

3.7.3.1 서버 프로그램

ORACLE_HOME = "d:\oracle\ora81"

TMAXDIR = "C:\tmax"

LIBS = /link $(TMAXDIR)\lib\tmaxsvr.lib ws2_32.lib

ORALIBS=$(ORACLE_HOME)\precomp\lib\msvc\oraSQX8.lib

$(ORACLE_HOME)\pr ecomp\lib\msvc\oraSQL8.lib

CFLAGS = /D _DEBUG /D _WIN32 /D_USE_TPSVRINIT /D _USE_SDL /I $(TMAXDIR)

PROFLAGS = include=$(TMAXDIR)

#

#

TARGET = sdltest.exe

TARGET2 = sdltest

SDLFILE = demo.s

SDLOBJ = $(SDLFILE:.s=_sdl.obj)

SDLC = $(SDLFILE:.s=_sdl.c)

APOBJS = $(TARGET2:.pc=.c)

SVCTSRC = $(TARGET:.exe=_svctab.c)

SVCTOBJ = $(TARGET:.exe=_svctab.obj)

OBJS = $(APOBJS) $(SVCTOBJ) $(SDLOBJ)

Page 155: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 154

#

#

$(TARGET): svct sdl $(OBJS)

cl $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(ORALIBS)

copy $@ $(TMAXDIR)\appbin

$(APOBJS): $(TARGET2).pc

proc iname=$(TARGET2) include=$(TMAXDIR)

cl $(CFLAGS) -c $(TARGET2).c

svct:

copy $(TMAXDIR)\svct\$(SVCTSRC)

sdl:

sdlc -i $(TMAXDIR)\sample\sdl\$(SDLFILE)

copy $(TMAXDIR)\sample\sdl\$(SDLC)

#

clean:

-del $(OBJS) $(TARGET)

오라클이 설치된 디렉토리를 지정한다.

Tmax 가 설치된 디렉토리를 지정한다.

사용할 서버 라이브러리를 지정한다. TCS 방식의 경우 tmaxsvr.lib 를 UCS /RDP 방식의 경우는 tmaxucs.lib 을 사용한다.

오라클 라이브러리를 지정한다.

구조체 버퍼를 사용하는 경우 /D _USE_SDL 을, tpsvrinit() 및 tpsvrdone() 루틴을 사용하는 경우 /D_USE_TPSVRINIT 을 지정한다.

오라클에서 제공하는 proc 컴파일러를 이용한 프리컴파일 과정에 사용되는 옵션이다.

실행 파일명을 지정한다.

확장자를 제외한, 컴파일을 할 파일명이다.

사용하는 구조체 파일명이다.

Page 156: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

155 Tmax C Programming Guide

3.7.3.2 클라이언트 프로그램

TMAXDIR = "c:\tmax"

LIBS = /link $(TMAXDIR)\lib\tmax.lib

CFLAGS = /D _DEBUG /I $(TMAXDIR) /Gd /MD

#

#

TARGET = conv.exe

APOBJ = $(TARGET:.exe=.obj)

OBJS = $(APOBJ)

#

#

$(TARGET): $(OBJS)

cl $(CFLAGS) -o $@ $(OBJS) $(LIBS)

#

clean:

-del $(OBJS) $(TARGET)

Tmax 가 설치된 디렉토리이다.

사용하는 Tmax 클라이언트 라이브러리이다. tmax.lib, tmaxmt.lib, Wintmax.lib 중 사용하고자 하는 라이브러리를 지정한다.

컴파일 플래그이다. 사용자가 사용한 API 에 따라 MD, MT, ML 을 지정할 수 있으며 tmaxmt.lib Wintmax.lib 을 사용하는 경우 ML 은 사용하지 못한다.

실행파일명을 지정한다. 컴파일 대상도 같이 정해진다.

3.8 Tmax 보안 시스템

Tmax 는 시스템 접속 제어, 사용자 인증, 서비스 접근 제어의 3 단계로 보안 기능을 제공하고 있다.

각 단계의 보안 기능 설정은 Tmax 시스템 환경파일의 도메인절에서 설정한다. 도메인절의 SECURITY 항목은 “DOMAIN_SEC”, “USER_AUTH”, “ACL_SVG” 을

Page 157: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 156

설정할 수 있으며 각각 시스템 접속 제어, 사용자 인증, 서비스 접근제어 보안을 의미한다. 이 값이 “NO_SECURITY” 라면 보안 기능은 사용되지 않는다.

3.8.1 1 단계 보안: 시스템 접속 제어

시스템 접속 보안은 1 단계 보안으로 클라이언트가 Tmax 시스템에 접속 하고자 할 때 이를 제한 할수 있도록 한다. 이는 해당 Tmax 시스템에 대한 단일 암호를 설정하는 것으로 도메인절의 OWNER 항목에 정의된 계정의 암호를 의미한다. 이 계정과 암호는 Tmax 시스템이 기동되기 전에 mkpw 유틸리티로 미리 만들어져야 한다. 시스템 접속제어 보안이 설정되면 클라이언트는 Tmax 시스템 접속시 TPSTART_T 구조체의 dompwd 항목에 해당 암호를 등록해야 하며 그 암호가 옳은 경우에만 접속에 성공하게 된다. mkpw 유틸리티의 사용법은 Tmax Reference Guide 를 찾아보기 바란다.

다음은 1 단계 보안을 사용하는 Tmax 환경 파일의 예이다.

< Ex.m >

#시스템 인증인 경우 SECURITY 항목에 “DOMAIN_SEC”라고 설정한다.

*DOMAIN

res1 SHMKEY = 66999, MAXUSER=256,

SECURITY = “DOMAIN_SEC”, OWNER=tmax

*NODE

tmax TMAXDIR = “/home/tmax”,

APPDIR = “/home/tmax/appbin”

*SVRGROUP

svg1 NODENAME = tmax

*SERVER

upper SVGNAME = svg1, RESTART=Y, MAXRSTART=3

*SERVICE

TOUPPER SVRNAME = upper

TOLOWER SVRNAME = upper, PRIO=100

< Ex.c >

Page 158: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

157 Tmax C Programming Guide

...

main(int argc, char *argv[])

{

...

TPSTART_T *tpinfo;

...

tpinfo = (TPSTART_T *)tpalloc(“TPSTART”, NULL, sizeof(TPSTART_T));

if (tpinfo == NULL){

error processing routine

strcpy(tpinfo->dompwd, “tmax1234”);

if (tpstart(tpinfo) == -1){

error processing routine

}

...

}

3.8.2 2 단계 보안: 사용자 인증

사용자 인증 보안은 2 단계 보안으로써 Tmax 시스템에 인증된 사용자만이 Tmax 시스템 접속을 허락한다.

클라이언트는 Tmax 시스템에 접속할 때 tpstart() 의 인수로 TPSTART_T 구조체의 usrname 과 usrpwd 항목을 등록하여야 한다. usrname 은 Tmax 시스템에 인증된 사용자 계정이며 usrpwd 는 그에 대한 암호가 된다. 여기서 사용자 계정과 암호는 Tmax 시스템의 기동전에 관리자에 의해 mkpw 유틸리티로 만들어져 있어야 한다. mkpw 유틸리티에 관한 내용은 Tmax Reference Guide 를 참조하도록 한다.

이러한 사용자 인증 보안이 설정되었다면 해당 계정이 Tmax 시스템에 인증된 것으로 확인되어야 접속에 성공한다. 사용자 인증 보안은 시스템 접속 제어 보안의 다음 단계로써 시스템 접속 제어 보안을 포함하므로 클라이언트는 dompwd 항목도 정확하게 입력 하여야 한다.

다음은 2 단계 보안을 사용하는 Tmax 환경 파일의 예

< Ex.m >

*DOMAIN

res1 SHMKEY = 66999, MAXUSER=256,

Page 159: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 158

SECURITY = “USER_AUTH”, OWNER=tmax

*NODE

tmax TMAXDIR = “/home/tmax”,

APPDIR = “/home/tmax/appbin”

*SVRGROUP

svg1 NODENAME = tmax

*SERVER

upper SVGNAME = svg1, RESTART=Y, AXRSTART=3

*SERVICE

TOUPPER SVRNAME = upper

TOLOWER SVRNAME = upper, PRIO=100

< Ex.c >

...

main(int argc, char *argv[])

{

...

TPSTART_T *tpinfo;

tpinfo = (TPSTART_T *)tpalloc(“TPSTART”, NULL,sizeof(TPSTART_T));

if (tpinfo==NULL) {

error processing routine

}

strcpy(tpinfo->dompwd, “tmax1234”);

strcpy(tpinfo->usrname, “gdhong”) ;

strcpy(tpinfo->usrpwd, “hong0000”) ;

if (tpstart(tpinfo) == -1){

error processing routine

}

...

}

Page 160: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

159 Tmax C Programming Guide

3.8.3 3 단계 보안: 서비스 접근 제어

서비스 접근 제어 보안은 3 단계 보안으로써 Tmax 시스템에 접속된 사용자들 중에서 서비스별로 사용자의 접근을 제한한다. 서비스 접근 제어 보안은 서버 그룹 단위로 이루어지며 보안이 설정된 서버 그룹의 모든 서비스들에 대한 접근이 제한된다. 이는 Tmax 환경파일 중 서버그룹절의 SECURITY 항목에서 결정된다. SECURITY 항목값이 Y 인 서버 그룹의 서비스는 클라이언트가 접속하였을 때, TPSTART_T 구조체의 usrname 값이 Tmax 환경파일 중 *SVRGROUP 의 OWNER 와 일치 하여야만 서비스 호출에 성공할 수 있다.

서비스 접근 제어 보안(3 단계)은 시스템 접속 제어 보안의 1 단계와 사용자 인증의 2 단계 보안을 포함한다.

이 기능은 현재 Tmax 버전에서는(Ver 3.8) 지원하지 않는다.

다음은 3 단계 보안을 사용하는 Tmax 환경 파일의 예이다.

*DOMAIN

res1 SHMKEY = 66999, MAXUSER=256,

. SECURITY = “ACL_SVG”, OWNER = tmax

*NODE

tmax TMAXDIR = “/home/tmax”,

. APPDIR = “/home/tmax/appbin”

*SVRGROUP

svg1 NODENAME = tmax,

. SECURITY = Y, OWNER = secret

*SERVER

upper SVGNAME = svg1, RESTART = Y, MAXRSTART = 3

*SERVICE

TOUPPER SVRNAME = upper

TOLOWER SVRNAME = upper, PRIO=100

< Ex.c >

...

main(int argc, char *argv[])

{

...

Page 161: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 160

TPSTART_T *tpinfo;

...

tpinfo = (TPSTART_T *)tpalloc(“TPSTART”, NULL, sizeof(TPSTART_T));

if (tpinfo== NULL){

error processing routine

}

strcpy(tpinfo->dompwd, “tmax1234 ”);

strcpy(tpinfo->usrname, “secret ”) ;

strcpy(tpinfo->usrpwd, “garden99 ”) ;

if (tpstart(tpinfo) == -1){

printf(“tpstart failed, errno=%s\n”, tpstrerror(tperrno));

exit (1) ;

}

...

}

3.9 디버깅

Tmax 의 API 는 에러가 발생하는 경우 상황에 따른 적절한 에러 번호를 설정하여 준다. 에러 메시지를 참고하면 에러에 대한 원인 규명에 많은 도움을 줄 것이다. 이외에 API 내부 시스템 콜 레벨의 에러정보가 알고 싶다면 tuxinc/Uunix.h 에 정의되어 있는 에러메시지와 API 들이 도움을 줄 것이다.

어플리케이션 레벨이 아닌 Tmax 시스템 운영상에 발생하는 문제를 도출하는데 도움을 주기위해 운영상의 여러가지 정보를 콘솔에 뿌려주는 디버깅용 CLH 를 제공하고 있으니 참고하기 바란다.

3.9.1 API 레벨 에러 처리

Tmax API 가 실패하는 경우의 리턴 값은 API 마다 다르며 전역변수 tperrno 에는 에러 상황에 대한 에러 번호가 설정된다. Tmax 운영 중에 발생하는 에러 메시지는 Tmax Message Manual 를 참조하기 바란다.

tpstrerror

int tpstrerror (int errno)

Page 162: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

161 Tmax C Programming Guide

errno 알고 싶은 에러 메시지의 에러 번호이다.

< Ex >

...

if (tpalloc(“STRING”, NULL, 100) == -1) {

printf( “%s”, tpstrerror(tperrno));

}

tperrno

Tmax 응답 코드 내 용 조치 사항

- 1 사용되지 않는다.

TPEBADDESC 2

유효하지 않은 구별자이다. 구별자를

인수로 하는 API 사용시 발생한다.

해당 서비스 호출 API 가 돌려주는 값을 사용해야 한다.

TPEBLOCK 3

요청한 서비스가 블록상태로 되어 있어 즉시 서비스를 수행 할

수 없다.

TPNOBLOCK 플래그를 설정한 API

에서 발생한다. 블록상태가 해제된 후에 다시 시도해야

한다.

TPEINVAL 4 API 호출시 인수가

유효하지 않다.

예를 들어 지원되지 않는 플래그를

설정하거나 송/수신간에 tpalloc() 으로 할당되지 않은 버퍼를 사용하였거나 API 에서 지원하지

Page 163: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 162

Tmax 응답 코드 내 용 조치 사항

않는 인수를 사용한 경우이다.

TPELIMIT 5 시스템 자원 또는

Tmax 에서 제공하는 자원의 부족이다.

운영체제에서 제공하는 자원, 예를

들면 FD_SET 이 부족한 경우이다.

TPENOENT 6 서비스테이블에 존재하지

않는 서비스를 호출한 경우이다.

환경파일이 수정되었다면 gst 로

서비스 테이블을 새로 만들어 서버 응용프로그램

컴파일시 같이 컴파일 해 주어야 한다

TPEOS 7 OS 레벨의 오류이다.

예를 들면 malloc() 등이 실패한 경우이다.

운영체제를 비롯하여 네트웍 및 기존 운영되던 환경이

변경되었는지 제반환경을 점검해

보아야 한다

- 8 사용되지 않는다. -

TPEPROTO 9 부적절한 상황에서 API 가

호출되었다.

tpstart() 가 두번 수행되거나 서비스를 재귀적으로 호출한 경우이다.대화형 모드에서 대화

주도권이 없는 쪽에서 송신을 시도하는 경우

등에도 발생한다.

Page 164: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

163 Tmax C Programming Guide

Tmax 응답 코드 내 용 조치 사항

TPESVCERR 10정상적으로 서비스가

종료되지 않았다.

tpreturn() 으로 서비스 완료시 종료되지 않은

대화형 모드나 비동기형 서비스 호출이 남아 있는 경우, 서비스 루틴

내에서 시작된 트랜잭션이 완료되지

않은 경우이다.

TPESVCFAIL 11서비스 루틴에서 서비스 수행을 실패한 것으로

간주하였다.

tpreturn() 에 TPSUCCESS 이외의

값을 지정하여 클라이언트에게 넘긴 경우이다. 정상적인 서비스 실패이다.

TPESYSTEM 12Tmax 시스템에 이상이

발견되었다.

주로 네트워크 에러로 인해 발생하며 이경우 tpreset() 을 사용한 후 재접속 하도록 한다..

TPETIME 13

환경 파일 혹은 어플리케이션에서 설정한

타임 아웃 시간을 초과하였다.

타임아웃 시간을 조절하거나 네트웍 설정상의 문제가 없는지 조사한다.

TPETRAN 14트랜잭션을 지원하지

않는 서비스를 트랜잭션 모드로 호출 하였다

해당 API 의 플래그를 TPNOTRAN 으로

설정하여 사용한다.

TPEGOTSIG 15 TPSIGRSTRT 가 설정되지 않은 상태에서 시그널이

시그널을 사용하는 경우 해당 API 를 TPSIGRSTRT 를

Page 165: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 164

Tmax 응답 코드 내 용 조치 사항

수신되었다 설정하여 사용한다.

- 16 사용되지 않는다. -

TPEITYPE 17버퍼 타입을 잘못 사용한

경우이다.

Tmax 에서 지원되지 않는 버퍼타입을

사용하였거나 해당 API 에서 사용할 수 없는 버퍼를 사용한 경우, DDR 사용시

라우팅을 할수 없는 버퍼를 사용한

경우이다.

TPEOTYPE 18

클라이언트와 서버프로그램의 버퍼 타입이 서로 일치하지

않는 경우이다.

TPNOCHANGE 가 설정된 경우 서버에서

보낸 버퍼 타입과 클라이언트가 제공한

버퍼 타입이 일치 하지 않는 경우이다.

- 19 사용되지 않는다. -

- 20 사용되지 않는다, -

- 21 사용되지 않는다. -

TPEEVENT 22대화형 모드에서 이벤트가 발생한

경우이다.

이벤트가 발생하였다. 자세한 내용은 revent

에 설정된다

TPEMATCH 23RQ 사용시 발생하며 서비스명에 해당하는

데이터가 저장되어 있지

tpdeq() 로 데이터를 꺼내올 때 RQ 데이터

파일 내에 서비스

Page 166: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

165 Tmax C Programming Guide

Tmax 응답 코드 내 용 조치 사항

않은 경우이다. 이름에 해당하는 데이터가 존재하지

않는다.

TPENOREADY 24

서비스가 준비되지 않은 것이거나 구동은

되어있으나 활성화가 안돼 있는 경우이다.

tmadmin 에서 st –s 로 서비스에 대한 상태를 확인해 보아 NRDY 로

나타난다면 제대로 구동되어 있지 않은

것이다. 서버 프로세서를 다시 확인하고 다시 구동해야 한다.

TPESECURITY 25Tmax 보안 시스템에

설정되지 않은 사용자가 접속을 시도하였다.

사용자 아이디와 암호등을 확인한다.

TPEQFULL 26요청된 서비스가 지정한 Max Queue 에 도달했다.

Tmax 환경파일에서 또는 동적으로

Tmadmin Tool 에서 Max Queue 값을 조절

할 수 있다.

TPEQPURGE 27

큐에 저장된 클라이언트의 서비스 요청을 관리자가 지운

경우이다.

관리자는 ASQCOUNT 등으로 서비스의 부하를 조절하는

설정을 하도록 한다.

TPECLOSE 28Tmax 가 구동되지

않았거나 접속을 할 수 없는 경우이다.

Tmax 시스템이 정상적으로

구동되었는지를 확인한다.

Page 167: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 166

Tmax 응답 코드 내 용 조치 사항

TPESVRDOWN 29서버 프로세스가 다운된

상태이다.

서버프로세서의 정상 작동 중인지를 확인해

본다.

TPEPRESVC 30전처리 서비스 수행시 에러가 발생하였다.

RQ 사용시 PRESVC 를 지정하여 사용할 수 있는데 이때 전처리 서비스에서 오류가

발생하였다.

TPEMAXNO 31

운영중인 Tmax 시스템이 한번에 관리할 수 있는

최대 사용자 수를 초과하였다.

클라이언트 접속 상태를 확인한 후 타임아웃 시간등을

조절한다.

표 3-6. Tmax 함수 에러 메세지

3.9.2 시스템 레벨 에러 처리(Uunix.h)

Tmax API 는 많은 시스템 콜을 사용한다. 운영체제나 플랫폼 상에 문제가 있어서 특정 시스템 콜에서 에러가 나는 경우 이를 확인하고 싶을 때나 에러메시지가 다른 이종 플랫폼으로 포팅하고자 하는 경우 에러메시지를 통합하여 관리하고 싶을 때 아래에 소개하는 API 를 사용하면 많은 도움이 될 것이다.

사용하는 헤더 파일의 위치는 TMAXDIR/tuxinc/Uunix.h 이다.

Uunixerr

int Uunix_err

시스템 콜 도중 에러발생시 통합된 에러번호가 설정되는 변수이다

Uunix_err

void Uunix_err (char *msg)

Page 168: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

167 Tmax C Programming Guide

msg 에러가 난 시스템 콜에 앞서 추가하고 싶은 메시지 이다.

일반적으로 프로그램 명을 기록한다.

< Ex >

ret=tmaxreadenv("NO THAT FILE", "TMAX");

if (ret<0)

{

Uunix_err("myprog");

exit(1);

}

< result >

mypog: UOPEN

Ustrerror

char * Uunix_err (int err)

err 알고 싶은 에러 메시지의 통합 에러 번호이다.

< Ex >

ret=tmaxreadenv("NO THAT FILE", "TMAX");

if (ret<0)

{

printf("%d->%s\n", Uunixerr, Ustrerror(Uunixerr));

exit(1);

}

Page 169: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 168

< result >

11->UOPEN

Page 170: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

169 Tmax C Programming Guide

3.9.3 디버그 CLH

TMAXDIR/bin 디렉토리에 clh.dbg 라는 이름의 파일이 있다. 이 파일을 clh 로 이름을 바꾸어 사용하면 CLH 에서 이루어지는 모든 메시지 전달의 내용을 확인할 수 있다. 반드시 원본 clh 를 백업해 두도록 한다.

< Ex >

/home/navis/tmax/bin> tmboot

TMBOOT for node(aix5l) is starting:

Welcome to Tmax demo system: it will expire 2002/9/15

Today: 2002/7/16

TMBOOT: TMM is starting: Tue Jul 16 22:39:13 2002

TMBOOT: CLL is starting: Tue Jul 16 22:39:13 2002

TMBOOT: CLH is starting: Tue Jul 16 22:39:13 2002

COM: waiting for TMM reply

LIB: read 96 bytes

(I) CLH Current Tmax Configuration:

Number of client handler(MINCLH) = 1

Supported maximum user per node = 3944

Supported maximum user per handler = 3944

LIB: read 96 bytes

CLH: bootpid = 31202

TMBOOT: SVR(sub) is starting: Tue Jul 16 22:39:13 2002

TMBOOT: SVR(svr2) is starting: Tue Jul 16 22:39:13 2002

CLH: request_from_server: clh = 0, ind = 0, fd = 8

CLH: msg from server: msgtype = 101, svcname = , len = 0

CLH: register_from_server, spri = 32, svri = 0, maxtms = 32

CLH: reply_to_server: clh = 0, ind = 32, fd =8

CLH: msg to server: msgtype = 1101, svcname = , len = 0

CLH: request_from_server: clh = 0, ind = 0, fd = 9

CLH: msg from server: msgtype = 135, svcname = , len = 0

.....

Page 171: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 170

3.9.4 디버그 라이브러리

TMAXDIR/lib 디렉토리에 libsvrd.a / libsvr.so 라는 라이브러리가 존재한다. libsvr.a / libsvr.so 대신에 이들 라이브러리를 사용하면 콘솔창으로 여러가지 데이터값을 보여주므로 서버 라이브러리에서 일어나는 흐름을 파악할 수 있고 에러가 발생하는 시점을 찾는데도 편리하다. libsvrd.so 의 경우 이름만 libsvr.so 로 이름만 바꿔쓰면 되며 libsvrd.a 의 경우는 재컴파일을 필요로 한다.

< Ex >

/oracle/navis/tmax385/lib> tmboot

TMBOOT for node(tmaxc1) is starting:

Welcome to Tmax demo system: it will expire 2002/9/30

........

GETOPT1: -b 255859

GETOPT1: -s svr2

GETOPT1: -d -1

SVR: delay = -1, _use_lock = 1

COM: waiting for TMM reply

LIB: read 96 bytes

register_to_tmm success

init_shm(78990, 139364) success

init_svctab success

SVR: my info--1 32 0 0 -3

init_clh success

LIB: read 96 bytes

register_to_clh success

init_txinfo success

check_node success

_tmax_init = 1

GETOPT1: -b 255859

GETOPT1: -s fdltest

GETOPT1: -d -1

SVR: delay = -1, _use_lock = 1

COM: waiting for TMM reply

Page 172: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

171 Tmax C Programming Guide

LIB: read 96 bytes

register_to_tmm success

......

Page 173: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 172

4 Tmax 어플리케이션 예제

4 장 에서는 앞서 설명한 API 들을 사용하여 개발된 실제 어플리케이션의 예제를 보여준다. 가장 기본적인 프로그램에서 DB 를 사용하거나 좀 더 응용된 예제를 보여줌으로써 사용자는 기본적인 사용법 외에도 Tmax 를 이용한 프로그래밍 기법에 대해서도 익숙하게 될 것이다.

기초 프로그램

DB 적용 프로그램

응용 프로그램

4.1 기초 프로그램

이 장에서는 Tmax 에서 사용하는 세가지 통신형인 동기형, 비동기형, 대화형 어플리케이션의 간단한 예를 제시하여 전체적인 흐름에 대한 이해를 돕는다.

4.1.1 동기형 통신

클라이언트는 string 형 버퍼에 문자열을 복사해서 서비스를 호출하고 서버측의 서비스 루틴은 이 문자열을 받아서 대문자열로 바꾸어 리턴해주는 프로그램이다.

클라이언트 부분

Tmax 연결 : 기본 연결(클라이언트 정보 없음).

사용 버퍼 : STRING

통신 유형 : tpcall() 을 이용한 동기형 통신

서버 부분

서비스 : TOUPPERSTR

Page 174: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

173 Tmax C Programming Guide

데이터베이스 연결: 없음

4.1.1.1 클라이언트 프로그램

#include <stdio.h>

#include <string.h>

#include <usrinc/atmi.h>

main(int argc,char *argv[])

{

char *sendbuf, *recvbuf;

long rlen;

if (argc != 2)

{

fprintf(stderr,“Usage: $ %s string \n”,argv[0]);

exit (1) ;

}

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

{

fprintf(stderr,“Tpstart failed\n”);

exit (1) ;

}

if ((sendbuf = tpalloc(“STRING”,NULL,0)) == NULL) {

fprintf(stderr,“Error allocation send buffer\n”);

tpend ( ) ;

exit (1) ;

}

if ((recvbuf = tpalloc(“STRING”,NULL,0)) == NULL) {

fprintf(stderr,“Error allocation recv buffer\n”);

tpend ( ) ;

exit (1) ;

}

strcpy(sendbuf ,argv[ 1 ] ) ;

Page 175: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 174

if ( tpcall(“TOUPPERSTR”,sendbuf,0,&sendbuf,&rlen, TPNOFLAGS) == -1)

{

fprintf(stderr,“Can’t send request to service TOUPPER->%s!\n”,

tpstrerror(tperrno)) ;

tpfree(sendbuf) ;

tpfree(recvbuf) ;

tpend( ) ;

exit(1) ;

}

printf(“Sent value:%s\n ”,sendbuf ) ;

printf(“Returned value:%s\n ”,recvbuf ) ;

tpfree(sendbuf) ;

tpfree(recvbuf) ;

tpend( ) ;

4.1.1.2 서버 프로그램(syncsvc.c)

#include <stdio.h>

#include <usrinc/atmi.h>

TOUPPERSTR(TPSVCINFO *msg)

{

int i;

for (i = 0; i < msg->len ; i++)

msg->data[i] = toupper(msg->data[i]);

msg->data[i] = ‘\0’;

tpreturn(TPSUCCESS, 0, msg->data, 0, TPNOFLAGS);

}

4.1.1.3 Tmax 환경파일

*DOMAIN

resrc SHMKEY = 77990, MAXUSER = 256

*NODE

tmax TMAXDIR = “/home/tmax”,

Page 176: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

175 Tmax C Programming Guide

APPDIR = “/home/tmax/appbin”,

PATHDIR = “/home/tmax/path”,

TLOGDIR = “/home/tmax/log/tlog”,

ULOGDIR = “/home/tmax/log/slog”,

SLOGDIR = “/home/tmax/log/ulog”

*SVRGROUP

svg1 NODENAME = tmax

*SERVER

syncsvc SVGNAME = svg1,

MIN = 1, MAX = 5,

CLOPT = “ –e $(SVR).err –o $(SVR).out “

*SERVICE

TOUPPERSTR SVRNAME = syncsvc

4.1.2 비동기형 통신

클라이언트는 구조체형 버퍼의 멤버에 문자열을 복사해서 서비스를 호출하고 서버측의 서비스 루틴은 이 문자열을 받아서 소문자열 혹은 대문자열로 바꾸어 리턴해주는 프로그램이다.

클라이언트는 비동기형 통신으로 TOUPPER 서비스를 요청하고 다시 동기형으로 TOLOWER 서비스를 호출하여 결과를 받은 다음 앞서 요청한 TOUPPER 서비스의 수행결과를 받는다.

클라이언트 부분

Tmax 연결 : 기본 연결

사용 버퍼 : 구조체 버퍼(STRUCT)

통신 유형 : 동기형 및 비동기형

서버 부분

서비스 : TOUPPER, TOLOWER

데이터베이스 연결: 없음

Page 177: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 176

사용 구조체 버퍼(demo.s)

struct strdata {

int flag;

char sdata[20];

};

4.1.2.1 클라이언트 프로그램

#include <stdio.h>

#include <string.h>

#include <usrinc/atmi.h>

#include “../sdl/demo.s”

main(int argc,char *argv[ ])

{

struct strdata *sendbuf, *sendbuf1;

long dlen,clen;

int cd;

if (argc != 3) {

fprintf(stderr, “Usage: $ %s string STRING\n”, argv[0], argv[1]);

exit(1) ;

}

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

fprintf(stderr, “TPSTART_T failed\n”);

exit(1) ;

}

sendbuf = (struct strdata *)tpalloc(“STRUCT”, “strdata”, 0);

if ( sendbuf == NULL) {

fprintf(stderr, “Error allocation send buffer\n”);

tpend () ;

exit(1) ;

}

sendbuf1 = (struct strdata *)tpalloc(“STRUCT”, “strdata”, 0);

Page 178: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

177 Tmax C Programming Guide

if (sendbuf1 == NULL) {

fprintf(stderr, “Error allocation send1 buffer\n”);

tpend();

exit(1) ;

}

strcpy(sendbuf->sdata, argv[1]);

strcpy(sendbuf1->sdata, argv[2]);

if ((cd = tpacall(“TOUPPER”, (char *)sendbuf, 0, TPNOFLAGS)) == -1)

{

fprintf(stderr, “Toupper error -> %s”, tpstrerror(tperrno));

tpfree((char *)sendbuf);

tpend();

exit(1) ;

}

if (tpcall(“TOLOWER”,(char *)sendbuf1,0,(char **)&sendbuf1, &dlen,

TPSIGRSTRT) == -1) {

fprintf(stderr, “Tolower error -> %s”, tpstrerror(tperrno));

tpfree((char *)sendbuf);

tpend();

exit(1) ;

}

if (tpgetrply(&cd, (char **)&sendbuf, &clen, TPSIGRSTRT) == -1) {

fprintf(stderr, “Toupper getrply error -> %s”,

tpstrerror(tperrno));

tpfree((char *)sendbuf);

tpend();

exit(1) ;

}

printf(“Return value %s\n %s\n”, sendbuf -> sdata, sendbuf1 ->

sdata);

tpfree((char *)sendbuf);

tpfree((char *)sendbuf1);

Page 179: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 178

tpend() ;

}

Page 180: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

179 Tmax C Programming Guide

4.1.2.2 서버 프로그램(asyncsvc.c)

#include <stdio.h>

#include <usrinc/atmi.h>

#include “../sdl/demo.s”

TOUPPER(TPSVCINFO *msg)

{

int i = 0;

struct strdata *stdata;

stdata = (struct strdata *)msg -> data;

while (stdata->sdata[ i ] != ‘\0’) {

stdata->sdata[ i ] = toupper(stdata->sdata[ I ]);

i++ ;

}

tpreturn(TPSUCCESS, 0, (char *)stdata, 0, TPNOFLAGS);

}

TOLOWER(TPSVCINFO *msg)

{

int i = 0;

struct strdata *stdata;

stdata = (struct strdata *)msg -> data;

while ( stdata->sdata[ i ] != ‘\0’) {

stdata->sdata[ i ] = tolower(stdata->sdata[ i ]);

i++;

}

tpreturn(TPSUCCESS, 0, (char *)stdata, 0, TPNOFLAGS);

}

Page 181: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 180

4.1.2.3 Tmax 환경파일

*DOMAIN

resrc SHMKEY = 77990, MAXUSER = 256

*NODE

tmax TMAXDIR =“/home/tmax”,

APPDIR =“/home/tmax/appbin”,

PATHDIR =“/home/tmax/path”

*SVRGROUP

svg1 NODENAME = tmax

*SERVER

asyncsvc SVGNAME = svg1, MIN = 1, MAX = 5

*SERVICE

TOUPPER SVRNAME = asyncsvc

TOLOWER SVRNAME = asyncsvc

4.1.3 대화형 통신

클라이언트는 사용자의 입력을 받아 STRING 버퍼를 통해 고유번호를 보내며 서버측의 서비스 루틴은 DB 에 저장된 테이블에서 그 고유번호보다 큰 번호를 가지는 고객정보를 구조체를 통해 리턴해준다.

클라이언트는 대화형 모드를 설정하면서 고유번호를 보내며 대화 주도권은 서버측에 넘긴다. 서버측은 조건을 만족하는 DB 의 모든 데이터를 커서를 통해 읽어서 클라이언트로 보낸다. 클라이언트는 TPEVSVCSUCC 를 통해 이상없이 모든 데이터를 읽어왔다는 것을 확인 할 수 있다.

클라이언트 부분

Tmax 연결 : 기본 연결

사용 버퍼 : 보내는 버퍼 STRING 형, 받는 버퍼 구조체형(STRUCT)

통신 유형 : 대화형 통신

서버 부분

Page 182: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

181 Tmax C Programming Guide

서비스 : MULTI

데이터베이스 연결 : 오라클 사용

사용 구조체 버퍼(demo.s)

struct sel_o {

char seqno[10];

char corpno[10];

char compdate[8];

int totmon;

float guarat;

float guamon;

} ;

4.1.3.1 클라이언트 프로그램

#include <stdio.h>

#include <usrinc/atmi.h>

#include "../sdl/demo.s"

main(int argc, char *argv[])

{

struct sel_o *rcvbuf;

char *sndbuf;

long sndlen, rcvlen, revent;

int cd;

if (argc != 2) {

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

exit(1) ;

}

/* tpstart()와 함께 Tmax 에 연결함. */

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

printf("tpstart failed\n");

exit(1) ;

}

Page 183: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 182

if ((sndbuf = tpalloc("STRING", NULL, 12)) == NULL) {

printf("tpalloc failed:sndbuf\n");

tpend() ;

exit(1) ;

}

if ((rcvbuf = (struct sel_o *)tpalloc("STRUCT", "sel_o", 0)) == NULL)

{

printf("tpalloc failed:rcvbuf\n");

tpfree(sndbuf) ;

tpend() ;

exit(1) ;

}

strcpy(sndbuf, argv[1]);

if ((cd = tpconnect ("MULTI", sndbuf, 0, TPRECVONLY)) == -1){

printf("tpconnect failed:CONVER service, tperrno=%d\n",

tperrno);

tpfree(sndbuf) ;

tpfree((char *)rcvbuf);

tpend( ) ;

exit(1) ;

}

/* 대화형 통신 연결, 대화 주도권은 서버측에 넘김 */

printf("tpconnect SUCESS \"MULTI\" service\n");

while ( 1 ) { /* 다중 데이터 수신. */

printf("tprecv strat\n");

if( tprecv(cd, (char **)&rcvbuf, &rcvlen, TPNOTIME, &revent) <

0 ) {

/* 서버에서 tpreturn()으로 끝냈다면 */

if (revent == TPEV_SVCSUCC){

printf("all is completed\n");

break;

}

printf("tprecv failed, tperrno=%s, revent=%x\n",

Page 184: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

183 Tmax C Programming Guide

tpstrerror(tperrno), revent );

tpfree(sndbuf) ;

tpfree ((char *)rcvbuf);

tpend ( ) ;

exit ( 1 ) ;

}

printf("seqno = %s\t\t corpno =%s\n", rcvbuf->seqno,

rcvbuf->corpno) ;

printf("compdate = %s\t\t totmon =%d\n", rcvbuf->compdate,

rcvbuf->totmon) ;

printf("guarat = %f\t\t guamon =%f\n\n\n", rcvbuf->guarat,

rcvbuf->guamon) ;

}

tpfree(sndbuf) ;

tpfree((char *)rcvbuf);

tpend () ;

printf( "FINISH\n");

}

4.1.3.2 서버 프로그램(convsvc.pc)

#include <stdio.h>

#include <string.h>

#include <usrinc/atmi.h>

#include “../sdl/demo.s”

EXEC SQL begin declare section; /* 오라클 전역 변수 선언 */

char seq[10];

struct sel_o *sndbuf;

EXEC SQL end declare section;

EXEC SQL include sqlca;

MULTI(TPSVCINFO *msg)

{

int i, cd;

long sndlen, revent;

Page 185: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 184

memset(seq, 0, 10);

strcpy(seq, msg->data);

if ((sndbuf = (struct sel_o *) tpalloc (“STRUCT”, “sel_o”, 0)) ==

NULL) {

1 printf(“tpalloc failed:\n”);

tpreturn (TPFAIL, -1, NULL, 0, TPNOFLAGS);

}

/* 다량 데이터 위해 커서 선언 */

EXEC SQL declare democursor cursor for

select *

from corp

where seqno > :seq;

EXEC SQL open democursor;

EXEC SQL whenever not found goto end_of_fetch;

if (sqlca.sqlcode != 0){

printf(“oracle sqlerror=%s”, sqlca.sqlerrm.sqlerrmc);

tpreturn (TPFAIL, sqlca.sqlcode, NULL, 0, TPNOFLAGS);

}

/* 오라클 에러가 없는 동안 데이터 전송 */

while ( sqlca.sqlcode == 0 ){

EXEC SQL fetch democursor into :sndbuf;

if (tpsend (msg->cd, (char *)sndbuf, 0, TPNOTIME, &revent) == -

1){

printf(“tpsend failed, tperrno=%d, revent=%x\n”,

tperrno, revent ) ;

tpfree ((char *)sndbuf);

tpreturn (TPFAIL, -1, NULL, 0, TPNOFLAGS);

}

}

Page 186: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

185 Tmax C Programming Guide

tpreturn (TPFAIL, sqlca.sqlcode, NULL, 0, TPNOFLAGS);

end_of_fetch:

exec sql close democursor;

printf(“tpreturn before”);

tpreturn (TPSUCCESS, 0, NULL, 0, TPNOFLAGS);

}

4.1.3.3 오라클 테이블 작성 스크립트

sqlplus scott/tiger << EOF

create table multi_sel

(

seqno VARCHAR(10),

corpno VARCHAR(10),

compdate VARCHAR(8),

totmon NUMERIC(38),

guarat FLOAT,

guamon FLOAT

) ;

create unique index idx_tdb on multi_sel(seqno);

EOF

4.1.3.4 오라클 테이블 및 데이터 출력 스크립트

sqlplus scott/tiger << EOF

Desc multi_sel;

select * from multi_sel;

EOF

4.1.3.5 Tmax 환경파일

* DOMAIN

resrc SHMKEY = 77990, MAXUSER = 256

*NODE

tmax TMAXDIR = “/home/tmax”,

APPDIR = “/home/tmax/appbin”,

Page 187: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 186

PATHDIR =“/home/tmax/path”

* SVRGROUP

svg1 NODENAME = tmax,

DBNAME = ORACLE,

OPENINFO = “ORACLE_XA+Acc=P/scott/tiger+SesTm=60”,

TMSNAME = svg1_tms

*SERVER

convsvc SVGNAME = svg1, CONV = Y

*SERVICE

MULTI SVRNAME = convsvc

추가 부분

DBNAME

사용하는 데이터베이스명 정의

OPENINFO

오라클 데이터베이스와 연동하기 위한 연결 정보 설정

TMSNAME

전역 트랜잭션 처리를 주재하는 프로세스 이름 설정

CONV = Y

대화형 모드 서버 지정

4.2 DB 적용 프로그램

이 장에서는 대표적인 DB 인 오라클과 인포믹스를 사용하는 몇가지 예제를 제시한다.

Page 188: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

187 Tmax C Programming Guide

4.2.1 오라클 Insert 프로그램

클라이언트는 사용자의 입력을 받아 구조체 버퍼에 넣어 서비스를 호출하며 서버측은 이를 받아 해당 테이블에 추가해준다. 클라이언트는 트랜잭션을 지정하여 에러가 발생하였을 경우 롤백할 수 있도록 한다.

클라이언트 부분

Tmax 접속 : 기본 접속

사용 버퍼 : 구조체 버퍼(STRUCT) 사용

통신 유형 : tpcall() 에 의한 동기 통신

트랜잭션 처리: 클라이언트에서 트랜잭션 범위 지정

서버 부분

서비스 : ORAINS

DB 연결 : 오라클 데이터베이스

사용 구조체 버퍼(demo.s)

struct ktran {

int no;

char name[20];

};

4.2.1.1 클라이언트 프로그램

#include <stdio.h>

#include <usrinc/atmi.h>

#include “../sdl/demo.s”

main(int argc, char *argv[])

{

struct ktran *sndbuf, *rcvbuf;

long sndlen, rcvlen;

int cd;

Page 189: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 188

if (argc != 3) {

printf(“Usage: client no name\n”);

exit(1) ;

}

printf(“tpstart-start \n”);

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

printf(“Tpstart failed\n”);

exit(1) ;

}

printf(“tpstart-ok \n”);

if ((sndbuf = (struct ktran *) tpalloc(“STRUCT”, “ktran”, 0))

== NULL) {

printf(“tpalloc failed:sndbuf, tperrno=%d\n”, tperrno);

tpend() ;

exit(1) ;

}

if ((rcvbuf = (struct ktran *) tpalloc(“STRUCT”, “ktran”, 0))

== NULL) {

printf(“tpalloc failed:rcvbuf, tperrno=%d\n”, tperrno);

tpfree((char *)sndbuf);

tpend( ) ;

exit(1) ;

}

sndbuf->no = atoi(argv[1]);

strcpy(sndbuf->name, argv[2]);

printf(“tpcall-start \n”);

tx_begin();

if (tpcall (“ORAINS”, (char *)sndbuf, 0, (char **)&rcvbuf,

&rcvlen, TPNOFLAGS)

== -1){

printf(“tpcall failed:ORA service, tperrno=%d”, tperrno);

Page 190: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

189 Tmax C Programming Guide

printf(“sql code=%d\n”, tpurcode);

tx_rollback();

tpfree ((char *)sndbuf);

tpfree ((char *)rcvbuf);

tpend ( ) ;

exit(1) ;

}

printf(“tpcall-success \n”);

tx_commit();

tpfree ((char *)sndbuf);

tpfree ((char *)rcvbuf);

tpend ( ) ;

}

4.2.1.2 서버 프로그램(asyncsvc.c)

#include <stdio.h>

#include <usrinc/atmi.h>

#include “../sdl/demo.s”

EXEC SQL begin declare section;

char name[20];

int no;

EXEC SQL end declare section;

EXEC SQL include sqlca;

ORAINS(TPSVCINFO *msg)

{

struct ktran *stdata;

stdata = (struct ktran *)msg->data;

strcpy(name, stdata->name);

no = stdata->no;

printf(“Ora service started\n”);

Page 191: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 190

/* 데이터베이스에 삽입 */

EXEC SQL insert into testdb1(no, name) values(:no, :name);

if (sqlca.sqlcode != 0){

printf(“oracle sqlerror=%s”,sqlca.sqlerrm.sqlerrmc);

tpreturn (TPFAIL, sqlca.sqlcode, NULL, 0, TPNOFLAGS);

}

tpreturn (TPSUCCESS, sqlca.sqlcode, stdata, 0, TPNOFLAGS);

}

4.2.1.3 오라클 테이블 작성 스크립트

sqlplus scott/tiger << EOF

create table testdb1 (

no number(7),

name char(30)

) ;

EOF

4.2.1.4 오라클 테이블 및 데이터 출력 스크립트

sqlpus scott/tiger << EOF

desc testdb1;

select * from testdb1;

select count (*) from testdb1;

EOF

4.2.1.5 Tmax 환경파일

*DOMAIN

resrc SHMKEY = 77990, MAXUSER = 256

*NODE

tmax TMAXDIR = /home/tmax,

APPDIR = /home/tmax/appbin,

PATHDIR = /home/tmax/path

*SVRGROUP

Page 192: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

191 Tmax C Programming Guide

svg1 NODENAME = tmax,

DBNAME = ORACLE,

OPENINFO = “Oracle_XA+Acc=P/scott/tiger+SesTm=60”,

TMSNAME = svg1_tms

*SERVER

oinssvc SVGNAME = svg1, MIN = 1, MAX = 5

*SERVICE

ORAINS SVRNAME = oinssvc

추가 부분

DBNAME

사용하는 데이터베이스 정의

OPENINFO

오라클 데이터베이스 연결 정보 설정

tpsvrinfo()에서 호출

오라클 데이터베이스인 경우 CLOSEINFO 는 지정하지 않아도 됨

TMSNAME

트랜잭션 처리를 주재하는 프로세스 이름 지정

OPENINFO 지정으로 인한 자동 트랜잭션 처리

svg1 에 속한 해당 서비스를 자동 트랜잭션 상태에서 처리

4.2.2 오라클 Select 프로그램

클라이언트는 사용자의 입력을 받아 구조체 버퍼에 넣어 서비스를 호출하며 서버측은 이에 해당하는 모든 데이터를 받아 구조체 배열을 사용하여 결과를 리턴한다. 클라이언트는 트랜잭션을 지정하여 에러가 발생하였을 경우 롤백할 수 있도록 한다.

Page 193: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 192

클라이언트 부분

Tmax 접속 : 기본 접속

사용 버퍼 : 구조체 버퍼(STRUCT) 사용

통신 유형 : tpcall() 에 의한 동기 통신

트랜잭션 처리: 클라이언트에서 트랜잭션 범위 지정

서버 부분

서비스 : ORASEL

DB 연결: 오라클 데이터베이스

필요에 의해 버퍼 크기를 재조정

사용 구조체 버퍼 (demo.s)

struct stru_his{

long ACCOUNT_ID ;

long TELLER_ID ;

long BRANCH_ID ;

long AMOUNT ;

} ;

4.2.2.1 클라이언트 프로그램

#include <stdio.h>

#include <usrinc/atmi.h>

#include <usrinc/tx.h>

#include “../sdl/demo.s”

#define NARRAY 10

#define NOTFOUND 1403

main(int argc,char *argv[])

{

struct stru_his *transf;

Page 194: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

193 Tmax C Programming Guide

int i, j;

long urcode, nrecv, narray = NARRAY;

long account_id, teller_id, branch_id, amount;

if (argc != 2) {

fprintf(stderr,“Usage:$%s ACOUNT_ID !\n”, argv[0]);

exit(0);

}

if (tpstart((TPSTART_T *) NULL) == -1) { /* Tmax 에 접속 */

fprintf(stderr,“TPSTART_T(tpinfo) failed -> %s!\n”,

tpstrerror(tperrno)) ;

exit(1) ;

}

/* c structure 구조로 Buffer 생성 */

transf = (struct stru_his *) tpalloc(“STRUCT”, “stru_his”,0);

if (transf == (struct stru_his *)NULL) {

fprintf(stderr,“Tpalloc failed->%s!\n”,

tpstrerror(tperrno)) ;

tpend();

exit(1);

}

memset(transf, 0x00, sizeof(struct stru_his));

account_id = atoi(argv[1]);

transf->ACCOUNT_ID = account_id;

/* 트랜잭션 타임아웃 설정 */

tx_set_transaction_timeout(30);

/* global 트랜잭션 시작 */

if (tx_begin() < 0) {

fprintf(stderr, “tx_begin() failed ->%s!\n”,

tpstrerror(tperrno));

tpfree((char*)transf);

tpend();

Page 195: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 194

exit(0) ;

}

if (tpcall(“ORASEL”,(char *)transf, 0, (char **)&transf, &nrecv,

TPNOFLAGS)== -1){

/* 동기 통신으로 “ORASEL” 서비스 요청 */

fprintf(stderr,“Tpcall(SELECT...)error->%s ! ”,

tpstrerror(tperrno)) ;

tpfree((char *)transf);

/* 실패시 트랜잭션 취소 */

tx_rollback();

tpend();

exit(0) ;

}

/* 성공시 트랜잭션 커밋 */

if (tx_commit() == -1) {

fprintf(stderr, “tx_commit() failed ->%s!\n”,

tpstrerror(tperrno)) ;

tpfree((char *)transf);

tpend();

exit(0) ;

}

/* 받아온 데이터는 구조체의 배열이다. */

for (j =0 ; j < tpurcode ; j++) {

/* Oracle 에서 셀렉트한 데이터 결과를 프린트 */

if (j == 0)

printf(“%-12s%-10s%-10s%-10s\n”,

“ACCOUNT_ID”,“TELLER_ID”, “BRANCH_ID”, “AMOUNT”);

account_id=transf[j].ACCOUNT_ID;

teller_id=transf[j].TELLER_ID;

branch_id=(*(transf+j)).BRANCH_ID;

amount=transf[j].AMOUNT;

printf(“%-12d %-10d %-10d %-10d\n”, account_id,

teller_id,branch_id, amount);

}

/* 셀렉트한 data 가 없거나 끝이라면 */

if (urcode == NOTFOUND) {

Page 196: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

195 Tmax C Programming Guide

printf(“No records selected!\n”);

tpfree((char *)transf);

tpend();

return 0;

}

tpfree((char *)transf);

tpend();

}

4.2.2.2 서버 프로그램(oselsvc.pc)

#include <stdio.h>

#include <usrinc/atmi.h>

#include “../sdl/demo.s”

#define NARRAY 10

#define TOOMANY 2112

#define NOTFOUND 1403

EXEC SQL include sqlca.h;

EXEC SQL begin declare section;

long key, rowno= NARRAY;

long account_id[NARRAY],teller_id[NARRAY], branch_id[NARRAY],

amount[NARRAY] ;

EXEC SQL end declare section;

ORASEL(TPSVCINFO *msg)

{

struct stru_his *transf;

int i , lastno;

transf=(struct stru_his *) msg->data;

/* msg Buffer 의 내용을 프로그램 변수에 전달. */

key = transf->ACCOUNT_ID;

/* transf Buffer 의 크기를 재조정 */

if ((transf = (struct stru_his *) tprealloc((char*)transf,

sizeof(struct stru_his) * NARRAY )) == (struct stru_his

Page 197: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 196

*)NULL) {

fprintf(stderr, “tprealloc error ->%s\n”,

tpstrerror(tperrno));

tpreturn(TPFAIL, tperrno, NULL, 0, TPNOFLAGS);

}

EXEC SQL select account_id, teller_id, branch_id, amount

into :account_id, :teller_id, :branch_id, :amount from sel_his

where account_id > :key

/* account_id 가 client 에서 보낸 key 값 보다 큰 것을 */

order by account_id; /* global 변수에 넣어줌 */

/* sql error 체크 (셀렉트된 것이 없거나 너무 많은 것 제외.) */

if (sqlca.sqlcode != 0 && sqlca.sqlcode != NOTFOUND &&

sqlca.sqlcode!= TOOMANY) {

fprintf(stderr,“SQL ERROR ->NO(%d):%s\n”, sqlca.sqlcode,

sqlca.sqlerrm.sqlerrmc) ;

tpreturn(TPFAIL, sqlca.sqlcode, NULL, 0, TPNOFLAGS);

}

/* access 한 개수를 lastno 에 넣어줌 */

lastno = sqlca.sqlerrd[2];

/* 셀렉트 된 data 가 너무 많음 */

if (sqlca.sqlcode == TOOMANY)

lastno =rowno;

/* No records */

if (lastno == 0)

transf->ACCOUNT_ID = 0;

/* 오라클에서 셀렉트한 데이터를 전송할 Buffer 에 넣어줌 */

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

transf[i].ACCOUNT_ID = account_id[i];

transf[i].TELLER_ID = teller_id[i];

transf[i].BRANCH_ID = branch_id[i];

transf[i].AMOUNT = amount[i];

}

Page 198: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

197 Tmax C Programming Guide

tpreturn(TPSUCCESS, lastno, transf, i * sizeof(struct stru_his),

TPNOFLAGS );

}

4.2.2.3 오라클 테이블 작성 스크립트

sqlplus scott/tiger << EOF

create table sel_his(

account_id number(6),

teller_id number(6),

branch_id number(6),

amount number(6)

) ;

create unique index idx_tdb1 on sel_his(account_id);

EOF

4.2.2.4 오라클 테이블 및 데이터 출력 스크립트

sqlplus scott/tiger << EOF

desc sel_his;

select * from sel_his;

EOF

Page 199: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 198

4.2.2.5 Tmax 환경파일

*DOMAIN

resrc SHMKEY = 77990, MAXUSER = 256

*NODE

tmax TMAXDIR =“/home/tmax”,

APPDIR =“/home/tmax/appbin”,

PATHDIR =“/home/tmax/path”

*SVRGROUP

svg1 NODENAME = tmax,

DBNAME = ORACLE,

OPENINFO = “Oracle_XA+Acc=P/scott/tiger+SesTm=600”,

TMSNAME = svg1_tms

*SERVER

oselsvc SVGNAME = svg1, MIN = 1, MAX = 5

*SERVICE

ORASEL SVRNAME = oselsvc

추가 부분

DBNAME

사용 데이터베이스명 설정

OPENINFO

오라클 데이터 베이스 연결 정보 설정

오라클에서는 CLOSEINFO 는 설정 안해도 됨

오라클에서는 CLOSEINFO 는 설정 안해도 됨

TMSNAME

트랜잭션 처리를 관리하는 프로세스 이름 지정

Page 200: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

199 Tmax C Programming Guide

AUTOTRAN

해당 서비스 처리시 자동으로 트랜잭션 상태로 처리

OPENINFO 절 사용시 DbgFl 과 LogDir 설정

LogDir 을 사용하지 않으면 $ORACLE_HOME/rdbms/log 또는 현재 디렉토리에 xa_NULL 날짜.trc 파일이 생성되고 LogDir 을 지정하면 지정된 곳에 XA 에 관련된 로그를 남길수 있다 DbgFl 은 몇번째 단계의 디버그 플레그를 설정할 지를 결정해 준다. 기본적인 단계인 0x01 또는 OCI 단계인 0x04 등을 사용하면 된다.

OPENINFO=“Oracle_XA+Acc=P/계정/암호 +SesTm=60+LogDir=/tmp+DbgFl=0x01”

하지만 주의할 점은 개발시에는 Debug 모드를 해제하고 사용해야만 나중에 디스크가 FULL 나는 상황을 피할 수 있다.

4.2.3 인포믹스 Insert 프로그램

클라이언트는 사용자의 입력을 받아 구조체 버퍼에 넣어 서비스를 호출하며 서버측은 이를 받아 해당 테이블에 추가해준다. 클라이언트는 트랜잭션을 지정하여 에러가 발생하였을 경우 롤백할 수 있도록 한다.

클라이언트 부분

Tmax 접속 : 기본 접속

사용 버퍼 : 구조체 버퍼(STRUCT) 사용

통신 유형 : tpcall() 에 의한 동기 통신

트랜잭션 처리: 클라이언트에서 트랜잭션 범위 지정

서버 부분

서비스 : INSERT

DB 연결: 인포믹스 데이터베이스

사용 구조체 버퍼(demo.s)

struct info {

Page 201: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 200

char seq[8];

char data01[128];

char data02[128];

char data03[128];

} ;

4.2.3.1 클라이언트 프로그램

#include <stdio.h>

#include <usrinc/atmi.h>

#include <usrinc/tx.h>

#include “info.s”

main(int argc, char **argv)

{

struct info *transf;

char data[256];

long nrecv;

/* Tmax 에 연결. */

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

fprintf(stderr, “tpstart(TPINFO...) failed ->%s!\n”,

tpstrerror(tperrno)) ;

exit(1) ;

}

/* 응용프로그램에서 사용할 Buffer 메모리 할당. */

if ((transf = (struct info *)tpalloc (“STRUCT”, “info”, 0)) ==

(struct info *)NULL){

fprintf(stderr, “tpalloc(struct info, ...) failed ->%s!\n”,

tpstrerror(tperrno)) ;

tpend();

exit(1) ;

}

/* 전송할 데이터 필드를 채움. */

strcpy(transf->seq, “000001”);

strcpy(transf->data01, “Hello”);

Page 202: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

201 Tmax C Programming Guide

strcpy(transf->data02, “World”);

strcpy(transf->data03, “1234”);

/* 트랜잭션 timeout 설정 * /

tx_set_transaction_timeout (30);

/* 트랜잭션 시작을 알림. */

if (tx_begin() < 0) {

fprintf(stderr, “tx_begin() failed ->%s!\n”,

tpstrerror(tperrno)) ;

tpfree ((char *)transf);

tpend( ); exit(0);

}

/* 서비스 호출 */

if (tpcall (“INSERT”, (char*) transf, 0, (char **)&transf, &nrecv,

TPNOFLAGS ) == -1) {

fprintf(stderr, “tpcall(struct info, ...) failed ->%s!\n”,

tpstrerror(tperrno)) ;

tx_rollback ();

tpfree ((char *)transf),

tpend();

exit(0);

}

/* 트랜잭션 성공. */

if (tx_commit () < 0) {

fprintf(stderr, “tx_commit() failed ->%s!\n”,

tpstrerror(tperrno)) ;

tpfree ((char *)transf);

tpend( );

exit(0);

}

tpfree ((char *)transf );

/* Tmax 연결을 끊음. */

tpend( ) ;

Page 203: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 202

}

4.2.3.2 서버 프로그램(tdbsvr.c)

#include <stdio.h>

#include <ctype.h>

#include <usrinc/atmi.h>

#include “info.s”

EXEC SQL include sqlca.h;

/* 서비스 명*/

INSERT(TPSVCINFO *msg)

{

/* 프로그램상의 Buffer 형식 선언. */

struct info *INFO;

/* SQL 문 내의 Buffer 형식 선언. */

EXEC SQL begin declare section;

varchar seq[8],buf01[128],buf02[128],buf03[128];

EXEC SQL end declare section;

/* 메시지 Buffer 로 부터 구조체형으로 데이터를 전달 받는다. */

INFO = (struct info *)msg -> data;

/* 구조체 형식으로 전달받은 데이터를 데이터베이스 Buffer 로 복사. */

strcpy(seq, INFO->seq);

strcpy(buf01, INFO->data01);

strcpy(buf02, INFO->data02);

strcpy(buf03, INFO->data03);

/* SQL 문의 인서트 수행 */

EXEC SQL insert into testdb1 (seq,data01,data02,data03)

values(:seq, :buf01, :buf02, :buf03);

/* 에러가 발생한다면 */

if ( sqlca.sqlcode ! = 0)

{

Page 204: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

203 Tmax C Programming Guide

/* 인서트 실패를 알린다. */

printf(“SQL error => %d !” ,sqlca.sqlcode);

tpreturn (TPFAIL, sqlca.sqlcode, NULL, 0, TPNOFLAGS);

}

/* 인서트가 성공적으로 끝났을 때 */

tpreturn (TPSUCCESS, 0, NULL, 0, TPNOFLAGS);

}

Page 205: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 204

4.2.3.3 인포믹스 테이블 작성 스크립트

dbaccess << EOF

create database stores7 with buffered log;

grant connect to public;

database stores7;

drop table testdb1;

create table testdb1 (

seq VARCHAR(8) ,

data01 VARCHAR(120) ,

data02 VARCHAR(120) ,

data03 VARCHAR(120)

) lock mode row;

create unique index idx_tdb1 on testdb1(seq);

EOF

4.2.3.4 인포믹스 테이블 및 데이터 출력 스크립트

dbaccess << EOF

database stores7;

select * from testdb1;

EOF

Page 206: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

205 Tmax C Programming Guide

4.2.3.5 Tmax 환경파일

*DOMAIN

resrc SHMKEY = 77990, MAXUSER = 256

*NODE

tmax TMAXDIR =”/home/tmax”,

APPDIR =”/home/tmax/appbin”,

PATHDIR =”/home/tmax/path”

*SVRGROUP

svg1 NODENAME = tmax,

DBNAME = INFORMIX,

OPENINFO = “stores7”, CLOSEINFO = “”,

TMSNAME = info_tms

*SERVER

tdbsvr SVGNAME = svg1, MIN = 1, MAX = 5

*SERVICE

INSERT SVRNAME = tdbsvr

추가 부분

DBNAME

사용 데이터베이스명 설정’

OPENINFO, CLOSEINFO

인포믹스 데이터베이스 연결 및 해제를 위한 정보

tpsvrinfo(), tpsvrdone()에서 호출

TMSNAME

트랜잭션 처리를 주재하는 프로세스 이름 지정

OPENINFO 지정으로 인한 자동 트랜잭션 처리

Page 207: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 206

svg1에 속한 해당 서비스를 자동 트랜잭션 상태에서 처리

Page 208: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

207 Tmax C Programming Guide

4.2.4 인포믹스 Select 프로그램

클라이언트는 사용자의 입력을 받아 구조체 버퍼에 넣어 서비스를 호출하며 서버측은 이에 해당하는 모든 데이터를 받아 구조체 배열을 사용하여 결과를 리턴한다. 클라이언트는 트랜잭션을 지정하여 에러가 발생하였을 경우 롤백할 수 있도록 한다.

클라이언트 부분

Tmax 접속 : 기본 접속

사용 버퍼 : 구조체 버퍼(STRUCT) 사용

통신 유형 : tpcall() 에 의한 동기 통신

트랜잭션 처리: 클라이언트에서 트랜잭션 범위 지정

서버 부분

서비스 : SEL_ACCT

DB 연결: 인포믹스 데이터베이스

필요에 의해 버퍼 크기를 재조정

사용 구조체 버퍼 (demo.s)

struct stru_acct {

int ACCOUNT_ID;

char PHONE[20];

char ADDRESS[80];

} ;

Page 209: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 208

4.2.4.1 클라이언트 프로그램

#include <stdio.h>

#include <time.h>

#include <usrinc/atmi.h>

#include <usrinc/tx.h>

#include “acct.s”

#define NOTFOUND 1403

void htime(char *, int *);

main(int argc, char *argv[ ])

{

struct stru_acct *transf;

float tps;

int i, j, loop, cnt_data = 0, sec1, sec2;

long urcode, nrecv, narray;

char ts[30], te[30], phone[20], address[80];

int account_id, key;

if(argc != 2) {

fprintf(stderr,“Usage:$%sLOOP (NARRAY = 30) !\n”, argv[0]);

exit(0) ;

}

/*user 가 원하는 수행 횟수만큼 loop 를 돈다.*/

loop = atoi(argv[1]);

/* Tmax 에 접속 */

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

fprintf(stderr, “tpstart(tpinfo) failed ->%s!\n”,

tpstrerror(tperrno));

exit(1) ;

}

/* sec1 = 시작시간 */

htime(ts,&sec1); key=0;

Page 210: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

209 Tmax C Programming Guide

/* message buffer 할당 */

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

if ((transf = (struct stru_acct *)tpalloc (“STRUCT”, “stru_acct”, 0))

== (struct stru_acct *)NULL) {

fprintf(stderr,“Tpalloc(STRUCT.. )failed->%s!\n” ,

tpstrerror(tperrno)) ;

tpend(); exit(1);

}

transf -> ACCOUNT_ID = key;

/* time-out value= 30 */

tx_set_transaction_timeout(30) ;

if (tx_begin() < 0) { /* transaction 시작 */

fprintf(stderr, “tx_begin() failed ->%s!\n”,

tpstrerror(tperrno)) ;

tpfree((char*)transf);

tpend();

exit(0);

}

/* select service 호출 */

if (tpcall(“SEL_ACCT”, (char *)transf, 0, (char **)&transf, &nrecv,

TPNOFLAGS)== -1) {

/* service error : message buffer free &transaction 취소 & 접속 끊음 */

fprintf(stderr,“Tpcall(SELECT...)error-

>%s! ” ,tpstrerror(tperrno)) ;

tpfree ((char *)transf);

tx_rollback ( ) ;

tpend( ) ;

exit ( 1 ) ;

}

urcode = tpurcode;

/*성공적인 서비스 완결 : transaction 결과로 실제 resource 변화시킴*/

if (tx_commit() < 0 ) {

Page 211: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 210

fprintf(stderr, “tx_commit() failed ->%s!\n”,

tpstrerror(tperrno)) ;

tpfree((char *)transf);

tpend();

exit(0);

}

/*data 가 선택된 경우*/

if ( urcode != NOTFOUND) {

narray =urcode;

/* select 한 데이터의 마지막 Record */

key=transf[narray-1].ACCOUNT_ID;

/* selsct 한 개수 만큼 결과를 user 에게 출력 */

for ( j = 0 ; j < narray ; j++ ) {

if ( j == 0)

printf(“%-10s%-14s%s\n”, “ACCOUNT_ID”, “PHONE”,

“ADDRESS”) ;

account_id = transf[j].ACCOUNT_ID;

strcpy(phone, transf[j].PHONE);

strcpy(address, transf[j].ADDRESS);

printf(“%-10d %-14s %s\n”, account_id, phone, address);

}/* for2 end */

/* 전체 결과 개수 증가 */

cnt_data += j;

/* message buffer free */

tpfree ((char *)transf);

if(urcode == NOTFOUND) {

printf(“No records selected!\n”);

break ;

}

}/* for1 end */

/* message buffer free */

tpfree ((char *)transf);

/* Tmax 연결을 끊음. */

tpend ();

Page 212: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

211 Tmax C Programming Guide

/* sec2 = 끝 시간 */

htime(te,&sec2);

/* data 하나당 처리 시간 계산. */

printf(“TOT.COUNT = %d\n”, cnt_data);

printf(“Start time = %s\n”, ts);

printf(“End time = %s\n”, te);

if ((sec2-sec1) ! = 0)

tps = (float) cnt_data / (sec2 - sec1);

else

tps = cnt_data;

printf(“Interval = %d secs ==> %10.2f T/S\n”, sec2-sec1,tps);

}

htime(char *cdate, int *sec)

{

long time(), timef, pt;

char ct[20], *ap;

struct tm *localtime(), *tmp;

pt = time(&timef);

*sec = pt;

tmp = localtime(&timef);

ap = asctime(tmp);

sscanf(ap, “%*s%*s%*s%s”,ct);

sprintf( cdate, “%02d. %02d. %02d %s”, tmp->tm_year, ++tmp->tm_mon,

tmp->tm_mday,ct);

}

4.2.4.2 서버 프로그램(sel_acct.pc)

#include <stdio.h>

#include <usrinc/atmi.h>

#include <usrinc/tx.h>

#include “acct.s”

#define NFETCH 5

#define NOTFOUND 100

Page 213: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 212

EXEC SQL include sqlca.h;

EXEC SQL begin declare section;

long account_id, key;

varchar phone[20], address[80];

EXEC SQL end declare section;

SEL_ACCT(TPSVCINFO *msg)

{

int i , j , nfetch;

int return_code;

struct stru_acct *ACCT_V;

/*클라이언트 데이터를 받는다. */

ACCT_V = (struct stru_acct *) msg->data;

/* select 원하는 account id 값을 key 에 옮김. */

key = ACCT_V->ACCOUNT_ID;

/* 클라이언트 buffer 사이즈 재할당*/

if ((ACCT_V = (struct stru_acct *)tprealloc((char *)ACCT_V,

sizeof(struct stru_acct)*NFETCH )) == (struct stru_acct *)NULL) {

fprintf(stderr, “tprealloc error =%s\n”, tpstrerror(tperrno));

tpreturn (TPFAIL, tperrno, NULL, 0, TPNOFLAGS);

}

/*buffer 초기화*/

ACCT_V->ACCOUNT_ID = 0;

strcpy(ACCT_V->PHONE,“ ” ) ;

strcpy(ACCT_V->ADDRESS,“ ” ) ;

/* ACCOUNT table 로부터 phone, address 필드를 뽑음 */

EXEC SQL declare CUR_1 cursor for

select account_id,phone,address

into :account_id, :pfone, :address

from ACCOUNT

/* 필드키보다 account id 가 클 때 */

where account_id>:key;

Page 214: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

213 Tmax C Programming Guide

/* cursor open */

EXEC SQL open CUR_1;

/* cursor open error */

if (sqlca.sqlcode ! = 0) {

printf(“open cursor error !\n”);

tpreturn(TPFAIL, sqlca.sqlcode, NULL, 0, TPNOFLAGS);

}

nfetch=0 ;

return_code = NOTFOUND;

/* cursor open success */

while (sqlca.sqlcode == 0) {

/* cursor 서부터 data 하나씩 fetch */

EXEC SQL fetch CUR_1;

/* fetch error */

if (sqlca.sqlcode ! = 0) {

if (sqlca.sqlcode == NOTFOUND)

break ;

break ;

}

ACCT_V[nfetch].ACCOUNT_ID = account_id;

strcpy(ACCT_V[nfetch].PHONE, phone );

strcpy(ACCT_V[nfetch].ADDRESS, address );

/* select 한 data 개수 증가 */

nfetch++;

return_code = nfetch

/* NFETCH 개수만큼 select 했다면 while 문 벗어남 */

if (nfetch > NFETCH) {

nfetch = NFETCH;

return_code = nfetch;

Page 215: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 214

break ;

}

}

/* cursor close */

EXEC SQL close CUR_1;

/* select 의 결과와 그 data 를 클라이언트에게 return */

tpreturn ( TPSUCCESS, return_code, (char *)ACCT_V, sizeof(struct

stru_acct)*nfetch, TPNOFLAGS);

}

Page 216: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

215 Tmax C Programming Guide

4.2.4.3 인포믹스 테이블 작성 스크립트

dbaccess << EOF

create database stores7 with buffered log;

grant connect to public;

database stores7;

drop table ACCOUNT;

create table ACCOUNT (

account_id INTEGER,

phone VARCHAR(20),

address VARCHAR(80)

) lock mode row;

create unique index idx_tdb1 on ACCOUNT(account_id);

EOF

4.2.4.4 인포믹스 테이블 및 데이터 출력 스크립트

dbaccess << EOF

database stores7;

select * from ACCOUNT;

EOF

Page 217: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 216

4.2.4.5 Tmax 환경파일

*DOMAIN

resrc SHMKEY = 77990, MAXUSER = 256

*NODE

tmax TMAXDIR =”/home/tmax”,

APPDIR =”/home/tmax/appbin”,

PATHDIR =”/home/tmax/path”

*SVRGROUP

svg1 NODENAME = tmax,

DBNAME = INFORMIX,

OPENINFO = “stores7”,

CLOSEINFO = “”,

TMSNAME = info_tms

*SERVER

SEL_ACCT SVGNAME = svg1, MIN = 1, MAX = 5

*SERVICE

SEL_ACCT SVRNAME = sel_acct

추가 부분

DBNAME : 사용 데이터베이스 설정

OPENINFO, CLOSEINFO

인포믹스 데이터베이스에 연결 및 해제를 위한 정보

tpsvrinit(), tpsvrdone()에서 호출

TMSNAME

OPENINFO 지정으로 인한 자동 트랜잭션 처리

svg1 에 속한 해당 서비스를 자동 트랜잭션 상태에서 처리

Page 218: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

217 Tmax C Programming Guide

4.3 응용 프로그램

이 장에서는 어플리케이션 개발시에 응용하여 사용할 수 있는 예제를 제시하며 이를 통해 실제 프로그래밍 시의 기법을 보여준다.

4.3.1 글로벌 트랜잭션 처리 프로그램

클라이언트는 사용자의 입력을 받아 구조체 버퍼를 통해 고유번호와 데이터를 보내며 서버측은 해당 고유번호의 데이터를 업데이트 하고 이 데이터로 다른 DB 를 사용하는 서비스를 호출하여 테이블에 추가한다.

클라이언트는 이 모든 과정을 하나의 트랜잭션으로 지정하여 에러가 발생하였을 경우 두개의 DB 를 동시에 롤백할 수 있도록 한다.

그림 3-1. 두개의 DB 접속

Page 219: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 218

클라이언트 부분

Tmax 접속 : 기본 접속

사용 버퍼 : 구조체 버퍼(STRUCT) 사용

통신 유형 : tpcall() 에 의한 동기 통신

트랜잭션 처리: 클라이언트에서 트랜잭션 범위 지정

서버 부분

서버 프로그램 : 서로 다른 DB 를 사용하는 2 개의 서버 프로그램

서비스 : UPDATE, INSERT

DB 연결 : 두 종류의 오라클 데이터베이스

사용 구조체 버퍼(demo.s)

struct input {

int account_id;

int branch_id;

char phone[15];

char address[61];

};

4.3.1.1 클라이언트 프로그램

#include <stdio.h>

#include <usrinc/atmi.h>

#include "../sdl/demo.s"

#define TEMP_PHONE "6283-2114"

#define TEMP_ADDRESS "Korea"

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

Page 220: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

219 Tmax C Programming Guide

{

struct input *sndbuf;

char *rcvbuf;

int acnt_id, n, timeout;

long len;

if (argc != 2) {

fprintf(stderr, "Usage:%s account_id \n", argv[0]);

exit(1);

}

acnt_id = atoi(argv[1]);

timeout = 5;

n = tmaxreadenv("tmax.env", "tmax");

if (n < 0) {

fprintf(stderr, "tmaxreadenv fail! tperrno = %d\n", tperrno);

exit(1);

}

n = tpstart((TPSTART_T *)NULL);

if (n < 0) {

fprintf(stderr, "tpstart fail! tperrno = %s\n", tperrno);

exit(1);

}

sndbuf = (struct input *)tpalloc("STRUCT", "input", sizeof(struct

input));

if (sndbuf == NULL) {

fprintf(stderr, "tpalloc fail: sndbuf tperrno = %d\n",

tperrno);

tpend();

exit(1);

}

rcvbuf = (char *)tpalloc("STRING", NULL, 0);

if (rcvbuf == NULL) {

Page 221: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 220

fprintf(stderr, "tpalloc fail: rcvbuf tperrno = %d\n",

tperrno);

tpend();

exit(1);

}

sndbuf->account_id = acnt_id;

sndbuf->branch_id = acnt_id;

strcpy(sndbuf ->phone, TEMP_PHONE);

strcpy(sndbuf ->address, TEMP_ADDRESS);

tx_set_transaction_timeout(timeout);

n = tx_begin();

if (n < 0)

fprintf(stderr, "tx begin fail! tperrno = %d\n", tperrno);

n = tpcall("UPDATE", (char *)sndbuf, sizeof(struct input), (char

**)&rcvbuf, (long *)&len, TPNOFLAGS);

if (n < 0) {

fprintf(stderr, "tpcall fail! tperrno = %d\n", tperrno);

tpend();

exit(1);

}

n = tx_commit();

if (n < 0) {

fprintf(stderr, "tx commit fail! tx error = %d \n", n);

tx_rollback();

tpend();

exit(1);

}

printf("rtn msg = %s\n", rcvbuf);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

Page 222: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

221 Tmax C Programming Guide

tpend();

}

4.3.1.2 서버 프로그램(update.pc)

#include <stdio.h>

#include <ctype.h>

#include <usrinc/atmi.h>

#include <usrinc/sdl.h>

#include "../sdl/demo.s"

#define OKMSG "YOU COMPLETE THE TRANSACTION"

EXEC SQL include sqlca.h;

EXEC SQL BEGIN DECLARE SECTION;

int account_id;

int branch_id;

char ssn[15];

char phone[15];

char address[61];

EXEC SQL END DECLARE SECTION;

UPDATE(TPSVCINFO *msg)

{

struct input *rcvbuf;

int ret;

long acnt_id, rcvlen;

char *send;

Page 223: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 222

rcvbuf = (struct input *)(msg->data);

send = (char *)tpalloc("STRING", NULL, 0);

if (send == NULL) {

fprintf(stderr, "tpalloc fail errno = %s\n", strerror(tperrno));

tpreturn(TPFAIL, 0, (char *)NULL, 0, 0);

}

account_id = rcvbuf->account_id;

branch_id = rcvbuf->branch_id;

strcpy(phone, rcvbuf->phone);

strcpy(address, rcvbuf->address);

strcpy(ssn, "1234567");

EXEC SQL UPDATE ACCOUNT

SET BRANCH_ID = :branch_id,

PHONE = :phone,

ADDRESS = :address,

SSN = :ssn

WHERE ACCOUNT_ID = :account_id;

if (sqlca.sqlcode != 0 && sqlca.sqlcode != 1403 ) {

fprintf(stderr, "update failed sqlcode = %d\n", sqlca.sqlcode);

tpreturn(TPFAIL, -1, (char *)NULL, 0, 0);

}

rcvbuf->account_id++;

ret = tpcall("INSERT", (char *)rcvbuf, 0, (char **)&send, (long

*)&rcvlen, TPNOFLAGS);

if (ret < 0) {

fprintf(stderr, "tpcall fail tperrno = %d\n", tperrno);

tpreturn(TPFAIL, -1, (char *)NULL, 0, 0);

}

strcpy(send, OKMSG);

tpreturn(TPSUCCESS, 1, (char *)send, strlen(send), TPNOFLAGS);

}

Page 224: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

223 Tmax C Programming Guide

4.3.1.3 서버 프로그램(insert.pc)

#include <stdio.h>

#include <ctype.h>

#include <usrinc/atmi.h>

#include <usrinc/sdl.h>

#include "../sdl/demo.s"

#define OKMSG "YOU COMPLETE THE TRANSACTION"

EXEC SQL include sqlca.h;

EXEC SQL BEGIN DECLARE SECTION;

int account_id;

int branch_id;

char ssn[15];

char phone[15];

char address[61];

EXEC SQL END DECLARE SECTION;

INSERT(msg)

TPSVCINFO *msg;

{

struct input *rcvbuf;

int ret;

long acnt_id;

char *send;

rcvbuf = (struct input *)(msg->data);

send = (char *)tpalloc("STRING", NULL, 0);

if (send == NULL) {

fprintf(stderr, "tpalloc fail errno = %s\n", tpstrerror(tperrno));

tpreturn(TPFAIL, 0, (char *)NULL, 0, TPNOFLAGS);

}

account_id = rcvbuf->account_id;

branch_id = rcvbuf->branch_id;

strcpy(phone, rcvbuf->phone);

Page 225: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 224

strcpy(address, rcvbuf->address);

strcpy(ssn, "1234567");

/* Declare && Open Cursor for Fetch */

EXEC SQL INSERT INTO ACCOUNT (

ACCOUNT_ID,

BRANCH_ID,

SSN,

PHONE,

ADDRESS )

VALUES (

:account_id, :branch_id, :ssn, :phone, :address);

if (sqlca.sqlcode != 0 && sqlca.sqlcode != 1403 )

{

printf("insert failed sqlcode = %d\n", sqlca.sqlcode);

tpreturn(TPFAIL, -1, (char *)NULL, 0, TPNOFLAGS);

}

strcpy(send, OKMSG);

tpreturn(TPSUCCESS, 1, (char *)send, strlen(send), TPNOFLAGS);

}

4.3.1.4 오라클 테이블 작성 스크립트

sqlplus scott/tiger << EOF

drop table ACCOUNT;

create table ACCOUNT (

ACCOUNT_ID integer,

BRANCH_ID integer not null,

SSN char(13) not null,

BALANCE number,

ACCT_TYPE char(1),

LAST_NAME char(21),

FIRST_NAME char(21),

MID_INIT char(1),

Page 226: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

225 Tmax C Programming Guide

PHONE char(15),

ADDRESS char(61),

CONSTRAINT ACCOUNT_PK PRIMARY KEY(ACCOUNT_ID)

);

quit

EOF

4.3.1.5 Tmax 환경파일

*DOMAIN

res SHMKEY=88000, MINCLH=1, MAXCLH=5, TPORTNO=8880, BLOCKTIME=60

*NODE

tmax1 TMAXDIR = "/user/ tmax ",

APPDIR = "/user/ tmax /appbin",

PATHDIR = "/user/ tmax /path",

TLOGDIR = "/user/ tmax /log/tlog",

ULOGDIR="/user/ tmax /log/ulog",

SLOGDIR="/user/ tmax /log/slog"

tmax2 TMAXDIR = "/user/ tmax ",

APPDIR = "/user/ tmax /appbin",

PATHDIR = "/user/ tmax /path",

TLOGDIR = "/user/ tmax /log/tlog",

ULOGDIR="/user/ tmax /log/ulog",

SLOGDIR="/user/ tmax /log/slog"

*SVRGROUP

svg1 NODENAME = tmax1, DBNAME = ORACLE,

OPENINFO = "ORACLE_XA+Acc=P/scott/tiger+SesTm=60",

TMSNAME = svg1_tms

svg2 NODENAME = tmax2, DBNAME = ORACLE,

OPENINFO = "ORACLE_XA+Acc=P/scott/tiger+SesTm=60",

TMSNAME = svg2_tms

Page 227: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 226

*SERVER

update SVGNAME=svg1

insert SVGNAME=svg2

*SERVICE

UPDATE SVRNAME=update

INSERT SVRNAME=insert

4.3.2 대화형 모드를 이용한 DB 사용

클라이언트는 사용자의 입력을 받아 구조체 버퍼를 통해 고유번호와 데이터를 보내며 서버측은 해당 고유번호의 데이터를 업데이트 한다. 클라이언트와 서버는 이 과정을 10 회 반복한다.

클라이언트는 트랜잭션을 선언하고 대화형 모드를 설정하며 대화 주도권은 자신이 가진다. 클라이언트는 고유번호와 데이터를 보내면서 대화 주도권을 서버측에 넘기며 서버측은 해당 고유번호의 데이터를 업데이트 하고 성공을 알리는 메시지와 함께 다시 클라이언트 쪽으로 대화 주도권을 넘긴다. 마지막 열번째에 서버는 대화 주도권을 넘기지 않고 tpreturn() 을 수행하며 클라이언트는 TPEV_SVCSUCC 이벤트를 받고 트랜잭션을 커밋한다.

Page 228: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

227 Tmax C Programming Guide

그림 3-4. 대화형 모델 흐름도

클라이언트 부분

Tmax 연결 : 기본 연결

사용 버퍼 : 보내는 버퍼 STRING 형, 받는 버퍼 구조체형(STRUCT)

통신 유형 : 대화형 통신

클라이언트는 트랜잭션 범위를 설정

서버 부분

서비스 : UPDATE.

Page 229: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 228

데이터베이스 연결 : 오라클 사용

사용 구조체 버퍼(demo.s)

struct input {

int account_id;

int branch_id;

char phone[15];

char address[61];

};

4.3.2.1 클라이언트 프로그램

#include <stdio.h>

#include <usrinc/atmi.h>

#include "../sdl/demo.s"

#define TEMP_PHONE "6283-2115"

#define TEMP_ADDRESS "Korea"

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

{

struct input *sndbuf;

char *rcvbuf;

int acntid, timeout;

long revent, rcvlen;

int cd, n;

if (argc != 2) {

fprintf(stderr, "Usage:%s acntid\n", argv[0]);

exit(1);

}

acntid = atoi(argv[1]);

timeout = 5;

Page 230: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

229 Tmax C Programming Guide

n = tmaxreadenv("tmax.env", "tmax");

if (n < 0) {

fprintf(stderr, "tmaxreadenv fail tperrno = %d\n", tperrno);

exit(1);

}

n = tpstart((TPSTART_T *)NULL);

if (n < 0) {

fprintf(stderr, "tpstart fail tperrno = %s\n", tperrno);

exit(1);

}

printf("tpstart ok!\n");

sndbuf = (struct input *)tpalloc("STRUCT", "input", sizeof(struct

input));

if (sndbuf == NULL) {

fprintf(stderr, "tpalloc fail: sndbuf tperrno = %d\n", tperrno);

tpend();

exit(1);

}

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

if (rcvbuf == NULL) {

fprintf(stderr, "tpalloc fail: rcvbuf tperrno = %d\n", tperrno);

tpend();

exit(1);

}

sndbuf->account_id = acntid;

sndbuf->branch_id = acntid;

strcpy(sndbuf->phone, TEMP_PHONE);

strcpy(sndbuf->address, TEMP_ADDRESS);

tx_set_transaction_timeout(timeout);

n = tx_begin();

if (n < 0)

Page 231: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 230

fprintf(stderr, "tx begin fail tx error = %d\n", n);

printf("tx begin ok!\n");

cd = tpconnect("UPDATE", NULL, 0, TPSENDONLY);

if (cd < 0) {

fprintf(stderr, "tpconnect fail tperrno = %d\n", tperrno);

tpend();

exit(1);

}

while (1) {

n = tpsend(cd, (char *)sndbuf, sizeof(struct input), TPRECVONLY, &revent);

if (n < 0) {

fprintf(stderr, "tpsend fail revent = 0x%08x\n", revent);

tx_rollback();

tpend();

exit(1);

}

printf("tpsend ok\n");

n = tprecv(cd, (char **)&rcvbuf, (long *)&rcvlen, TPNOTIME, &revent);

if (n < 0 && revent != TPEV_SENDONLY) {

fprintf(stderr, "tprecv fail revent = 0x%08x\n", revent);

tx_rollback();

tpend();

exit(1);

}

printf("tprecv ok\n");

sndbuf->account_id++;

if (revent != TPEV_SENDONLY)

break;

}

n = tprecv(cd, (char **)&rcvbuf, (long *)&rcvlen, TPNOTIME, &revent);

if (n < 0 && revent != TPEV_SVCSUCC) {

fprintf(stderr, "tprecv fail revent = 0x%08x\n", revent);

Page 232: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

231 Tmax C Programming Guide

tx_rollback();

tpend();

exit(1);

}

printf("rcvbuf = [%s]\n", rcvbuf);

n = tx_commit();

if (n < 0) {

fprintf(stderr, "tx commit fail tx error = %d\n", n);

tx_rollback();

tpend();

exit(1);

}

printf("tx commit ok!\n");

printf("rtn msg = %s\n", rcvbuf);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

}

4.3.2.2 서버 프로그램(update.pc)

#include <stdio.h>

#include <ctype.h>

#include <usrinc/atmi.h>

#include "../sdl/demo.s"

void _db_work();

#define OKMSG "YOU COMPLETE THE TRANSACTION"

EXEC SQL include sqlca.h;

EXEC SQL BEGIN DECLARE SECTION;

Page 233: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 232

int account_id;

int branch_id;

char ssn[15];

char phone[15];

char address[61];

EXEC SQL END DECLARE SECTION;

struct input *rcvbuf;

UPDATE(TPSVCINFO *msg)

{

int ret, count;

long acnt_id;

long revent, rcvlen, flag;

char *send;

rcvbuf = (struct input *)tpalloc("STRUCT", "input", 0);

send = (char *)tpalloc(“STRING", NULL, 0);

count = 1;

flag = TPNOFLAGS;

while (1) {

ret = tprecv(msg->cd, (char **)&rcvbuf, &rcvlen, TPNOTIME, &revent);

if (ret < 0 && revent != TPEV_SENDONLY) {

fprintf(stderr, "tprecv fail revent = 0x%08x\n", revent);

tpreturn(TPFAIL, -1, (char *)rcvbuf, 0, TPNOFLAGS);

}

printf("tprecv ok!\n");

if (count == 10) {

flag &= ~TPRECVONLY;

flag |= TPNOTIME;

}

else

flag |= TPRECVONLY;

Page 234: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

233 Tmax C Programming Guide

_db_work();

sprintf(send, “%d th data updated\n”, count);

ret = tpsend(msg->cd, (char *)send, strlen(send), flag, &revent);

if (ret < 0) {

fprintf(stderr, "tpsend fail revent = 0x%08x\n", revent);

tpreturn(TPFAIL, -1, (char *)NULL, 0, TPNOFLAGS);

}

printf("tpsend ok!\n");

/* break after 10 iterations */

if (count == 10)

break;

count++;

}

strcpy(send, OKMSG);

printf("tpreturn ok!\n");

tpreturn(TPSUCCESS, 1, (char *)send, strlen(send), TPNOFLAGS);

}

void _db_work()

{

account_id = rcvbuf->account_id;

branch_id = rcvbuf->branch_id;

strcpy(phone, rcvbuf->phone);

strcpy(address, rcvbuf->address);

strcpy(ssn, "1234567");

EXEC SQL UPDATE ACCOUNT

SET BRANCH_ID = :branch_id,

PHONE = :phone,

ADDRESS = :address,

SSN = :ssn

Page 235: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 234

WHERE ACCOUNT_ID = :account_id;

if (sqlca.sqlcode != 0 && sqlca.sqlcode != 1403 )

{

fprintf(stderr, "update failed sqlcode = %d\n", sqlca.sqlcode);

tpreturn(TPFAIL, -1, (char *)NULL, 0, 0);

}

}

4.3.2.3 오라클 테이블 작성 스크립트

sqlplus scott/tiger << EOF

drop table ACCOUNT;

create table ACCOUNT (

ACCOUNT_ID integer,

BRANCH_ID integer not null,

SSN char(13) not null,

BALANCE number,

ACCT_TYPE char(1),

LAST_NAME char(21),

FIRST_NAME char(21),

MID_INIT char(1),

PHONE char(15),

ADDRESS char(61),

Page 236: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

235 Tmax C Programming Guide

CONSTRAINT ACCOUNT_PK PRIMARY KEY(ACCOUNT_ID)

);

quit

EOF

4.3.2.4 Tmax 환경파일

*DOMAIN

res SHMKEY=88000, MINCLH=1, MAXCLH=5, TPORTNO=8880, BLOCKTIME=60

*NODE

tmax TMAXDIR="/user/ tmax ",

APPDIR="/user/ tmax /appbin",

PATHDIR = "/user/ tmax /path",

TLOGDIR = "/user/ tmax /log/tlog",

ULOGDIR="/user/ tmax /log/ulog",

Page 237: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 236

SLOGDIR="/user/ tmax /log/slog"

*SVRGROUP

svg1 NODENAME = tmax, DBNAME = ORACLE,

OPENINFO = "ORACLE_XA+Acc=P/scott/tiger+SesTm=60",

TMSNAME = svg1_tms

*SERVER

update SVGNAME=svg1, CONV=YES

*SERVICE

UPDATE SVRNAME= update

Page 238: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

237 Tmax C Programming Guide

5 Tmax client Multithread / Multicontext

3.8.15 버전 이후부터는 클라이언트 라이브러리에 multithread 를 위한 부분이 추가되었다. 5 장에서는 multithread 를 사용하기 위해서 설정해 주어야 할 내용들이 설명되어 있다.

5.1 개요

5.1.1 Multithread 프로그램이란 무엇인가.

Multithreading 이라는 것은 하나의 프로세스안에 하나 이상의 실행 unit 을 가지고 있는 것이다. 따라서 Tmax Multithread 어플리케이션에서는 같은 프로세스에서 동시에 여러개의 서비스를 요청할 수 있다.

<그림 5-1> Tmax Client Multithread Application

Page 239: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 238

위의 그림에서 볼수 있듯이 하나의 클라이언트 프로세스는 동시에 2 개의 서비스를 호출할 수 있게 된다.

5.1.2 Multicontext 프로그램이란 무엇인가.

Multicontext 란 하나의 클라이언트가 Tmax 시스템과 여러개의 연결을 맺고 통신할 수 있도록 하는 프로그램 기법이다.

<그림 5-2> Tmax Client Multicontext Application

위의 그림에서 볼 수 있듯이 하나의 클라이언트는 여러개의 context 를 가지며 각 context 는 Tmax 시스템과 각각 하나씩의 connection 을 맺고 통신하게 된다.

따라서 multicontext 를 사용하는 경우 Tmax 시스템은 하나의 user 로 인식하게 된다.

5.1.3 Tmax 의 Multithread/Multicontext 지원사항

Tmax 시스템은 Multithread/Multicontext 에 대해 아래와 같은것들을 지원한다.

Kernel-level packages : thread 를 생성하고 소멸하는등의 프로그램은 개발자가 로직을 고려하여 작성하여야 한다.

Page 240: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

239 Tmax C Programming Guide

C 로 작성된 Multithead 어플리케이션 : Cobol 로 작성된 Multithread 어플리케이션은 지원하지 않는다.

C 로 작성된 Multicontext 어플리케이션 : Cobol 로 작성된 Multicontext 어플리케이션은 지원하지 않는다.

Page 241: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 240

5.2 Multithread/Multicontext 구현

Multithread 및 Multicontext 를 사용하기 위해서는 다음의 세가지 루틴을 따라 프로그램을 작성해야 한다.

Multithread/Multicontext 시작

Multithread/Multicontext 구현

Multithread/Multicontext 종료

5.2.1 Multithread/Multicontext 시작 구문

Multithread/Multicontext 는 다음과 같은 API 들로 시작할 수 있다.

tpstart : 이 함수는 Tmax 시스템과의 연결을 하는 함수로서 첫번째 인자인 TPSTART_T 의 멤머인 flags 를 TPMULTICONTEXTS 또는 TPSINGLECONTEXT 로 설정함으로서 Multicontext 또는 Singlecontext 로 Tmax 시스템과 연결할 수 있다. flags 에 아무런 값도 설정하지 않는다면 TPSINGLECONTEXT 가 기본적으로 설정되어 Singlecontext 로 동작하게 된다.

또한 클라이언트는 한번 Singlecontext 로 설정하면 계속해서 Singlecontext 로만 동작하게 되고, Multicontext 로 설정하면 계속해서 Multicontext 로 사용하게 된다.

tpsetctxt : 이 함수를 사용하여 하나의 클라이언트가 기존에 만들어진 다른 context 를 현재 클라이언트에 할당할 수 있다.

많은 대부분의 ATMI 함수들은 per-context 기반으로 되어 있다. 클라이언트는 여러개의 context 를 사용할 수 있지만 해당하는 순간에는 단 하나의 context 만을 갖게 된다.

예를 들면 context1 에서 tpacall()을 한 경우 다른 context 를 사용했다 하더라도 tpgetrply()를 정상적으로 하기 위해서는 tpgetrply()를 하는 시점에서는 context1 을 현재 context 로 설정해 주어야 한다.

클라이언트의 현재 context 를 알기 위해서는 tpgetctxt()라는 함수를 사용하여 리턴되는 값으로 확인할 수 있다.

Page 242: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

241 Tmax C Programming Guide

5.2.2 Multithread/Multicontext 구현 구문

Multithread/Multicontext 는 ATMI 함수들을 사용하여 구현한다. 이 ATMI 함수들을 사용할 때는 반드시 현재 context 인지를 알고 사용해야 정상적으로 사용할 수 있다.

5.2.2.1 동기형 통신

Tmax 시스템과 Client 가 동기형 통신을 하는 경우 현재 context 가 TPTPINVALIDCONTEXT 가 아닌 경우 정상적으로 수행 된다. TPINVALIDCONTEXT 란 현재 context 가 다른 thread 에 의해서 free 된 경우를 말한다. 예를 들어 하나의 thread1 에서 tpstart()를 한 후 context1 을 갖고, thread2 에서는 tpsetctxt()로 context1 을 같이 사용하는 경우, thread1 에서 처리를 끝내고 tpend()를 하면 context1 도 메모리에서 삭제 되므로 thread2 는 TPINVALIDCONTEXT 를 갖게 된다.

또한 Multicontext 가 아닌 경우 tpstart()를 하지 않고서도 tpcall()등의 API 를 호출하면 자동으로 Tmax 시스템과 연결을 하였으나 Multicontext 인 경우는 반드시 tpstart()를 한 후에 tpcall()등의 API 를 명시적으로 사용하여야 한다.

5.2.2.2 비동기형 통신

Multicontext 를 사용하는 경우 같은 context 를 같은 두개의 thread 가 있는 경우 하나의 thread 에서 tpacall()후 다른 thread 에서 tpgetrply()를 사용하여 결과를 가져올 수 있다. 그러나 이렇게 사용할 때는 tpacall()이 반드시 먼저 호출되어야 하므로 두 thread 간에 우선 순위가 반드시 명확한 경우에 사용해야 올바른 결과를 받아올 수 있으므로 조심해서 사용해야 한다. 그리고 동기형 통신과 마친가지로 TPINVALIDCONTEXT 가 아닌 경우에 정상적으로 수행된다.

5.2.2.3 transaction

만약 하나의 thread 에서 transaction 을 시작하였다면, 그 thread 와 같은 context 를 쓰는 thread 들은 transaction 을 시작한 이후부터 하나의 transaction 이 된다.

이렇게 사용하는 경우도 비동기형 통신과 마찬가지로 우선 순위가 명확한 경우에 사용하는것이 바람직 하다. 또한 TPINVALIDCONTEXT 가 아닌 경우에 정상적으로 수행된다.

5.2.3 Multithread/Multicontext 종료 구문

tpend()함수를 통하여 Multithread/Multicontext 를 종료하게 된다.

Page 243: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 242

이 함수를 사용하지 않는 경우 context 와 해당하는 thread 에 대한 정보가 메모리에서 지워지지 않으므로 나중에 문제가 발생할 수 있으므로, 반드시 context 를 다 사용한 후에는 tpend()를 해 주어야 한다.

5.3 Multithread/Multicontext API

5.3.1 tpgetctxt

이름

tpgetctxt : 현재 context 를 반환하는 함수

사용 방법

#include <usrinc/atmi.h>

int tpgetctxt(int *ctxtid, long flags)

설 명

이 함수를 호출한 시점의 현재 context 를 첫번째 인자로 반환하는 함수이다. multicontext 인 경우 1 보다 큰 값을 가져오게 된다. 또한 singlecontext 인 경우 0 값을 가져오게 된다.

두번째 인자인 flags 는 현재 0 을 설정해야 한다.

반 환 값

에러가 발생하면 -1 을 return 하고, tperrno 변수 값이 설정된다

오 류

다음 상황에서 tpgetctxt()는 실패하고 tperrno 에 아래 값 중 하나가 설정된다.

[TPEINVAL]

잘못된 인자가 설정되었다. 예를 들어 첫번째 인자가 포인터 값이 이니던가, 두번째 인자가 0 이 아닌 값으로 설정된 경우 등이다.

[TPESYSTEM]

Page 244: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

243 Tmax C Programming Guide

Tmax 시스템에 에러가 발생하였다. 자세한 정보는 로그파일에 기록된다.

[TPEOS]

운영 시스템에 에러가 발생하였다.

참 조

tpsetctxt()

5.3.2 tpsetctxt

이 름

tpsetctxt : 현재 context 를 설정하는 함수.

사용 방법

#include <usrinc/atmi.h>

int tpsetctxt(int ctxtid, long flags)

설 명

이 함수를 호출한 시점의 현재 context 를 첫번째 인자로 설정하는 함수이다.

두번째 인자인 flags 는 현재 0 을 설정해야 한다.

tpsetctxt()함수로는 TPNULLCONTEXT 를 비롯한 다른 사용 가능한 context 들로 설정할 수 있다. 여기서 설정 가능한 context 란 tpstart 를 하여 새로운 context 가 생성된 id 이다. 그러나 TPINVALIDCONTEXT 로는 설정할 수 없다.

반 환 값

에러가 발생하면 -1 을 return 하고, tperrno 변수 값이 설정된다

오 류

다음 상황에서 tpsetctxt()는 실패하고 tperrno 에 아래 값 중 하나가 설정된다.

[TPEINVAL]

Page 245: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 244

잘못된 인자가 설정되었다. 첫번쨰 인자에 0 또는 TPINVALIDCONTEXT 가 설정된 경우나, flags 값에 0 이외의 값이 설정된 경우 등이다.

[TPENOENT]

첫번째 인자에 설정된 값이 설정 가능한 context 가 아닌경우 발생한다.

[TPEINVAL]

tpstart()하기 전에 이 함수를 호출한 경우 발생한다.

tpstart()를 TPMULTICONTEXTS 로 설정하지 않은 상태에서 이 함수를 호출한 경우 발생한다.

multicontext 인 경우 0 으로 설정된 경우에 발생한다.

[TPESYSTEM]

Tmax 시스템에 에러가 발생하였다. 자세한 정보는 로그파일에 기록된다.

[TPEOS]

운영 시스템에 에러가 발생하였다.

참 조

tpgetctxt()

5.4 예제

5.4.1 클라이언트 프로그램

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

/* Multi-thread/Multi-context Sample Program */

/* */

/* TmaxSoft Co. / QA */

/* remarks: Tmax 의 TOUPPER 서비스가 구동되어 있어야 함. */

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

Page 246: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

245 Tmax C Programming Guide

#include <pthread.h>

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include <unistd.h>

#include <netdb.h>

#include <sys/types.h>

#include <usrinc/atmi.h>

#define MAX_CTID_CNT 400 /* 최대 context 수*/

#define MAX_CALL 1

#define NUM_THREADS 2 /* 한번에 생성할 스레드 수*/

#define NUM_CONTEXTS 40 /* 한 스레드에서 생성할 context 수 */

void *mythread(void *arg);

int svcCall(char* svc, char* arg);

int newContext();

int altContext(int id);

int delContext();

#define CTID_EMPTY 0

#define CTID_OCCUPIED 1

#define THRERR (void *)-1

#define THRSUC (void *)1

extern int errno;

extern int _init_wthr_flag;

int thr_id;

TPSTART_T* tpinfo;

Page 247: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 246

int main()

{

void *retVal;

char argData[100];

int tcnt = 0;

int scnt = 0;

pthread_t p_thread[NUM_THREADS];

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

strcpy(argData,"...mtmc test...");

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

{

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

return FALSE;

}

tpinfo = (TPSTART_T *)tpalloc("TPSTART", NULL, 0);

if (tpinfo == NULL)

{

printf("[THR:%d]tpinfo tpalloc fail[%d][%s]\n",pthread_self(),

tperrno,tpstrerror(tperrno));

}

#ifdef _MULTI_THREAD_TEST_

while(scnt<MAX_CALL)

{

for ( tcnt=0 ; tcnt<NUM_THREADS ; tcnt++)

{

if (pthread_create(&p_thread[tcnt], NULL, mythread, argData))

{

fprintf(stderr, "mythread start fail...[%d]\n", errno);

return FALSE;

Page 248: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

247 Tmax C Programming Guide

}

}

for(tcnt=0 ; tcnt<NUM_THREADS ; tcnt++)

{

pthread_join(p_thread[tcnt], &retVal);

}

scnt++;

sleep(1);

}

#else

if (pthread_create(&p_thread[tcnt], NULL, mythread, argData))

{

fprintf(stderr, "mythread start fail...[%d]\n", errno);

return FALSE;

}

pthread_join(p_thread[tcnt], &retVal);

#endif

tpfree((char *)tpinfo);

return TRUE;

}

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

/* Sub Process : myhread */

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

void *mythread(void *arg)

{

int i,j,k;

printf("[THR:%d] thread start\n",pthread_self());

Page 249: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 248

#ifdef _MULTI_CONTXT_TEST_

tpinfo->flags = TPMULTICONTEXTS;

for(i=0;i<NUM_CONTEXTS/2;i++)

{

j=newContext();

k=newContext();

svcCall("TOUPPER",arg);

delContext();

altContext(j);

svcCall("TOUPPER",arg);

delContext();

}

#else

tpinfo->flags = TPSINGLECONTEXT;

newContext();

svcCall("TOUPPER",arg);

delContext();

#endif

printf("[THR:%d] thread finish\n",pthread_self());

return THRSUC;

}

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

/* Sub Process : delContext */

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

int delContext()

{

int i;

Page 250: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

249 Tmax C Programming Guide

int id;

i = tpgetctxt(&id,TPNOFLAGS);

if (i < 0)

{

printf("\t[delContext]tpgetctxt fail[%d][%s]\n", tperrno,

tpstrerror(tperrno));

return -1;

}

tpend();

printf("\t[THR:%d][CTXT:%d]tpend.\n",pthread_self(),id);

return 1;

}

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

/* Sub Process : newContext */

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

int newContext()

{

int i;

int id;

i = tpstart(tpinfo);

if (i < 0)

{

printf("\t[newContext]tpstart fail[%d][%s]\n", tperrno,

tpstrerror(tperrno));

tpfree((char *)tpinfo);

return -1;

}

i = tpgetctxt(&id,TPNOFLAGS);

Page 251: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 250

if (i < 0)

{

printf("\t[newContext]tpgetctxt fail[%d][%s]\n", tperrno,

tpstrerror(tperrno));

return -1;

}

return id;

}

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

/* Sub Process : altContext */

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

int altContext(int id)

{

int i;

int ret;

ret = tpsetctxt(id, TPNOFLAGS);

if (ret < 0)

{

printf("\t[altContext]tpsetctxt fail[%d][%s]\n",

tperrno,tpstrerror(tperrno));

tpfree((char *)tpinfo);

return -1;

}

return 1;

}

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

/* Sub Process : svcCall */

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

int svcCall(char* svc, char* arg)

{

Page 252: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

251 Tmax C Programming Guide

int ret;

long rlen;

char *sbuf, *rbuf;

int id;

ret=tpgetctxt(&id,TPNOFLAGS);

sbuf = (char *)tpalloc("STRING", NULL, 0);

if (sbuf == NULL)

{

printf("\t[svrCall]tpalloc error[%d][%s]\n",tperrno,

tpstrerror(tperrno));

return -1;

}

rbuf = (char *)tpalloc("STRING", NULL, 0);

if (rbuf == NULL)

{

printf("\t[svrCall]tpalloc error[%d][%s]\n",tperrno,

tpstrerror(tperrno));

return -1;

}

strcpy(sbuf, (char *)arg);

ret = tpcall(svc, (char *)sbuf, strlen(arg), (char **)&rbuf, (long

*)&rlen, TPNOFLAGS);

if (ret < 0)

{

printf("\t[svcCall]tpcall fail.[%d][%s]\n",tperrno,

tpstrerror(tperrno));

}

else

{

printf("\t[THR:%d][CTXT:%d]tpcall success.\n",pthread_self(),id);

}

Page 253: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 252

tpfree((char *)sbuf);

tpfree((char *)rbuf);

}

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

/* END */

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

5.4.2 서버 프로그램

#include <stdio.h>

#include <usrinc/atmi.h>

TOUPPER(TPSVCINFO *msg)

{

int i;

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

printf("\tINPUT : data=%s\n", msg->data);

for (i = 0; i < msg->len; i++)

msg->data[i] = toupper(msg->data[i]);

printf("\tOUTPUT: data=%s\n", msg->data);

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

}

5.4.3 Makefile

TARGET = $(COMP_TARGET)

APOBJS = $(TARGET).o

TMAXLIBD = $(TMAXDIR)/lib64

TMAXLIBS = -lcli

Page 254: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

253 Tmax C Programming Guide

#TMAXLIBS =/home/ancestor/tmax/lib/libclid.a

#multi_thread / multi_context 일 경우

CFLAGS = -q64 -O -I$(TMAXDIR) -D_ MULTI_THREAD_TEST_ -D _MULTI_CONTXT_TEST_

#single_thread / multi_context 일 경우

CFLAGS = -q64 -O -I$(TMAXDIR) -D _MULTI_CONTXT_TEST_

LDFLAGS = -brtl

#

.SUFFIXES : .c

.c.o:

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

#

# client compile

#

$(TARGET): $(APOBJS)

$(CC) $(CFLAGS) $(LDFLAGS) -L$(TMAXLIBD) -o $(TARGET) $(APOBJS) $(TMAXLIBS)

#

clean:

-rm -f *.o core $(TARGET)

Page 255: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 254

6 Local recursive call

6.1 개요

서버에서 tpcall() 을 할 경우, 같은 서버에 존재하는 서비스일 경우에도 내부에서 recursive 하게 호출할 수 있도록 기능이 추가되었다.

이는 서버에서 multicontext 기법을 통해 tpcall() 에 한해서 local recursive call 이 가능하도록 한 것으로, 무한 루프를 방지하기 위해서 최대 depth 는 8 로 제한한다.

6.2 주의 사항

Local recursive call 을 사용하기 위해서는, 서버 프로그램 컴파일 시 반드시 CFLAGS 에 –D_MCONTEXT 를 추가해 주어야 하며, libsvr.so 대신 libsvrmc.so 서버 라이브러리를 이용해 컴파일 해 주어야 한다.

6.3 예제

<서버 프로그램>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <usrinc/atmi.h>

SVC15004_1(TPSVCINFO *msg)

{

int i;

Page 256: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

255 Tmax C Programming Guide

char *rcvbuf;

long rcvlen;

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

printf("rcvbuf tpalloc fail[%s]\n",tpstrerror(tperrno));

if (tpcall("SVC15004_2", msg->data, 0, &rcvbuf, &rcvlen, 0) == -1)

{

printf("tpcall fail [%s]\n", tpstrerror(tperrno));

tpfree((char *)rcvbuf);

tpreturn(TPFAIL, 0, 0, 0, 0);

}

strcat(rcvbuf, "_Success");

tpreturn(TPSUCCESS,0,(char *)rcvbuf, 0,0);

}

SVC15004_2(TPSVCINFO *msg)

{

int i;

char *rcvbuf;

long rcvlen;

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

printf("rcvbuf tpalloc fail \n");

}

if (tpcall("SVC15004_3", msg->data, 0, &rcvbuf, &rcvlen, 0) == -1)

{

printf("tpcall fail [%s]\n", tpstrerror(tperrno));

tpfree((char *)rcvbuf);

tpreturn(TPFAIL, 0, 0, 0, 0);

}

strcat(rcvbuf, "_Success");

tpreturn(TPSUCCESS,0,(char *)rcvbuf, 0,0);

}

SVC15004_3(TPSVCINFO *msg)

Page 257: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 256

{

int i;

char *rcvbuf;

long rcvlen;

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

printf("rcvbuf tpalloc fail \n");

if (tpcall("SVC15004_4", msg->data, 0, &rcvbuf, &rcvlen, 0) == -1)

{

printf("tpcall fail [%s]\n", tpstrerror(tperrno));

tpfree((char *)rcvbuf);

tpreturn(TPFAIL, 0, 0, 0, 0);

}

strcat(rcvbuf, "_Success");

tpreturn(TPSUCCESS,0,(char *)rcvbuf, 0,0);

}

<Makefile.c.mc>

# Server makefile

TARGET = $(COMP_TARGET)

APOBJS = $(TARGET).o

NSDLOBJ = $(TMAXDIR)/lib64/sdl.o

LIBS = -lsvrmc -lnodb

OBJS = $(APOBJS) $(SVCTOBJ)

SVCTOBJ = $(TARGET)_svctab.o

CFLAGS = -O -Ae -w +DSblended +DD64 -D_HP -I$(TMAXDIR) -D_MCONTEXT

APPDIR = $(TMAXDIR)/appbin

Page 258: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

257 Tmax C Programming Guide

SVCTDIR = $(TMAXDIR)/svct

LIBDIR = $(TMAXDIR)/lib64

#

.SUFFIXES : .c

.c.o:

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

#

# server compile

#

$(TARGET): $(OBJS)

$(CC) $(CFLAGS) -L$(LIBDIR) -o $(TARGET) $(OBJS) $(LIBS) $(NSDLOBJ)

mv $(TARGET) $(APPDIR)/.

rm -f $(OBJS)

$(APOBJS): $(TARGET).c

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

$(SVCTOBJ):

cp -f $(SVCTDIR)/$(TARGET)_svctab.c .

touch ./$(TARGET)_svctab.c

$(CC) $(CFLAGS) -c ./$(TARGET)_svctab.c

#

clean:

-rm -f *.o core $(APPDIR)/$(TARGET)

Page 259: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 258

7 TIP 을 이용한 프로그래밍

Tmax 에서는 TIP (Tmax Information Provider)를 사용하여 시스템 환경 정보, 통계 정보 확인, 시스템 운용 관리 등 다양한 기능을 수행할 수 있다.

7.1 개요

7.1.1 TIP 이란 무엇인가

TIP (Tmax Information Provider) 이란 TIPSVC 를 처리하기 위하여 Tmax 에서 제공하는 기능 프로세스로서 TIP 을 사용하여 다음의 기능을 수행할 수 있다

시스템 환경 정보 확인 : 시스템의 정적인 환경 정보를 확인할 수 있다

시스템 통계 정보 확인 : 시스템 운영 중에 각각 프로세스의 상태 등을 확인할 수 있다.

시스템 운용 관리 : 프로세스를 추가로 기동하거나 종료할 수 있다.

7.2 TIP 의 사용

7.2.1 TIP 의 구조

TIPSVC 를 처리하기 위한 별도의 기능 프로세스인 TIP 서버는 SYS_SVR 서버 타입을 가지며, TIP 서버 그룹에 속한다.

클라이언트 혹은 서버의 요청을 받은 TIP 서버는 그 요청을 CLH/TMM 에게 전달하여 처리 결과를 다시 요청자에게 돌려준다.

TIP 서버는 필드 키를 바탕으로 서비스를 처리한다. 즉, 요청하는 클라이언트나 서버는 필드 버퍼에 요구하려는 데이터를 실어 요청을 하며, 그 결과를 필드버퍼로 받는다. TIPSVC 에 요청하기 위하여 실어야 할 데이터는 다음과 같은 것들이 있다.

Page 260: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

259 Tmax C Programming Guide

7.2.1.1 조작 (TIP_OPERATION)

GET : 시스템의 정적인 환경 정보, 통계 정보의 확인, BOOT/DOWN 시스템 운용 관리 시에는 GET 으로 설정한다.

SET : 시스템 설정 상태를 변경하려고 하는 경우에 SET 으로 설정한다. 현재는 GET 만이 사용된다.

7.2.1.2 세그먼트 (TIP_SEGMENT)

어떤 기능을 수행할 지 결정하기 위하여, 이 필드를 사용한다. TIP_SEGMENT 필드에 설정할 수 있는 값으로는 다음과 같은 것들이 있다.

CONFIGURATION : 시스템 정적인 설정 정보를 확인한다.

STATISTICS : 시스템의 운영 중에 통계 정보를 확인한다.

ADMINISTRATION : 시스템 운용 관리 (BOOT/DOWN)

7.2.1.3 절 (TIP_SECTION)

TIP_SECTION 을 설정했을 경우, 어떤 항목에 대하여 처리를 할 것인지 세부 항목을 결정한다.

CONFIGURATION : DOMAIN / NODE / SVRGROUP / SERVER / SERVICE / ROUTING / RQ / GATEWAY

STATISTICS : NODE / SPR / SERVICE / RQ

ADMINISTRATION : BOOT / DOWN / CHLOG / CHTRC

7.2.1.4 명령어 (TIP_CMD)

이 필드는 TIP_SECTION 이 ADMINISTRATION 일 경우에만 사용된다.

TIP_BOOT

TIP_DOWN

Page 261: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 260

7.2.2 TIP 의 사용 방법

7.2.2.1 환경 설정

TIP 서버는 Tmax 에서 제공하는 기능 프로세스이기 때문에 사용자가 서비스를 작성할 필요가 없다. 단, 환경 파일에 TIP 서버를 등록해 주어야 한다.

등록 방법은 다음과 같다.

환경 파일의 DOMAIN 절에는 TIPSVC 를 등록한다. 등록하지 않을 경우에는 디폴트로 “TIPSVC” 가 등록이 된다. 그리고 서버 그룹절에는 TIP 서버 그룹 (SVGTYPE=TIP)을 등록하며, 서버 절에는 TIP 서버(SVRTYPE=SYS_SVR)를 등록한다.

*DOMAIN

res ..., TIPSVC = TIPSVC

*NODE

tmaxs1 ...

*SVRGROUP

tsvg ..., SVGTYPE=TIP

*SERVER

TIP SVGNAME=tsvg, SVRTYPE=SYS_SVR

7.2.2.2 시스템 접속

사용자는 Tmax 시스템 접속 시에 TPSTART_T 구조체의 usrname 항목에 .tpadmin 을 설정해야 한다. 단 TIP_SEGMENT 가 ADMINISTRATION 일 경우에만 usrname 을 설정하며, 다른 경우에는 설정하지 않아도 된다. 만약 잘못된 usrname 이 설정되었을 경우에는 TIP_ERROR 필드에 TIPEAUTH 에러가 설정된다.

strcpy(tpinfo->usrname, “.tpadmin”);

7.2.2.3 버퍼 할당

TIP 서버는 필드키를 바탕으로 서비스를 처리하므로, 요청하는 클라이언트나 서버 프로그램은 필드키 버퍼를 할당해야 한다.

Page 262: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

261 Tmax C Programming Guide

7.2.2.4 TIP 요청 항목 설정

TIP_OPERATION

TIP_SEGMENT

TIP_SECTION

TIP_CMD : TIP_SEGMENT 가 ADMINISTRATION 일 경우만 설정한다.

TIP_NODENAME : 멀티 노드일 경우만 설정하며, 단일 노드일 경우, 지정하지 않으면 디폴트로 로컬 노드가 설정된다. 잘못 설정하였을 경우 TPEINVAL 에러가 발생한다.

7.2.2.5 TIPSVC 요청

TIP 요청 항목을 설정하였다면, 설정한 필드 버퍼를 sndbuf 로 하여, tpcall 이나 tpacall 을 이용하여 TIPSVC 로 요청을 한다. 클라이언트, 서버에서 모두 요청할 수 있으며, 트랜잭션은 지원하지 않는다.

7.2.2.6 결과 수신

수신 필드키 버퍼에 서비스 결과가 저장된다.

7.2.3 에러의 확인

7.2.3.1 에러가 발생하지 않은 경우

수신 필드키 버퍼의 TIP_ERROR 항목에 0 이 설정된다.

7.2.3.2 에러가 발생한 경우

TIP_ERROR : 수신 필드키 버퍼의 TIP_ERROR 항목에 0 보다 큰 값이 설정된다. 이는 /usrinc/tip.h 에서 확인할 수 있다.

TIPNOERROR

에러가 발생하지 않음

TIPEBADFLD

Page 263: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 262

유효하지 않은 필드키가 사용되었다. 일반적으로 fdlc utility 를 사용하여 컴파일 되지 않은 필드키가 사용되었을 경우 TIP_ERROR 는 TIPEBADFLD 로 setting 된다.

TIPEIMPL

구현되지 않은 기능에 대하여 요청한 경우

TIPEAUTH

현재의 권한으로는 허용되지 않는 서비스이다.

TIPEOS

Operating System 또는 System error (메모리 할당 실패, Tmax system 에 접속 실패, 또는 network 의 상태가 불안정할 경우 등에 나타나는 에러이다

TIPENOENT

존재하지 않는 항목을 접근하는 경우에 발생한다.

TIPESVCFAIL

TIP 서비스 루틴이 에러가 발생하여 TPFAIL 로 tpreturn()을 호출하였다.

TIP_STATUS : TIP_ERROR 에 설정된 에러 내용에 대하여 상세한 에러 내용을 확인할 수 있다.

TIP_BADFIELD : 에러를 유발시킨 필드를 확인할 수 있다.

7.3 TIP 을 사용한 예제 프로그램

7.3.1 환경 파일

7.3.1.1 단일 노드

< cfg.m >

Page 264: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

263 Tmax C Programming Guide

*DOMAIN

res SHMKEY=78850, MAXUSER=200, MINCLH=1, MAXCLH=5,

TPORTNO=8850, BLOCKTIME=60, TXTIME=50, RACPORT=3355

*NODE

tmaxh4 TMAXDIR="/data1/starbj81/tmax",

APPDIR="/data1/starbj81/tmax/appbin",

PATHDIR ="/data1/starbj81/tmax/path",

TLOGDIR ="/data1/starbj81/tmax/log/tlog",

ULOGDIR="/data1/starbj81/tmax/log/ulog",

SLOGDIR="/data1/starbj81/tmax/log/slog"

*SVRGROUP

tsvg NODENAME = "tmaxh4", SVGTYPE=TIP

svg1 NODENAME = "tmaxh4"

*SERVER

TIP SVGNAME=tsvg, SVRTYPE=SYS_SVR, MIN=1, MAX=1

svr SVGNAME=svg1, MIN=1

*SERVICE

TOUPPER SVRNAME=svr

7.3.1.2 멀티 노드

< cfg.m >

*DOMAIN

tmax SHMKEY=98850,

TPORTNO=8850,

BLOCKTIME=60,

RACPORT=3355,

MAXUSER=10

*NODE

Tmaxh4 TMAXDIR="/data1/starbj81/tmax",

APPDIR="/data1/starbj81/tmax/appbin",

Page 265: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 264

PATHDIR = "/data1/starbj81/tmax/path",

TLOGDIR = "/data1/starbj81/tmax/log/tlog",

ULOGDIR="/data1/starbj81/tmax/log/ulog",

SLOGDIR="/data1/starbj81/tmax/log/slog"

tmaxh2 TMAXDIR="/data1/starbj81/tmax",

APPDIR="/data1/starbj81/tmax/appbin",

PATHDIR = "/data1/starbj81/tmax/path",

TLOGDIR = "/data1/starbj81/tmax/log/tlog",

ULOGDIR="/data1/starbj81/tmax/log/ulog",

SLOGDIR="/data1/starbj81/tmax/log/slog"

*SVRGROUP

tsvg NODENAME = "tmaxh4", SVGTYPE=TIP

svg1 NODENAME = "tmaxh4", COUSIN = "svg2"

svg2 NODENAME = "tmaxh2"

*SERVER

TIP SVGNAME=tsvg, SVRTYPE=SYS_SVR, MIN=1, MAX=1

svr SVGNAME=svg1, MIN=1, MAX=5

*SERVICE

TOUPPER SVRNAME=svr, ROUTING = "rout1"

*ROUTING

rout1 FIELD="STRING", RANGES = "'bbbbbbb'-'ccccccc' : svg1, * :

svg2

7.3.2 필드키 테이블

< tip.f >

#

# common field

#

# name number type flags comments

Page 266: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

265 Tmax C Programming Guide

*base 16000001

TIP_OPERATION 0 string

TIP_SEGMENT 1 string

TIP_SECTION 2 string

TIP_NODE 3 string

TIP_OCCURS 4 int

TIP_FLAGS 5 int

TIP_CURSOR 6 string

TIP_SESTM 7 int

TIP_ERROR 8 int

TIP_STATE 9 int

TIP_MORE 10 int

TIP_BADFIELD 11 string

TIP_CMD 12 string

TIP_CLID 13 int

TIP_MSG 14 string

#

# DOMAIN section fields

#

# name number type flags comments

*base 16000100

TIP_NAME 0 string

TIP_SHMKEY 1 int

TIP_MINCLH 2 int

TIP_MAXCLH 3 int

TIP_MAXUSER 4 int

TIP_TPORTNO 5 int

TIP_RACPORT 6 int

TIP_MAXSACALL 7 int

TIP_MAXCACALL 8 int

TIP_MAXCONV_NODE 9 int

TIP_MAXCONV_SERVER 10 int

TIP_CMTRET 11 int

TIP_BLOCKTIME 12 int

TIP_TXTIME 13 int

TIP_IDLETIME 14 int

Page 267: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 266

TIP_CLICHKINT 15 int

TIP_NLIVEINQ 16 int

TIP_SECURITY 17 string

TIP_OWNER 18 string

TIP_CPC 19 int

#TIP_LOGINSVC 20 string

#TIP_LOGOUTSVC 21 string

TIP_NCLHCHKTIME 22 int

TIP_DOMAINID 23 int

TIP_IPCPERM 24 int

TIP_MAXNODE 25 int

TIP_MAXSVG 26 int

TIP_MAXSVR 27 int

TIP_MAXSVC 28 int

TIP_MAXSPR 29 int

TIP_MAXTMS 30 int

TIP_MAXCPC 31 int

TIP_MAXROUT 32 int

TIP_MAXROUTSVG 33 int

TIP_MAXRQ 34 int

TIP_MAXGW 35 int

TIP_MAXCOUSIN 36 int

TIP_MAXCOUSINSVG 37 int

TIP_MAXBACKUP 38 int

TIP_MAXBACKUPSVG 39 int

TIP_MAXTOTALSVG 40 int

TIP_MAXPROD 41 int

TIP_MAXFUNC 42 int

TIP_TXPENDINGTIME 43 int

TIP_NO 44 int

TIP_TIPSVC 45 string

TIP_NODECOUNT 46 int

TIP_SVGCOUNT 47 int

TIP_SVRCOUNT 48 int

TIP_SVCCOUNT 49 int

TIP_COUSIN_COUNT 50 int

TIP_BACKUP_COUNT 51 int

Page 268: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

267 Tmax C Programming Guide

TIP_ROUT_COUNT 52 int

TIP_STYPE 53 string

TIP_VERSION 54 string

TIP_EXPDATE 55 string

TIP_DOMAINCOUNT 56 int

TIP_RSVG_GCOUNT 57 int

TIP_RSVG_COUNT 58 int

TIP_CSVG_GCOUNT 59 int

TIP_CSVG_COUNT 60 int

TIP_BSVG_GCOUNT 61 int

TIP_BSVG_COUNT 62 int

TIP_PROD_COUNT 63 int

TIP_FUNC_COUNT 64 int

TIP_SHMSIZE 65 int

TIP_CRYPT 66 string

TIP_DOMAIN_TMMLOGLVL 67 string

TIP_DOMAIN_CLHLOGLVL 68 string

TIP_DOMAIN_TMSLOGLVL 69 string

TIP_DOMAIN_LOGLVL 70 string

TIP_DOMAIN_MAXTHREAD 71 int

#

# NODE section fields

#

# name number type flags comments

*base 16000200

#TIP_NAME 0 string

TIP_DOMAINNAME 1 string

#TIP_SHMKEY 2 int

#TIP_MINCLH 3 int

#TIP_MAXCLH 4 int

TIP_CLHQTIMEOUT 5 int

#TIP_IDLETIME 6 int

#TIP_CLICHKINT 7 int

#TIP_TPORTNO 8 int

#TIP_TPORTNO2 9 int

#TIP_TPORTNO3 10 int

Page 269: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 268

#TIP_TPORTNO4 11 int

#TIP_TPORTNO5 12 int

#TIP_RACPORT 13 int

#TIP_TMAXPORT 14 string

TIP_CMPRPORT 15 string

TIP_CMPRSIZE 16 int

#TIP_MAXUSER 17 int

TIP_TMAXDIR 18 string

TIP_TMAXHOME 19 string

TIP_APPDIR 20 string

TIP_PATHDIR 21 string

TIP_TLOGDIR 22 string

TIP_SLOGDIR 23 string

TIP_ULOGDIR 24 string

TIP_ENVFILE 25 string

#TIP_LOGINSVC 26 string

#TIP_LOGOUTSVC 27 string

TIP_IP 28 string

#TIP_PEER 29 string

TIP_TMMOPT 30 string

TIP_CLHOPT 31 string

#TIP_IPCPERM 32 int

#TIP_MAXSVG 33 int

#TIP_MAXSVR 34 int

#TIP_MAXSPR 35 int

#TIP_MAXTMS 36 int

#TIP_MAXCPC 37 int

TIP_MAXGWSVR 38 int

TIP_MAXRQSVR 39 int

TIP_MAXGWCPC 40 int

TIP_MAXRQCPC 41 int

TIP_CPORTNO 42 int

TIP_REALSVR 43 string

TIP_RSCPC 44 int

TIP_AUTOBACKUP 45 int

TIP_HOSTNAME 46 string

TIP_NODETYPE 47 int

Page 270: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

269 Tmax C Programming Guide

TIP_CPU 48 int

#TIP_MAXRSTART 49 int

#TIP_GPERIOD 50 int

#TIP_RESTART 51 int

TIP_CURCLH 49 int

TIP_LIVECTIME 50 string

TIP_NODE_TMMLOGLVL 51 string

TIP_NODE_CLHLOGLVL 52 string

TIP_NODE_TMSLOGLVL 53 string

TIP_NODE_LOGLVL 54 string

TIP_NODE_MAXTHREAD 55 int

TIP_EXTPORT 56 int

TIP_EXTCLHPORT 57 int

#

# SVRGROUP section fields

#

# name number type flags comments

*base 16000300

#TIP_NAME 0 string

#TIP_NODENAME 1 string

TIP_SVGTYPE 2 string

#TIP_PRODNAME 3 string

TIP_COUSIN 4 string

TIP_BACKUP 5 string

TIP_LOAD 6 int

#TIP_APPDIR 7 string

#TIP_ULOGDIR 8 string

TIP_DBNAME 9 string

TIP_OPENINFO 10 string

TIP_CLOSEINFO 11 string

TIP_MINTMS 12 int

#TIP_MAXTMS 13 int

TIP_TMSNAME 14 string

#TIP_SECURITY 15 string

#TIP_OWNER 16 string

Page 271: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 270

#TIP_ENVFILE 17 string

#TIP_CPC 18 int

TIP_XAOPTION 19 string

TIP_SVG_TMSTYPE 20 string

TIP_SVG_TMSOPT 21 string

TIP_SVG_TMSTHREADS 22 int

TIP_SVG_TMSLOGLVL 23 string

TIP_SVG_LOGLVL 24 string

TIP_NODENAME 25 string

#

# SERVER section fields

#

# name number type flags comments

*base 16000350

#TIP_NAME 0 string

TIP_SVGNAME 1 string

#TIP_NODENAME 2 string

TIP_CLOPT 3 string

TIP_SEQ 4 int

TIP_MIN 5 int

TIP_MAX 6 int

#TIP_ULOGDIR 7 string

TIP_CONV 8 int

TIP_MAXQCOUNT 9 int

TIP_ASQCOUNT 10 int

TIP_MAXRSTART 11 int

TIP_GPERIOD 12 int

TIP_RESTART 13 int

TIP_SVRTYPE 14 string

#TIP_CPC 15 int

TIP_SCHEDULE 16 int

#TIP_MINTHR 17 int

#TIP_MAXTHR 18 int

TIP_TARGET 19 string

TIP_DEPEND 20 string

TIP_CASCADE 21 int

Page 272: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

271 Tmax C Programming Guide

TIP_PROCNAME 22 string

TIP_LIFESPAN 23 string

TIP_DDRI 24 string

TIP_CURSVR 25 int

TIP_SVGNO 26 int

TIP_SVR_LOGLVL 27 string

#

# SERVICE section fields

#

# name number type flags comments

*base 16000400

#TIP_NAME 0 string

TIP_SVRNAME 1 string

TIP_PRI 2 int

TIP_SVCTIME 3 int

TIP_ROUTING 4 string

TIP_EXPORT 5 int

TIP_AUTOTRAN 6 int

#

# ROUTING section fields

#

# name number type flags comments

*base 16000425

#TIP_NAME 0 string

TIP_FLDTYPE 1 string

TIP_RANGES 2 string

TIP_SUBTYPE 3 string

TIP_ELEMENT 4 string

TIP_BUFTYPE 5 string

TIP_OFFSET 6 int

TIP_FLDLEN 7 int

#TIP_FLDOFFSET 8 int

Page 273: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 272

#

# RQ section fields

#

# name number type flags comments

*base 16000450

#TIP_NAME 0 string

#TIP_SVGNAME 1 string

TIP_PRESVC 2 string

TIP_QSIZE 3 int

TIP_FILEPATH 4 string

TIP_BOOT 5 string

TIP_FSYNC 6 int

TIP_BUFFERING 7 int

#TIP_ENQSVC 8 int

#TIP_FAILINTERVAL 9 int

#TIP_FAILRETRY 10 int

#TIP_FAILSVC 11 string

#TIP_AFTERSVC 12 string

#

# GATEWAY section fields

#

# name number type flags comments

*base 16000500

#TIP_NAME 0 string

TIP_GWTYPE 1 string

TIP_PORTNO 2 int

#TIP_CPC 3 int

TIP_RGWADDR 4 string

TIP_RGWPORTNO 5 int

#TIP_BACKUP 6 string

#TIP_NODENAME 7 string

TIP_KEY 8 string

TIP_BACKUP_RGWADDR 9 string

TIP_BACKUP_RGWPORTNO 10 int

TIP_TIMEOUT 11 int

Page 274: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

273 Tmax C Programming Guide

TIP_DIRECTION 12 string

TIP_MAXINRGW 13 int

TIP_GWOWNER 15 string

TIP_RGWOWNER 16 string

TIP_RGWPASSWD 17 string

#

# FUNCTION section fields

#

# name number type flags comments

*base 16000550

#TIP_NAME 0 string

#TIP_SVRNAME 1 string

TIP_FQSTART 2 int

TIP_FQEND 3 int

TIP_ENTRY 4 string

#

# STATISTICS segment fields

#

# name number type flags comments

*base 16000600

#TIP_NAME 0 string

TIP_STATUS 1 string

TIP_STIME 2 string

TIP_TTIME 3 int

TIP_SVC_STIME 4 int

TIP_COUNT 5 int

#TIP_NO 6 int

TIP_NUM_FREE 7 int

TIP_NUM_REPLY 8 int

TIP_NUM_FAIL 9 int

TIP_NUM_REQ 10 int

TIP_ENQ_REQS 11 int

TIP_DEQ_REQS 12 int

TIP_ENQ_REPLYS 13 int

Page 275: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 274

TIP_DEQ_REPLYS 14 int

TIP_CLHNO 15 int

TIP_SVR_NAME 16 string

TIP_SVC_NAME 17 string

TIP_AVERAGE 18 float

TIP_QCOUNT 19 int

TIP_CQCOUNT 20 int

TIP_QAVERAGE 21 float

TIP_MINTIME 22 float

TIP_MAXTIME 23 float

TIP_FAIL_COUNT 24 int

TIP_ERROR_COUNT 25 int

TIP_PID 26 int

TIP_TOTAL_COUNT 27 int

TIP_TOTAL_SVCFAIL_COUNT 28 int

TIP_TOTAL_ERROR_COUNT 29 int

TIP_TOTAL_AVG 30 float

TIP_TOTAL_RUNNING_COUNT 31 int

TIP_TMS_NAME 32 string

TIP_SVG_NAME 33 string

TIP_SPRI 34 int

TIP_TI_THRI 35 int

TIP_TI_AVG 36 float

TIP_TI_XID 37 string

TIP_TI_XA_STATUS 38 string

TIP_GW_NAME 39 string

TIP_GW_NO 40 int

TIP_GW_HOSTN 41 string

TIP_GW_CTYPE 42 string

TIP_GW_CTYPE2 43 string

TIP_GW_IPADDR 44 string

TIP_GW_PORT 45 int

TIP_GW_STATUS 46 string

#

# ADMIN segment fields

#

Page 276: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

275 Tmax C Programming Guide

# name number type flags comments

*base 16000650

TIP_IPADDR 0 string

TIP_USRNAME 1 string

TIP_MODULE 2 int

TIP_LOGLVL 3 string

TIP_SPEC 4 string

#

# EXTRA flag fields

#

# name number type flags comments

*base 16000700

TIP_EXTRA_OPTION 0 int

7.3.3 클라이언트 프로그램

7.3.3.1 시스템의 환경 정보를 확인하는 프로그램

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

#include <usrinc/atmi.h>

#include <usrinc/fbuf.h>

#include <usrinc/tip.h>

#define SEC_DOMAIN 1

#define SEC_NODE 2

#define SEC_SVGROUP 3

#define SEC_SERVER 4

#define SEC_SERVICE 5

#define SEC_ROUTING 6

#define SEC_RQ 7

#define SEC_GATEWAY 8

main(int argc, char *argv[])

{

Page 277: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 276

FBUF *sndbuf, *rcvbuf;

TPSTART_T *tpinfo;

int i, n, sect;

long rcvlen;

char nodename[NAMELEN];

int pid, count = 0;

if (argc != 3) {

printf("Usage: %s section nodename\n", argv[0]);

printf("section:\n");

printf("\t1: domain\n");

printf("\t2: node\n");

printf("\t3: svrgroup\n");

printf("\t4: server\n");

printf("\t5: service\n");

printf("\t6: routing\n");

printf("\t7: rq\n");

printf("\t8: gateway\n");

exit(1);

}

if (!isdigit(argv[3][0])) {

printf("fork count must be a digit\n");

exit(1);

}

count = atoi(argv[3]);

sect = atoi(argv[1]);

if (sect < SEC_DOMAIN || sect > SEC_GATEWAY) {

printf("out of section [%d - %d]\n", SEC_DOMAIN, SEC_GATEWAY);

exit(1);

}

strncpy(nodename, argv[2], sizeof(nodename) - 1);

n = tmaxreadenv("tmax.env", "TMAX");

if (n < 0) {

Page 278: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

277 Tmax C Programming Guide

fprintf(stderr, "can't read env\n");

exit(1);

}

tpinfo = (TPSTART_T *)tpalloc("TPSTART", NULL, 0);

if (tpinfo == NULL) {

printf("tpalloc fail tperrno = %d\n", tperrno);

exit(1);

}

strcpy(tpinfo->usrname, ".tpadmin");

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

printf("tpstart fail [%s]\n", tpstrerror(tperrno));

exit(1);

}

if ((sndbuf = (FBUF *)tpalloc("FIELD", NULL, 0)) == NULL) {

printf("tpalloc failed! errno = %d\n", tperrno);

tpend();

exit(1);

}

if ((rcvbuf = (FBUF *)tpalloc("FIELD", NULL, 0)) == NULL) {

printf("tpalloc failed! errno = %d\n", tperrno);

tpend();

exit(1);

}

n = fbput(sndbuf, TIP_OPERATION, "GET", 0);

n = fbput(sndbuf, TIP_SEGMENT, "CONFIGURATION", 0);

switch (sect) {

case SEC_DOMAIN:

n = fbput(sndbuf, TIP_SECTION, "DOMAIN", 0);

break;

case SEC_NODE:

n = fbput(sndbuf, TIP_SECTION, "NODE", 0);

break;

case SEC_SVGROUP:

Page 279: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 278

n = fbput(sndbuf, TIP_SECTION, "SVGROUP", 0);

break;

case SEC_SERVER:

n = fbput(sndbuf, TIP_SECTION, "SERVER", 0);

break;

case SEC_SERVICE:

n = fbput(sndbuf, TIP_SECTION, "SERVICE", 0);

break;

case SEC_ROUTING:

n = fbput(sndbuf, TIP_SECTION, "ROUTING", 0);

break;

case SEC_RQ:

n = fbput(sndbuf, TIP_SECTION, "RQ", 0);

break;

case SEC_GATEWAY:

n = fbput(sndbuf, TIP_SECTION, "GATEWAY", 0);

break;

}

n = fbput(sndbuf, TIP_NODENAME, nodename, 0);

n = tpcall("TIPSVC", (char *)sndbuf, 0, (char **)&rcvbuf, &rcvlen,

TPNOFLAGS);

if (n < 0) {

printf("tpcall fail [%s]\n", tpstrerror(tperrno));

fbprint(rcvbuf);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

exit(1);

}

#if 1

fbprint(rcvbuf);

#endif

Page 280: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

279 Tmax C Programming Guide

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

}

<결과 (Domain Conf) >

$ client 1 tmaxh4

fkey = 217326601, fname = TIP_ERROR, type = int, value = 0

...

fkey = 485762214, fname = TIP_CRYPT, type = string, value = NO

fkey = 485762215, fname = TIP_DOMAIN_TMMLOGLVL, type = string, value =

DEBUG1

fkey = 485762216, fname = TIP_DOMAIN_CLHLOGLVL, type = string, value =

DEBUG2

fkey = 485762217, fname = TIP_DOMAIN_TMSLOGLVL, type = string, value =

DEBUG3

fkey = 485762218, fname = TIP_DOMAIN_LOGLVL, type = string, value =

DEBUG4

fkey = 217326763, fname = TIP_DOMAIN_MAXTHREAD, type = int, value = 128

7.3.3.2 시스템의 통계 정보를 확인하는 프로그램

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <usrinc/atmi.h>

#include <usrinc/fbuf.h>

#include <usrinc/tip.h>

#define SEC_NODE 1

#define SEC_TPROC 2

#define SEC_SPR 3

#define SEC_SERVICE 4

#define SEC_RQ 5

#define SEC_TMS 6

#define SEC_TMMS 7

Page 281: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 280

#define SEC_CLHS 8

#define NODE_NAME_SIZE 32

main(int argc, char *argv[])

{

FBUF *sndbuf, *rcvbuf;

TPSTART_T *tpinfo;

int i, n, sect;

long rcvlen;

char nodename[NODE_NAME_SIZE];

int stat;

if (argc != 3) {

printf("Usage: %s section node\n", argv[0]);

printf("section:\n");

printf("\t1: node\n");

printf("\t2: tproc\n");

printf("\t3: spr\n");

printf("\t4: service\n");

printf("\t5: rq\n");

printf("\t6: tms\n");

printf("\t7: tmms\n");

printf("\t8: clhs\n");

exit(1);

}

sect = atoi(argv[1]);

if (sect < SEC_NODE || sect > SEC_CLHS) {

printf("out of section [%d - %d]\n",SEC_NODE, SEC_TMMS);

exit(1);

}

memset(nodename, 0x00, NODE_NAME_SIZE);

strncpy(nodename, argv[2], NODE_NAME_SIZE - 1);

n = tmaxreadenv("tmax.env", "TMAX");

Page 282: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

281 Tmax C Programming Guide

if (n < 0) {

fprintf(stderr, "can't read env\n");

exit(1);

}

tpinfo = (TPSTART_T *)tpalloc("TPSTART", NULL, 0);

if (tpinfo == NULL) {

printf("tpalloc fail tperrno = %d\n", tperrno);

exit(1);

}

strcpy(tpinfo->dompwd, "xamt123");

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

printf("tpstart fail tperrno = %d\n", tperrno);

exit(1);

}

if ((sndbuf = (FBUF *)tpalloc("FIELD", NULL, 0)) == NULL) {

printf("tpalloc failed! errno = %d\n", tperrno);

tpend();

exit(1);

}

if ((rcvbuf = (FBUF *)tpalloc("FIELD", NULL, 0)) == NULL) {

printf("tpalloc failed! errno = %d\n", tperrno);

tpend();

exit(1);

}

n = fbput(sndbuf, TIP_OPERATION, "GET", 0);

n = fbput(sndbuf, TIP_SEGMENT, "STATISTICS", 0);

switch (sect) {

case SEC_NODE:

n = fbput(sndbuf, TIP_SECTION, "NODE", 0);

break;

case SEC_TPROC:

n = fbput(sndbuf, TIP_SECTION, "TPROC", 0);

Page 283: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 282

break;

case SEC_SPR:

n = fbput(sndbuf, TIP_SECTION, "SPR", 0);

break;

case SEC_SERVICE:

n = fbput(sndbuf, TIP_SECTION, "SERVICE", 0);

break;

case SEC_RQ:

n = fbput(sndbuf, TIP_SECTION, "RQ", 0);

break;

case SEC_TMS:

stat = 1;

n = fbput(sndbuf, TIP_SECTION, "TMS", 0);

n = fbput(sndbuf, TIP_EXTRA_OPTION, (char *)&stat, 0);

break;

case SEC_TMMS:

n = fbput(sndbuf, TIP_SECTION, "TMMS", 0);

break;

case SEC_CLHS:

n = fbput(sndbuf, TIP_SECTION, "CLHS", 0);

break;

}

n = fbput(sndbuf, TIP_NODENAME, nodename, 0);

n = tpcall("TIPSVC", (char *)sndbuf, 0, (char **)&rcvbuf,

&rcvlen, TPNOFLAGS);

if (n < 0) {

printf("tpcall fail [%s]\n", tpstrerror(tperrno));

fbprint(rcvbuf);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

exit(1);

}

fbprint(rcvbuf);

Page 284: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

283 Tmax C Programming Guide

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

}

< 결과 (TMS STATISTICS) >

$ client 3000 1 2

fkey = 217326601, fname = TIP_ERROR, type = int, value = 0

fkey = 485762680, fname = TIP_TMS_NAME, type = string, value = tms_ora2

fkey = 485762681, fname = TIP_SVG_NAME, type = string, value = xa1

fkey = 217327226, fname = TIP_SPRI, type = int, value = 0

fkey = 485762649, fname = TIP_STATUS, type = string, value = RUN

fkey = 217327197, fname = TIP_COUNT, type = int, value = 0

fkey = 351544938, fname = TIP_AVERAGE, type = float, value = 0.000000

fkey = 217327212, fname = TIP_CQCOUNT, type = int, value = 0

fkey = 217327227, fname = TIP_TI_THRI, type = int, value = 1

fkey = 351544956, fname = TIP_TI_AVG, type = float, value = 0.000000

fkey = 485762685, fname = TIP_TI_XID, type = string, value = 00000013664

fkey = 485762686, fname = TIP_TI_XA_STATUS, type = string, value = COMMIT

7.3.3.3 서버 프로세스를 추가로 기동하거나 종료시키는 프로그램

< cli.c >

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

#include <usrinc/atmi.h>

#include <usrinc/fbuf.h>

#include <usrinc/tmaxapi.h>

#include <usrinc/tip.h>

#define NODE_NAME_SIZE 32

main(int argc, char *argv[])

Page 285: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 284

{

FBUF *sndbuf, *rcvbuf;

TPSTART_T *tpinfo;

int i, n, type, clid, count, flags;

long rcvlen;

char svrname[TMAX_NAME_SIZE];

char svgname[TMAX_NAME_SIZE];

char nodename[NODE_NAME_SIZE];

int pid, forkcnt;

if (argc != 6) {

printf("Usage: %s type svrname count nodename forkcnt\n", argv[0])

;

printf("type 1: BOOT, 2: DOWN, 3: DISCON\n");

exit(1);

}

type = atoi(argv[1]);

if ((type != 1) && (type != 2) && (type != 3)) {

printf("couldn't support such a type %d\n", type);

exit(1);

}

if (strlen(argv[2]) >= TMAX_NAME_SIZE) {

printf("too large name [%s]\n", argv[1]);

exit(1);

}

strcpy(svrname, argv[2]);

count = atoi(argv[3]);

flags = 0;

strncpy(nodename, argv[4], NODE_NAME_SIZE - 1);

forkcnt = atoi(argv[5]);

n = tmaxreadenv("tmax.env", "TMAX");

if (n < 0) {

fprintf(stderr, "can't read env\n");

Page 286: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

285 Tmax C Programming Guide

exit(1);

}

tpinfo = (TPSTART_T *)tpalloc("TPSTART", NULL, 0);

if (tpinfo == NULL) {

printf("tpalloc fail tperrno = %d\n", tperrno);

exit(1);

}

strcpy(tpinfo->usrname, ".tpadmin");

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

if ((pid = fork()) < 0)

exit(1);

else if (pid == 0)

break;

}

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

printf("tpstart fail tperrno = %d\n", tperrno);

exit(1);

}

if ((sndbuf = (FBUF *)tpalloc("FIELD", NULL, 0)) == NULL) {

printf("tpalloc failed! errno = %d\n", tperrno);

tpend();

exit(1);

}

if ((rcvbuf = (FBUF *)tpalloc("FIELD", NULL, 0)) == NULL) {

printf("tpalloc failed! errno = %d\n", tperrno);

tpend();

exit(1);

}

n = fbput(sndbuf, TIP_OPERATION, "GET", 0);

n = fbput(sndbuf, TIP_SEGMENT, "ADMINISTRATION", 0);

if (type == 1)

Page 287: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 286

n = fbput(sndbuf, TIP_CMD, "BOOT", 0);

else if (type == 2)

n = fbput(sndbuf, TIP_CMD, "DOWN", 0);

else

n = fbput(sndbuf, TIP_CMD, "DISCON", 0);

if (type == 3) {

clid = count; /* at type 3 */

flags |= TIP_SFLAG;

n = fbput(sndbuf, TIP_CLID, (char *)&clid, 0);

n = fbput(sndbuf, TIP_FLAGS, (char *)&flags, 0);

} else {

flags |= TIP_SFLAG;

n = fbput(sndbuf, TIP_SVRNAME, svrname, 0);

n = fbput(sndbuf, TIP_COUNT, (char *)&count, 0);

n = fbput(sndbuf, TIP_FLAGS, (char *)&flags, 0);

}

n = fbput(sndbuf, TIP_NODENAME, nodename, 0);

n = tpcall("TIPSVC", (char *)sndbuf, 0, (char **)&rcvbuf,

&rcvlen, TPNOFLAGS);

if (n < 0) {

printf("tpcall failed! errno = %d[%s]\n", tperrno, tpstrerror(

tperrno));

fbprint(rcvbuf);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

exit(1);

}

fbprint(rcvbuf);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

Page 288: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

287 Tmax C Programming Guide

7.3.3.4 CHLOG section (로그 레벨 변경 예제)

TIP 서비스를 호출할 경우, 필드 버퍼에 아래를 설정하여 TIPSVC 를 호출한다.

TIP_OPERATION (string) : “GET” 으로 설정

TIP_SEGMENT (string) : “ADMINISTRATION” 으로 설정

TIP_SECTION (string) : “CHLOG”

TIP_MODULE (int) : 동적으로 로그를 변경하고 싶은 모듈을 설정한다. (TIP_TMM | TIP_CLH | TIP_TMS | TIP_SVR 중 하나를 선택한다)

TIP_FLAGS (int) : flags 를 설정한다. (TIP_VFLAG | TIP_GFLGA | TIP_NFLAG 중 하나를 선택한다.)

TIP_SVRNAME (string) : 해당 서버 이름을 설정한다. TIP_FLAGS 를 TIP_VFLAG 로 설정한 경우에만 설정한다.

TIP_SVGNAME (string) : 해당 서버 그룹 이름을 설정한다. TIP_FLAGS 를 TIP_GFLAG 로 설정한 경우에만 설정한다.

TIP_NODENAME (string) : 해당 노드 이름을 설정한다. TIP_FLAGS 를 TIP_NFLAG 로 설정한 경우에만 설정한다.

TIP_LOGLVL (string) : 변경하고자 하는 로그 레벨을 설정한다. (compact | basic | detail | debug1 | debug2 | debug3 | debug4 중 하나를 선택하여야 하며 반드시 소문자로 설정한다)

그 결과로 받아오는 값들은 아래와 같다.

TIP_ERROR (int) : error 값이 설정됨 TIPESVCFAIL : 해당 서비스를 제대로 처리하지 못한 경우 TIPEOS : 메모리 할당에 실패한 경우 TIPEBADFLD : TIP_MODULE 값을 설정하지 않은 경우

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

Page 289: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 288

#include <usrinc/atmi.h>

#include <usrinc/fbuf.h>

#include <usrinc/tmaxapi.h>

#include <usrinc/tip.h>

#include "../fdl/tip_fdl.h"

#define NFLAG 32

#define GFLAG 8

#define VFLAG 1024

int case_chlog(int, char *[], FBUF *);

#define NODE_NAME_SIZE 32

main(int argc, char *argv[])

{

FBUF *sndbuf, *rcvbuf;

TPSTART_T *tpinfo;

int i, ret, n, type, clid, count, flags = 0;

long rcvlen;

char svrname[TMAX_NAME_SIZE];

char svgname[TMAX_NAME_SIZE];

char nodename[NODE_NAME_SIZE];

int pid, forkcnt;

if (argc < 6) {

printf("Usage: %s svgname svrname nodename [chlogmodule] [flags]

[loglvl]\n", argv[0]);

printf("chlogmodule 1: TIP_TMM, 2: TIP_CLH, 4: TIP_TMS, 8:

TIP_SVR\n");

printf("flags 1: NFLAGS, 2: GFLAGS, 3: VFLAGS\n");

printf("loglvl : 1: compact, 2: basic, 3: detail, 4: debug1, 5:

debug2, 6: debug3, 7: debug4\n");

exit(1);

}

n = tmaxreadenv("tmax.env", "TMAX");

Page 290: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

289 Tmax C Programming Guide

if (n < 0) {

fprintf(stderr, "can't read env\n");

exit(1);

}

tpinfo = (TPSTART_T *)tpalloc("TPSTART", NULL, 0);

if (tpinfo == NULL) {

printf("tpalloc fail tperrno = %d\n", tperrno);

exit(1);

}

strcpy(tpinfo->usrname, ".tpadmin");

strcpy(svgname, argv[1]);

strcpy(svrname, argv[2]);

strncpy(nodename, argv[3], NODE_NAME_SIZE - 1);

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

printf("tpstart fail tperrno = %d\n", tperrno);

exit(1);

}

if ((sndbuf = (FBUF *)tpalloc("FIELD", NULL, 0)) == NULL) {

printf("tpalloc failed! errno = %d\n", tperrno);

tpend();

exit(1);

}

if ((rcvbuf = (FBUF *)tpalloc("FIELD", NULL, 0)) == NULL) {

printf("tpalloc failed! errno = %d\n", tperrno);

tpend();

exit(1);

}

ret = case_chlog(argc, argv, sndbuf);

n = fbput(sndbuf, TIP_OPERATION, "GET", 0);

n = fbput(sndbuf, TIP_SEGMENT, "ADMINISTRATION", 0);

Page 291: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 290

n = fbput(sndbuf, TIP_CMD, "CHLOG", 0);

n = fbput(sndbuf, TIP_NODENAME, nodename, 0);

n = fbput(sndbuf, TIP_SVGNAME, svgname , 0);

n = fbput(sndbuf, TIP_SVRNAME, svrname, 0);

n = tpcall("TIPSVC", (char *)sndbuf, 0, (char **)&rcvbuf, &rcvlen,

TPNOFLAGS);

if (n < 0) {

printf("tpcall failed! errno = %d[%s]\n", tperrno,

tpstrerror(tperrno));

fbprint(rcvbuf);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

exit(1);

}

fbprint(rcvbuf);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

}

int case_chlog(int argc2, char *argv2[], FBUF *sndbuf)

{

int chlogmdl, loglvl, flags, n=0;

char cloglvl[TMAX_NAME_SIZE];

const int true = 1, false = 0;

chlogmdl = atoi(argv2[4]);

if( (chlogmdl != 1) && (chlogmdl != 2) && (chlogmdl != 4) &&

(chlogmdl != 8)

{

printf("couldn't support such a chlogmdl\n");

exit(1);

}

Page 292: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

291 Tmax C Programming Guide

flags = atoi(argv2[5]);

if( (flags != NFLAG) && (flags != GFLAG) && (flags != VFLAG) )

{

printf("couldn't support such a flags\n");

exit(1);

}

loglvl = atoi(argv2[6]);

if( (loglvl < 1) || (loglvl > 7) )

{

printf("couldn't support such a loglvl\n");

exit(1);

}

switch (loglvl)

{

case 1 :

strcpy(cloglvl, "compact");

break;

case 2 :

strcpy(cloglvl, "basic");

break;

case 3 :

strcpy(cloglvl, "detail");

break;

case 4 :

strcpy(cloglvl, "debug1");

break;

case 5 :

strcpy(cloglvl, "debug2");

break;

case 6 :

strcpy(cloglvl, "debug3");

break;

case 7 :

strcpy(cloglvl, "debug4");

Page 293: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 292

break;

}

n = fbput(sndbuf, TIP_MODULE, (char *)&chlogmdl, 0);

n = fbput(sndbuf, TIP_FLAGS, (char *)&flags , 0);

n = fbput(sndbuf, TIP_LOGLVL, cloglvl , 0);

return 1;

}

<결과 (TIP_SVR, => DEBUG4) >

$ client xa1 svr23_stat_ins $HOSTNAME 8 1024 7

fkey = 217326601, fname = TIP_ERROR, type = int, value = 0

>>> tmadmin (cfg -v)

loglvl = DEBUG2

7.3.3.5 CHTRC section

TIP 서비스를 호출할 경우, 필드 버퍼에 아래를 설정하여 TIPSVC 를 호출한다

TIP_OPERATION (string) : “GET” 으로 설정해야 함

TIP_SEGMENT (string) : “ADMINISTRATION” 으로 설정해야 함

TIP_SECTION (string) : “CHTRC” 로 설정해야 함

TIP_FLAGS (int) : flags 를 설정한다. (TIP_PFLAG | TIP_VFLAG | TIP_GFLAG | TIP_NFLAG 중 하나를 지정한다.)

TIP_SPRI (int) : spri 를 설정한다. TIP_FLAGS 를 TIP_PFLAG 로 설정한 경우에만 설정한다.

TIP_SVRNAME (string) : 해당 서버 이름을 설정한다. TIP_FLAGS 를 TIP_VFLAG 로 설정한 경우에만 설정한다.

TIP_SVGNAME (string) : 해당 서버 그룹 이름을 설정한다. TIP_FLAGS 를 TIP_GFLAG 로 설정한 경우에만 설정한다.

TIP_NODENAME (string) : 해당 노드 이름을 설정한다. TIP_FLAGS 를 TIP_NFLAG 로 설정한 경우에만 설정한다.

Page 294: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

293 Tmax C Programming Guide

TIP_SPEC (string) : 변경하고자 하는 TMAX TRACE SPEC 을 설정한다.

그 결과로 받아오는 값들은 아래와 같다.

TIP_ERROR (int) : error 값이 설정됨 TIPESVCFAIL : 해당 서비스를 제대로 처리하지 못한 경우 TIPEOS : 메모리 할당에 실패한 경우 TIPEBADFLD : TIP_MODULE 값을 설정하지 않은 경우

Page 295: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 294

8 INDEX

Page 296: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게
Page 297: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

대화형 통신 .............................................................................................................................. 32, 91 메시지 송신(tpsend)...................................................................................................................................................................96 메시지 수신(tprecv)....................................................................................................................................................................97 시작(tpconnect)............................................................................................................................................................................93 연결 해제(tpdiscon)..................................................................................................................................................................100 예제(서버)...........................................................................................................................................................................170, 218 예제(클라이언트) .......................................................................................................................................................................169 예제(클라이언트) .......................................................................................................................................................................212 이벤트 .........................................................................................................................................................................................100 흐름도 .............................................................................................................................................................................32, 91, 211 API 요약.......................................................................................................................................................................................93

데이터 버퍼 .................................................................................................................................... 27 버퍼 타입(tptypes)......................................................................................................................................................................40 버퍼 할당(tpalloc) .......................................................................................................................................................................38 버퍼 해제(tpfree) ........................................................................................................................................................................40 종류 ...............................................................................................................................................................................................27 표준 통신형 버퍼........................................................................................................................................................................28 표준 통신형 변환(구조체 버퍼) ...............................................................................................................................................28 표준 통신형 변환(필드 버퍼) ...................................................................................................................................................29 STRING ........................................................................................................................................................................................27

동기형 통신 .................................................................................................................................... 30 서비스 요청(tpcall) .....................................................................................................................................................................41 예제(클라이언트) ............................................................................................................................... 161, 175, 182, 189, 197, 205 흐름도 .....................................................................................................................................................................................30, 43

디버깅 ........................................................................................................................................... 149 디버그 CLH.......................................................................................................................................................................157, 158 시스템 레벨 에러......................................................................................................................................................................155 API 레벨 에러...........................................................................................................................................................................150

멀티 캐스트 .......................................................................................................................... 124, 127 이벤트 가입(tpsubscribe).........................................................................................................................................................127 이벤트 가입해제(tpunsubscribe) ............................................................................................................................................130 이벤트 발생(tppost)..................................................................................................................................................................130

브로드 캐스트............................................................................................................................... 124

비동기형 통신................................................................................................................................. 31 서비스 요청(tpacall) ...................................................................................................................................................................45 서비스 응답(tpgetrply)...............................................................................................................................................................46 예제(클라이언트) .......................................................................................................................................................................164 응답 취소(tpcancel) ....................................................................................................................................................................49 흐름도 .....................................................................................................................................................................................31, 48

비요청 메시지................................................................................................................................. 49 멀티 캐스트(이벤트) .................................................................................................................................................................127 브로드 캐스트(tpbroadcast) ....................................................................................................................................................125 수신 (tpgetunsol) ........................................................................................................................................................................51

Page 298: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

1 Tmax C Programming Guide

처리방법 설정(tpinfo) ................................................................................................................................................................35 처리방법 설정(tpsetunsol_flag) ................................................................................................................................................49 클라이언트 아이디(tpsendtocli)................................................................................................................................................68 핸들러 설정 (tpsetunsol).....................................................................................................................................................50, 53

서버 프로그램 개발환경 .......................................................................................................................................................................................11 컴파일(윈도우즈) .......................................................................................................................................................................143 컴파일(RDP)...............................................................................................................................................................................123 컴파일(TCS) .................................................................................................................................................................................70 컴파일(UCS).................................................................................................................................................................................88 특징 ...............................................................................................................................................................................................13 흐름도(TCS) .................................................................................................................................................................................11 흐름도(UCS).................................................................................................................................................................................12 API 요약(TCS).............................................................................................................................................................................60 API 요약(UCS) ............................................................................................................................................................................78 TPSVCINFO 구조체 ...................................................................................................................................................................59

윈도우즈 환경............................................................................................................................... 131 컴파일 .........................................................................................................................................................................................143 tmaxmt.dll ..................................................................................................................................................................................132 WinTmax.dll ..............................................................................................................................................................................138

클라이언트 아이디 ......................................................................................................................... 67 클라이언트 아이디 검사(tpchkclid).........................................................................................................................................68 클라이언트 아이디를 얻음(tpgetclid)......................................................................................................................................67

클라이언트 프로그램 .................................................................................................................. 9, 33 개발환경 .........................................................................................................................................................................................9 컴파일 ...........................................................................................................................................................................................56 컴파일(윈도우즈) .......................................................................................................................................................................145 특징 ...............................................................................................................................................................................................10 흐름도 ...........................................................................................................................................................................................10 API 요약.......................................................................................................................................................................................33

통신 유형.......................................................................................................................................... 9 대화형 통신 .................................................................................................................................................................................32 동기형 통신 .................................................................................................................................................................................30 비동기형 통신..............................................................................................................................................................................31

트랜잭션........................................................................................................................................ 101 2PC ..........................................................................................................................................................................................9, 102 로컬 .............................................................................................................................................................................................101 롤백(tx_rollback) .......................................................................................................................................................................107 시작(tx_begin)............................................................................................................................................................................103 에러 코드(XA error) .................................................................................................................................................................113 전역 .............................................................................................................................................................................................101 정보(tx_info) ..............................................................................................................................................................................111 중첩(nested) ...............................................................................................................................................................................101

Page 299: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 2

커밋 시점(tx_set_commit_return) ..........................................................................................................................................110 커밋(tx_commot) .......................................................................................................................................................................105 타임아웃 설정(tx_set_transaction_timeout)..........................................................................................................................108 트랜잭션 모드(tx_set_transaction_control) ...........................................................................................................................110 ACID 특성 .................................................................................................................................................................................101 API 요약.....................................................................................................................................................................................102 Non-XA 모드.............................................................................................................................................................................102 XA 모드......................................................................................................................................................................................102

RDP .............................................................................................................................................. 122 컴파일 .........................................................................................................................................................................................123 환경설정 방법............................................................................................................................................................................122 환경설정 예 ...............................................................................................................................................................................123

RQ 시스템 .................................................................................................................................... 115 서비스 이름 반환(tpextsvcname)...........................................................................................................................................121 API 요약.....................................................................................................................................................................................115 RQ 메시지 반환(tpdeq) ...........................................................................................................................................................118 RQ 메시지 저장(tpenq) ...........................................................................................................................................................115 RQ 상태정보(tpqstat) ...............................................................................................................................................................120

TCS................................................................................................................................................. 59 구성 ...............................................................................................................................................................................................59 서버 종료 루틴(tpsvrdone) .......................................................................................................................................................66 서버 초기화 루틴(tpsvrinit) ......................................................................................................................................................65 서비스 완료(tpreturn) ................................................................................................................................................................61 서비스 포워딩(tpforward) .........................................................................................................................................................63 컴파일 ...........................................................................................................................................................................................70 API ................................................................................................................................................................................................60

Tmax 보안 시스템 ....................................................................................................................... 145 1단계(시스템 접속 제어) ...................................................................................................................................................35, 145 2단계(사용자 인증) .............................................................................................................................................................35, 147 3단계(서비스 접근 제어) .........................................................................................................................................................148

tmaxmt.dll...................................................................................................................................... 132 WinTmaxAcall...........................................................................................................................................................................132 WinTmaxAcall2.........................................................................................................................................................................136

tpacall........................................................................................................ 15, 31, 34, 45, 46, 87, 164

tpalloc........................................................................................................ 15, 33, 37, 38, 40, 44, 151

tpbroadcast ........................................................................................................... 17, 35, 51, 61, 125

tpcall...................................................................... 15, 31, 34, 41, 160, 175, 181, 189, 195, 205, 207

tpcancel......................................................................................................................... 15, 34, 49, 63

tpcancelctx ................................................................................................................................ 78, 84

tpchkclid .......................................................................................................................................... 68

tpconnect .................................................................................. 15, 32, 91, 93, 96, 97, 100, 168, 213

Page 300: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

3 Tmax C Programming Guide

tpdeq ....................................................................................................... 19, 116, 117, 118, 121, 153

tpdiscon................................................................................................... 15, 92, 93, 97, 99, 100, 101

tpend ........................................................... 19, 33, 36, 104, 160, 161, 163, 164, 169, 181, 195, 205

tpenq ............................................................................................................................... 19, 115, 118

tperrno......................................................... 18, 48, 62, 69, 79, 97, 99, 100, 149, 164, 175, 189, 204

TPEVCTL 구조체 ......................................................................................................................... 128

tpextsvcname.................................................................................................................. 19, 115, 121

tpforward ............................................................................................................................. 61, 63, 78

tpfree..................................................................................................... 15, 34, 40, 60, 168, 175, 189

tpgetclid........................................................................................................................................... 67

tpgetctx ........................................................................................................................................... 84

tpgetrply ................................................................................................................ 15, 31, 34, 46, 164

tpgetunsol ........................................................................................................................... 17, 34, 51

tppost ............................................................................................................................................ 130

tpqstat ............................................................................................................................. 19, 115, 120

tprecv .................................................................................................... 15, 32, 93, 97, 168, 214, 216

tpregcb ............................................................................................................................................ 87

tprelay ............................................................................................................................................. 85

tpreturn.......................................................... 16, 61, 92, 99, 100, 165, 170, 183, 184, 190, 198, 207

tpsavectx......................................................................................................................................... 83

tpschedule....................................................................................................................................... 79

tpsend ..................................................................................................... 15, 32, 92, 93, 96, 170, 214

tpsendtocli..................................................................................................................... 17, 51, 61, 68

tpset_timeout ............................................................................................................................ 19, 55

tpsetfd ............................................................................................................................................. 80

tpsetunsol...................................................................................................................... 17, 34, 50, 53

tpsetunsol_flag.................................................................................................................... 18, 34, 49

tpstart ...................................... 10, 19, 33, 34, 55, 146, 160, 163, 167, 174, 180, 188, 194, 204, 213

TPSTART_T 구조체 ....................................................................................................... 34, 125, 146

tpsubscribe.................................................................................................................................... 127

TPSVCINFO 구조체 ....................................................................................................................... 59

tpsvrdone .......................................................................................................................... 61, 66, 201

tpsvrinit...................................................................................................................................... 65, 66

Page 301: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게

Tmax C Programming Guide 4

tptypes ................................................................................................................................ 15, 34, 40

tpunregcb ........................................................................................................................................ 88

tpunsubscribe................................................................................................................................ 130

tpuschedule..................................................................................................................................... 80

tx_begin .......................................................................................... 16, 103, 175, 188, 195, 205, 213

tx_close........................................................................................................................................... 16

tx_commit........................................................................ 16, 103, 105, 175, 181, 189, 195, 205, 214

tx_info ............................................................................................................................. 16, 103, 111

tx_open ........................................................................................................................................... 16

tx_rollback....................................................................................... 16, 103, 107, 175, 189, 195, 214

tx_set_commit_return ..................................................................................................... 17, 103, 110

tx_set_transaction_control ...................................................................... 17, 103, 104, 105, 107, 110

tx_set_transaction_timeout ............................................................................................. 16, 103, 108

UCS ................................................................................................................................................ 76 구성 ...............................................................................................................................................................................................77 소켓관리(tpsetfd).........................................................................................................................................................................80 스케줄링(tpschedule)..................................................................................................................................................................79 스케줄링(tpuschedule) ...............................................................................................................................................................80 컴파일 ...........................................................................................................................................................................................88 콜백설정(tpregcb)........................................................................................................................................................................87 콜백해제(tpregcb)........................................................................................................................................................................88 포워딩(tpcancelctx) .....................................................................................................................................................................84 포워딩(tpgetctx)...........................................................................................................................................................................84 포워딩(tprelay) ............................................................................................................................................................................85 포워딩(tpsavectx) ........................................................................................................................................................................83 API ................................................................................................................................................................................................78

UCSMSGINFO 구조체 ................................................................................................................... 87

WinTmax.dll .................................................................................................................................. 138 WinTmaxEnd.............................................................................................................................................................................139 WinTmaxSend ...........................................................................................................................................................................141 WinTmaxSetContext.................................................................................................................................................................140 WinTmaxStart............................................................................................................................................................................139

WinTmaxAcall ............................................................................................................................... 132

WinTmaxAcall2 ............................................................................................................................. 136

WinTmaxEnd ................................................................................................................................ 139

WinTmaxSend .............................................................................................................................. 141

WinTmaxSetContext ..................................................................................................................... 140

WinTmaxStart ............................................................................................................................... 139

Page 302: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게
Page 303: Tmax C Programming Guide - 티맥스소프트 -TmaxSoft · 2019. 4. 9. · TCP/IP Service Gateway . Tmax C Programming Guide 2 ... Tmax FDL Refernece Manual 에 좀더 자세하게