283
Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 : Tmax 3.8 : July 2, 2003 : Sep 20, 2003

Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

Tmax C Programming Guide

Version 3.8

파트번호 : TMCP-0702-05-380

버 전 : Tmax 3.8

개 정 : July 2, 2003

인 쇄 : Sep 20, 2003

Page 2: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

1 Tmax C Programming Guide

Part Number : TMAD-0719-03-380

Last Revised : 19,July, 2002

Print :

Copyright Information

Copyright©2001 Tmax Soft Co., Ltd. All Rights Reserved.

Tmax Soft Co., Ltd

18F Glass Tower, 946-1, Daechi-Dong, Kangnam-Gu

Seoul, Korea 135-708

This software and documents are made available only under

the terms of the Tmax Soft 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

Tmax Soft Co., Ltd.

Trademark

Tmax, WebtoB, WebT, and JEUS are registered trademarks of

Tmax Soft Co., Ltd.

Page 3: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

2Tmax C Programming Guide

About This Guide

본 지침서는 개발자가 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: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

3 Tmax C Programming Guide

-- 차 례 --

I. 개발에 앞서................................................................................................................................................................ 7

1. TMAX 어플리케이션 소개 ....................................................................................................................................... 8

1.1 Tmax 어플리케이션의 구성 ............................................................................................................................. 8

1.2 Tmax 어플리케이션의 특징 ............................................................................................................................. 9

1.3 Tmax 어플리케이션의 흐름 ........................................................................................................................... 10

클라이언트 프로그램 .................................................................................................................................... 10

서버 프로그램 ................................................................................................................................................ 12

2. TMAX API ................................................................................................................................................................. 16

2.1 XATMI API 함수(atmi.h) ................................................................................................................................. 17

2.2 TX 함수(tx.h) .................................................................................................................................................... 18

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

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

3. TMAX 시스템의 데이터 버퍼................................................................................................................................ 26

3.1 데이터 버퍼의 종류 ....................................................................................................................................... 26

3.2 Tmax의 데이터 버퍼 관리 ............................................................................................................................. 27

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

4.1 동기형 통신 ..................................................................................................................................................... 31

4.2 비동기형 통신 ................................................................................................................................................. 32

4.3 대화형 통신 ..................................................................................................................................................... 33

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

1. TMAX 클라이언트 프로그램 ................................................................................................................................. 35

1.1 Tmax 클라이언트 기본 API........................................................................................................................... 35

연결 및 연결 해제 함수 .............................................................................................................................. 37

버퍼 관리 함수 .............................................................................................................................................. 41

서비스 호출 .................................................................................................................................................... 46

비요청 메시지 처리 ...................................................................................................................................... 56

타임아웃 시간 변경 ...................................................................................................................................... 62

1.2 Tmax 클라이언트 프로그램 컴파일 ............................................................................................................. 64

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

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

2. TMAX 서버 프로그램(TCS) ................................................................................................................................... 70

2.1 TCS 방식 서버 프로그램의 구성 ................................................................................................................. 70

2.2 TCS 방식 서버 프로그램 기본 API ............................................................................................................. 72

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

Page 5: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

4Tmax C Programming Guide

서버 초기화와 종료 루틴 ............................................................................................................................ 77

비요청 메시지 API ........................................................................................................................................ 80

2.3 TCS 방식 서버 프로그램 컴파일 ................................................................................................................. 84

서버 프로그램 컴파일 순서......................................................................................................................... 86

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

MKSVR 유틸리티를 이용한 컴파일 .......................................................................................................... 92

3. TMAX 서버 프로그램(UCS) ................................................................................................................................... 93

3.1 UCS 방식 서버 프로그램의 구성................................................................................................................. 93

3.2 UCS 방식 서버 프로그램 기본 API ............................................................................................................ 95

스케줄링 관련 API ........................................................................................................................................ 97

소켓 FD 관련 매크로 ................................................................................................................................... 99

서비스 포워딩 .............................................................................................................................................. 102

USERMAIN() 루틴 내에서의 비동기형 통신 ......................................................................................... 107

3.3 UCS 방식 서버 프로그램 컴파일............................................................................................................... 110

서버 프로그램 컴파일 순서....................................................................................................................... 110

MKSVR 유틸리티를 이용한 컴파일 ........................................................................................................ 112

III. TMAX 어플리케이션 개발(B) ......................................................................................................................... 113

1. 대화형 통신.......................................................................................................................................................... 114

1.1 대화형 통신의 흐름 ..................................................................................................................................... 114

1.2 대화형 통신 API ........................................................................................................................................... 115

대화형 통신 API.......................................................................................................................................... 117

대화형 통신 이벤트 .................................................................................................................................... 124

2. 트랜잭션 관리...................................................................................................................................................... 125

2.1 Tmax 시스템의 트랜잭션 관리 ................................................................................................................... 125

2.2 트랜잭션 관리 API ....................................................................................................................................... 126

2.3 트랜잭션 관련 에러 ..................................................................................................................................... 137

3. RQ 시스템............................................................................................................................................................. 139

3.1 RQ API ............................................................................................................................................................. 139

4. RDP(REALTIME DATA PROCESSOR)......................................................................................................................... 146

4.1 RDP 방식 서버 프로그램 환경설정 ........................................................................................................... 146

4.2 RDP 방식 서버 프로그램 컴파일 ............................................................................................................... 148

서버 프로그램 컴파일 순서....................................................................................................................... 148

MKSVR 유틸리티를 이용한 컴파일 ........................................................................................................ 150

5. 브로드 캐스트 / 멀티 캐스트............................................................................................................................ 151

5.1 클라이언트 정보를 활용하는 API ............................................................................................................. 151

5.2 이벤트를 활용하는 API ............................................................................................................................... 153

Page 6: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

5 Tmax C Programming Guide

6. WINDOWS 환경 프로그래밍................................................................................................................................. 158

6.1 tmaxmt.dll......................................................................................................................................................... 159

6.2 WinTmax.dll ..................................................................................................................................................... 166

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

7. TMAX 보안 시스템 ............................................................................................................................................... 174

7.1 1단계 보안: 시스템 접속 제어 ................................................................................................................... 174

7.2 2단계 보안: 사용자 인증 ............................................................................................................................. 176

7.3 3단계 보안: 서비스 접근 제어 ................................................................................................................... 178

8. 디버깅 ................................................................................................................................................................... 180

8.1 API 레벨 에러 처리 ...................................................................................................................................... 180

8.2 시스템 레벨 에러 처리(Uunix.h) ................................................................................................................ 184

8.3 디버그 CLH ................................................................................................................................................... 186

8.4 디버그 라이브러리 ....................................................................................................................................... 187

IV. TMAX 어플리케이션 예제 ............................................................................................................................... 188

1. 기초 프로그램...................................................................................................................................................... 189

1.1 동기형 통신 ................................................................................................................................................... 189

1.2 비동기형 통신 ............................................................................................................................................... 194

1.3 대화형 통신 ................................................................................................................................................... 199

2. DB 적용 프로그램 ............................................................................................................................................... 207

2.1 오라클 Insert 프로그램 ................................................................................................................................ 207

2.2 오라클 Select 프로그램................................................................................................................................ 213

2.3 인포믹스 Insert 프로그램 ............................................................................................................................ 222

2.4 인포믹스 Select 프로그램............................................................................................................................ 229

3. 응용 프로그램...................................................................................................................................................... 239

3.1 글로벌 트랜잭션 처리 프로그램................................................................................................................ 239

3.2 대화형 모드를 이용한 DB 사용 ................................................................................................................ 251

V. TMAX CLIENT MULTITHREAD / MULTICONTEXT.................................................................................. 262

1. 개요 ....................................................................................................................................................................... 263

1.1 Multithread 프로그램이란 무엇인가............................................................................................................ 263

1.2 Multicontext 프로그램이란 무엇인가. ......................................................................................................... 264

1.3 Tmax의 Multithread/Multicontext 지원사항................................................................................................. 264

2. MULTITHREAD/MULTICONTEXT 구현 ..................................................................................................................... 265

2.1 Multithread/Multicontext 시작 구문 .............................................................................................................. 265

2.2 Multithread/Multicontext 구현 구문 .............................................................................................................. 265

2.2.1 동기형 통신 ........................................................................................................................................ 266

2.2.2 비동기형 통신 .................................................................................................................................... 266

Page 7: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

6Tmax C Programming Guide

2.2.3 TRANSACTION ................................................................................................................................... 266

2.3 Multithread/Multicontext 종료 구문 .............................................................................................................. 266

3. MULTITHREAD/MULTICONTEXT API ....................................................................................................................... 267

3.1 tpgetctxt ............................................................................................................................................................ 267

3.2 tpsetctxt............................................................................................................................................................. 268

3.예제 ............................................................................................................................................................................. 269

VI. INDEX.................................................................................................................................................................. 277

Page 8: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

7 Tmax C Programming Guide

I. 개발에 앞서

1장 에서는 어플리케이션 개발에 앞서 간단히 Tmax 시스템을 이용하여 개

발된 어플리케이션의 대약적인 흐름을 소개하며 이를 통해 얻어지는 장점

을 설명한다.

Tmax 어플리케이션 소개

Tmax API

Tmax 시스템의 데이터 버퍼

Tmax 시스템의 통신 유형

Page 9: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

8Tmax C Programming Guide

1. Tmax 어플리케이션 소개

Tmax 시스템은 기본적으로 서버/클라이언트 구조의 서비스 형태에 있어

서버측에는 관리와 개발을 용이하게 하고 클라이언트는 안정적인 서비스를

보장하기 위한 미들웨어로써 현재까지 공공, 금융, 통신, 교육, 군수관리 등

다양한 방면에서 그 안정성과 편리함을 인정받아 왔다.

여기 에서는 어플리케이션 개발에 앞서 Tmax 를 이용한 개발의 특징을 알

아보며 Tmax 어플리케이션의 대략적인 흐름을 이해하도록 한다.

1.1 Tmax 어플리케이션의 구성

클라이언트 프로그램

클라이언트 프로그램은 서비스를 요청하고, 그 요청에 대한 응답을 서버에서 받아

사용자가 원하는 형식으로 결과를 전달하는 역할을 한다. 클라이언트 프로그램은 사

용자 환경 파일의 환경 변수를 참조하여 Tmax 시스템에 접속하며 구조체 버퍼 혹은

필드 버퍼를 사용할 경우 각각에 해당되는 바이너리 파일을 참조한다.

서버프로그램

서버프로그램은 클라이언트의 요청을 받아서 처리하여 적절한 응답을 만드는 역할을

하는 프로그램이다. 서버 프로그램은 Tmax 시스템에서 main() 루틴을 관리하며 개

발자는 서비스 루틴만을 작성하면 된다. 서비스 루틴은 Tmax의 유틸리티를 통해 생

성되는 각각의 서비스 테이블과 같이 컴파일 하며 구조체 버퍼를 사용하는 경우 역

시 유틸리티를 사용하여 얻어지는 컨버전 루틴도 같이 사용하여야 한다.

Page 10: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

9 Tmax C Programming Guide

1.2 Tmax 어플리케이션의 특징

네트웍을 제어하는 루틴은 Tmax API를 사용하며 이 API들은 분산처

리 국제 표준(X/Open DTP model)을 준수한다. 즉 규격을 준수하는

다른 미들웨어로 개발된 프로그램도 별다른 수정없이 사용할 수 있다.

서버프로그램 개발시 클라이언트의 요청을 처리하는 순수한 서비스 루

틴 만을 작성한다. 클라이언트는 일반적인 C 언어 형식대로 프로그램

(내부에 main() 루틴을 포함)을 개발한다.

다양한 통신 유형을 제공한다(동기형, 비동기형, 대화형)

동기형은 서비스를 요청하고 응답이 올 때까지 기다리며 비동기 통신

은 서비스를 요청하고 원하는 시기에 응답을 받을 수 있다. 대화형 통

신은 처음 연결을 설정한뒤 메시지를 주고 받으면서 서비스를 처리한

다. 각각의 통신을 위한 API를 제공하여 복잡한 프로토콜의 처리 없이

쉽게 프로그램 개발이 가능하다.

다양한 버퍼를 사용할 수 있다.

타기종간에 데이터 통신을 할 때 개발자는 데이터 무결성을 보장하는

데 어려움을 겪는다. 하지만 Tmax에서는 일곱 가지 유형의 표준 버퍼

타입을 지원하여 이러한 문제를 해결하며 개발자에게 선택의 폭을 넓

혀준다.

원하는 서비스가 위치하는 정확한 서버의 주소를 몰라도 서비스를 요

청할 수 있다.

트랜잭션 처리의 무결성을 제공한다. 프로그램에서는 트랜잭션의 범위

만을 설정하면 Tmax는 2PC (two-phase commit)방식으로 데이터의

무결성을 제공한다.

Page 11: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

10Tmax C Programming Guide

1.3 Tmax 어플리케이션의 흐름

클라이언트 프로그램

사용자의 요청을 받아서 서버에 전달하고 서버에서 처리된 결과를 받아서

사용자에게 보여주는 역할을 하는 프로그램이다. 클라이언트는 세가지 통신

유형을 따라 서버로부터 결과를 받아오게 된다.

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 클라이언트 프로그램의 흐름

1

2

3

4

5

6

7

8

9

main() {

tpstart_t 버퍼 할당 및 초기화. Tmax 시스템 접속. 송/수신 데이터 버퍼 할당. 송신 메시지 Buffer에 유저의 요청 입력. 송신 메시지 Buffer를 서버에 보냄(서비스 요청). 서버로부터 응답을 송신 메시지 Buffer로 받음. 원하는 형태로 출력 송/수신 메시지 Buffer 제거 Tmax 연결해제

}

Page 12: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

11 Tmax C Programming Guide

1,2 :

클라이언트는 제일 먼저 Tmax 시스템에 연결한다. tpstart() 는 환경변수(Tmax 시스

템의 주소와 포트 번호)를 읽어서 연결을 설정하며, 연결시 보안등의 이유로 클라이

언트의 정보를 넘길 필요가 있을 경우 tpstart_t 버퍼를 할당하여 사용한다.

3 :

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

4, 5:

사용자가 원하는 데이터를 앞서 할당한 버퍼에 입력하고 서비스를 요청한다. 동기,

비동기 및 대화형 통신 방법을 사용한다.

6, 7 :

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

8, 9 :

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

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

Tmax에서는 통신 네트워크, Buffer 관리를 위한 함수들을 제공하여 응용 프로그램

개발을 용이하게 한다. 이 함수들은 라이브러리 형태로 제공되고 응용프로그램과 같

이 컴파일 된다.

개발자는 어느 머신의 어느 서버에서 무슨 서비스를 제공하는지 관여하지 않아도 프

로그램을 개발할 수 있다.

Page 13: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

12Tmax C Programming Guide

서버 프로그램

사용자의 요청을 받아서 처리하고 그 응답을 클라이언트에게 반환하는 프

로그램이다. 일반적인 서버 프로그램인 TCS 방식의 경우 서비스 루틴 안에

서 모든 처리가 일어나지만 UCS 방식 서버 프로그램의 경우는 서비스 루

틴과 usermain() 을 적절히 사용하여 기존에는 구현하기 힘들었던 다양한

방식의 서비스를 제공할 수 있다.

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

Tmax 응용 서버프로그램의 O/S 환경은 하드웨어와는 무관한 모든 UNIX 기종을 지

원한다. 유닉스 표준 편집기 vi로 개발이 가능하다.

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

Tmax 에서 관리하는 main() 루틴 에서는 명령어 라인에 입력된 인수 처리, 필요할

경우 데이터베이스와의 연결과 해제 작업이 이루어지며 서비스 루틴에서 사용하는

TPSVCINFO 구조체 버퍼를 할당하고 관리한다. TMM, CLH로 부터 전해지는 메시지

를 기다리며 서비스 요청이 오면 데이터를 받아 서비스 루틴을 호출하여 실제 서비

스가 이루어지도록 한다.

서비스 루틴은 클라이언트의 요청을 처리한다. main() 에서는 클라이언트에게 받은

서비스 요청을 여러가지 정보와 함께 TPSVCINFO 구조체에 넣어 서비스 루틴에 넘

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

Page 14: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

13 Tmax C Programming Guide

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

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

UCS 방식 서버 프로그램도 TCS 방식과 유사하며 추가적으로 usermain() 루틴을 갖

고 있다. UCS 방식의 usermain() 루틴은 다른 명령이 없는 동안 독자적으로 반복적

인 작업을 수행하며 스케줄링 API 를 사용하여 CLH 나 TMM 으로부터 오는 명령들

을 처리해준다.

Page 15: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

14Tmax C Programming Guide

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

Page 16: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

15 Tmax C Programming Guide

Tmax 서버 프로그램의 특징

Tmax 응용 서버프로그램은 Tmax에서 관리하는 main() 루틴과 개발자가 작성한 서

비스 루틴으로 구성된다. 서버 프로그램은 응용 클라이언트 프로그램처럼 Tmax API

를 이용하여 작성된다. 이 함수들은 라이브러리(libsvr.a libsvr.so)로 제공되며 응용

서버프로그램과 같이 컴파일된다. 프로그래머는 서비스 루틴만을 개발하면 된다.

서버 프로그램은 하나 이상의 서비스로 이루어 지며 한 프로그램 내에서 다른 서버

프로그램의 서비스를 요청할 수도 있다. 클라이언트의 정보와 결과를 모두 보내어

클라이언트의 관리를 넘길 수도 있다.

통신 및 데이터 변환에 있어 사용이 간단한 Tmax API 를 제공하므로 개발자는 따로

프로토콜을 만들거나 복잡한 네트웍 프로그래밍에 대한 지식이 필요가 없어진다. 이

는 상당한 개발 및 검증 기간의 단축으로 이어진다.

XA모드의 경우 데이터베이스 연결과 해제가 Tmax가 관리하는 루틴에서 이뤄지므로

개발자는 DB 연결과 관리에 대해 신경 쓰지 않아도 된다.

Page 17: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

16Tmax C Programming Guide

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 18: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

17 Tmax C Programming Guide

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() 대화형 모드로 서비스와 연결을 설정한다.

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

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

대화형 함수

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

서비스 종료

관련 함수 tpreturn()

서비스 요청에 대한 응답을 클라이언트에게 보내고 서비

스 루틴을 종료한다.

표1-1. XATMI API Functions

Page 19: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

18Tmax C Programming Guide

2.2 TX 함수(tx.h)

TX는 응용프로그램과 Tmax간의 인터페이스로서 트랜잭션 범위를 설정하고 트랜잭션을 수

행한다. 이 API 들은 X/Open DTP 표준을 준수한다.

함 수 함수 이름 기 능

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

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

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

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

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

됨).

tx_set_transaction_time

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

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

tx_set_commit_return() 전역(global) 트랜잭션의 승인시점을 지정한다.

트랜잭션

관리함수

tx_set_transaction_cont

rol()

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

시작한다.

표1-2. TX Functions

Page 20: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

19 Tmax C Programming Guide

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

비표준 API는 다양한 어플리케이션 개발을 위한 Tmax 고유의 API들로 UCS, RQ, 비요청

데이터 처리, 사용자 로그등 다양한 기능을 제공한다.

함 수 함수 이름 기 능

tpbroadcast()

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

라이언트 혹은 특정 클라이언트에게 일방적으로 비

요청 데이터를 송신한다.

tpsendtocli() Tmax 시스템에 연결된 특정 클라이언트에게 일방적

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

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

이터를 송신한다.

tpsetunsol() 비요청 데이터를 처리하는 함수를 지정한다.

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

tpsetunsol_flag() 알림 메시지를 수락하는 플래그를 설정한다.

비요청

데이터

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

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

userlog()

지정된 메시지를 ulog파일에 기록한다. ulog파일은

Tmax 시스템 환경 파일에 지정된 ULOGDIR에 생

성된다.

ulogsync() 메모리 Buffer에 있는 ‘ulog’ 내용을 디스크에 저장

한다.

에러 관련 함

UserLog() userlog() + ulogsync()

Page 21: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

20Tmax C Programming Guide

함 수 함수 이름 기 능

gettperrno() Tmax 시스템 호출에서 발생한 에러넘버(tperrno)

를 반환한다.

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

tperrordetail() 시스템 호출에서 발생한 에러에 관한 세부적인 정보

를 얻는다.

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

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

련 함수

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

블록 타임 아

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

장애 대책 함

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

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

연결 함수

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

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

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

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

RQ

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

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

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

Environment

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

Page 22: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

21 Tmax C Programming Guide

함 수 함수 이름 기 능

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

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

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

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

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

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

다.

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

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

tpschedule() UCS유형의 프로세스에서 TCS채널을 검사한다.

기 타

tpuschedule() UCS유형의 프로세스에서 TCS채널을 검사한다.

표1-3. Non-Standard API Functions

Page 23: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

22Tmax C Programming Guide

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

필드 버퍼는 Tmax가 제공하는 버퍼 타입중 하나로 필드키와 데이터 값을 쌍으로 관리

하여 유동적인 데이터 처리에 적합하다. 자세한 설명은 Tmax FDL Reference Manual 를

참조한다.

함 수 함수 이름 기 능

fbget_fldkey() 필드이름에 대한 필드키(fieldkey) 값을 반환한다.

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

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

fbget_fldtype() 필드키로부터 필드형(type)을 가져온다.(정수값 리턴)

필드키

사상 함수

fbget_strfldtype() 필드키로부터 형(type)에 대한 포인트 값을 가져온다.

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

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

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

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

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

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

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

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

반환한다.

Buffer

할당 함수

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

fbput()

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

사용된다.

Page 24: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

23 Tmax C Programming Guide

함 수 함수 이름 기 능

fbinsert() 필드 버퍼에 있는 필드키의 필드 값을 지정된 필드키

와 포지션에 저장한다.

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

동한다.

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

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

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

모든 내용을 지운다.

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

fbgetf() 필드 버퍼에 있는 지정된 필드키의 필드 값을 얻는다.

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

fbnext_tu() 필드 버퍼에서 지정된 필드키의 필드 값을 연속적으로

얻는다.

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

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

fbgetval_last_tu() 필드 버퍼에서 지정한 필드키에 있는 필드 데이터 중

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

fbgetlast_tu() 필드 버퍼에서 지정한 필드키의 마지막 순번의 데이터

를 리턴한다.

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

fbfldcount() 지정된 버퍼안에 포함된 필드 개수를 반환한다.

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

필드 접근

수정 함수

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

한다.

Page 25: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

24Tmax C Programming Guide

함 수 함수 이름 기 능

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

턴한다.

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

fbupdate() 필드 버퍼에 있는 필드키의 필드 값을 지정된 순번에

갱신한다.

fbgetlen() 필드버퍼의 선택된 필드키에 맞는 필드 데이터의 첫

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

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

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

붙여 준다.

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

드키의 타입을 지정한다.

fbgetalloc_tut() 리턴된 데이터를 정의된 데이터 타입으로 변환하여 저

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

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

fbgetvali() 어느 필드 데이터이든지 정수형으로 리턴한다.

fbgetvals() 어느 필드 데이터이든지 문자형으로 리턴한다.

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

문자형으로 리턴한다.

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

변환 함수

fbchg_tut() 필드키의 값을 필드 버퍼에 있는 다른 정의된 시작 순

번에 있는 것과 바꾼다.

fbbufop() 두 필드 버퍼의 내용을 비교, 복사, 이동, 변경한다. 버퍼 조작

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

Page 26: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

25 Tmax C Programming Guide

함 수 함수 이름 기 능

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

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

fbwrite() 파일에 적는다.

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

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

I / O

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

출력

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

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

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

써넣지 않는다.

fbftos() 필드 버퍼에 저장된 데이터를 C 구조체(stname)에 전

송한다.

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

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

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

조체의 멤버 변수가 NULL인지 확인

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

NULL로 초기화

기 타

fbstinit() 필드 버퍼에 위치한 C 구조체를 NULL로 초기화한다.

표1-4. FIELD Buffer Functions

Page 27: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

26Tmax C Programming Guide

3. Tmax 시스템의 데이터 버퍼

다수의 서버를 운영하면서 서로 다른 하드웨어 및 운영체제 간에 데이터를

교환할 필요가 있을 경우 플랫폼마다 메모리 할당 방식의 차이로 생기는

문제점을 극복하기 위해서는 모든 플랫폼에 대한 상세한 지식과 더불어 데

이터를 전환하는 복잡한 과정이 필요하다. Tmax는 다양한 종류의 표준 버

퍼를 제공하여 이러한 문제를 해결하며 불필요한 네트웍 부하를 줄이고 개

발자의 선택의 폭을 넓히며 개발기간을 단축하는 등의 부가적인 장점이 있

다.

3.1 데이터 버퍼의 종류

STRING 버퍼

널 값으로 끝나는 문자열로써 따로 버퍼의 길이를 명시할 필요가 없다.

플랫폼의 차이로 인한 문제는 발생하지 않는다.

CARRAY , X_OCTET 버퍼

길이가 지정된 바이트열로써 보통 바이너리 타입의 데이터를 보낼 때 사

용되며 데이터 교환시에는 반드시 길이를 명시해야 한다. 플랫폼의 차이

로 인한 문제는 발생하지 않는다.

STRUCT , X_C_TYPE 버퍼

C 언어의 구조체를 데이터 통신에 사용하고자 할때 사용한다. 구조체의

Page 28: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

27 Tmax C Programming Guide

멤버로는 모든 원시 타입을 사용할 수 있으며 선언된 구조체 자체도 멤버

로 사용할 수 있다. 또한 구조체의 배열도 사용할 수 있다.

X_COMMON 버퍼

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

필드 버퍼

필드키와 데이터 값을 한쌍으로 관리하는 데이터 버퍼로 모든 원시 타입

의 데이터를 담을 수 있다. 교환되는 데이터형이 유동적일 경우 사용하며

다양한 방법의 데이터 접근 및 변환 API를 제공한다.

3.2 Tmax의 데이터 버퍼 관리

Tmax는 버퍼의 무결성을 보장하기 위해 표준 통신형 버퍼를 사용한다. 표

준 통신형 버퍼는 통신 이전에 데이터 타입과 메모리 할당 방식에 기준을

정하여 사용하는 것이다. 데이터를 송신하기 전에 로컬 버퍼의 데이터를 표

준 통신형 버퍼로 변환하여 보내면 이를 수신한 측은 다시 해당 테이블을

참조하여 역변환할 수 있다.

이러한 과정을 통해 이기종간의 통신시에도 문자열이나 바이트열 뿐만 아

니라 플랫폼마다 다른 원시 타입의 데이터형을 사용하는 구조체 버퍼나 필

드 버퍼를 아무런 제약 없이 사용할 수 있게 된다.

Page 29: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

28Tmax C Programming Guide

구조체 버퍼

개발자는 사용하고자 하는 구조체를 구조체 파일(xxx.s) 파일에 기록하며 이 파일은

변환 테이블과 변환 프로그램을 만드는 기반이 된다. 구조체 파일에는 typdef 나

include 와 같은 명령어는 사용할 수 없으며 구조체의 멤버는 모든 원시 타입 데이

터와 구조체를 사용할 수 있다.

구조체 버퍼를 표준 통신형으로 사용하기 위해서는 Tmax에서 제공하는 sdlc 프로그

램을 사용하여 표준 통신형 데이터로의 변환을 위한 정보 테이블과 표준 통신형 변

환/역변환 프로그램을 생성해야 한다. 변환/역변환 프로그램은 개발된 서비스 루틴과

함께 컴파일하여 사용하며 정보 테이블은 구조체 사용시 자동으로 사용된다.

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

컴파일 순서이다.

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

Page 30: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

29 Tmax C Programming Guide

필드 버퍼

개발자는 사용하고자 하는 필드 버퍼를 필드 버퍼 파일(xxx.f) 파일에 기록하며 이

파일은 변환 테이블을 만드는 기반이 된다.

필드 버퍼를 표준 통신형으로 사용하기 위해서는 Tmax에서 제공하는 fdlc 프로그램

을 사용하여 정보 테이블을 생성하며 이 테이블은 필드버퍼 사용시 자동적으로 사용

된다.

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

컴파일 순서이다.

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

Page 31: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

30Tmax C Programming Guide

4. Tmax 시스템의 통신 유형

통신 유형이란 서버와 클라이언트가 데이터를 주고 받는 방법이다. 클라이

언트와 서버가 구현하는 로직의 배분이나 방법에 따라 사용자는 크게 세가

지의 방법을 사용할 수 있다. 첫번째는 동기형으로써 클라이언트는 서버가

응답을 줄때까지 기다린다. 두번째는 비동기형으로써 클라이언트는 서비스

를 요청한 후 원하는 시점에 응답을 받을 수 있다. 세번째는 대화형으로써

클라이언트는 한번 서버에 연결하면 이벤트에 적절히 대응하며 데이터를

주고 받을수 있다.

동기형과 비동기형은 클라이언트가 메시지를 받는 방법을 기준으로 구분한

것으로 서버 프로그램측에서 볼때 서로 다른점은 없다. 그러나 대화형 통신

일 경우 서버와 클라이언트 프로그램은 프로토콜을 따라 메시지를 주고 받

으므로 서로 긴밀하게 개발되어야 할 필요가 있다.

Page 32: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

31 Tmax C Programming Guide

4.1 동기형 통신

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

응답을 기다린다.

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

그림 1-5. 동기형 통신 모델

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

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

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

Page 33: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

32Tmax C Programming Guide

4.2 비동기형 통신

비동기형 통신은 클라이언트가 서비스를 요청하고 응답을 받고자 할 때 해

당 요청에 대한 응답을 받는다. 클라이언트는 그 시간 동안 다른 작업을 수

행 할 수 있다.

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

그림 1-6. 비동기형 통신 모델

- 클라이언트는 tpacall() API를 이용하여 서비스를 요청한다. 이때 리턴되는 cd 값으로 해

당 요청에 대한 응답을 구별할 수 있으므로 여러번 호출하는 것도 가능하다.

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

는다.

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

한다.

Page 34: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

33 Tmax C Programming Guide

4.3 대화형 통신

대화형 통신은 클라이언트와 서버가 연결을 설정하고 이벤트값을 이용하여

데이터의 송/수신측을 결정하며 이로써 지속적으로 데이터를 주고 받는다.

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

그림 1-7. 대화형 통신 모델

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

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

을 사용한다.

- 데이터 송신의 주체는 플래그를 이용하여 결정하며 이 플래그 값에 의해 발생하는 이

벤트에 따라 적절히 대응해 주어야 한다.

Page 35: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

34Tmax C Programming Guide

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

2장 에서는 실제 어플리케이션 개발에 앞서 가장 기본적인 API의 사용법과

간단한 예제를 제시하며 개발된 프로그램을 컴파일 하여 실행파일을 만드

는 과정을 설명한다.

Tmax 클라이언트 프로그램

Tmax 서버 프로그램(TCS)

Tmax 서버 프로그램(UCS)

Page 36: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

35 Tmax C Programming Guide

1. Tmax 클라이언트 프로그램

클라이언트 프로그램은 사용자의 요청을 받아 Tmax 시스템에 서비스를 요

청하고 받은 결과를 다시 사용자에게 보여주는 역할을 한다. Tmax 의 클라

이언트 API는 복잡한 네트웍 프로그래밍을 간단하게 처리해 주므로 개발자

의 부담을 줄여주며 프리젠테이션 로직에만 전념할 수 있도록 한다.

1.1 Tmax 클라이언트 기본 API

아래는 클라이언트에서 사용할 수 있는 API 중 기본적인 것만을 요약한 것

이다. API들에 대한 상세한 설명은 Tmax Reference Manul 을 참고하도록

한다.

함 수 이 름 기 능

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

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

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

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

함수

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

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

서비스 요청

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

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

Page 37: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

36Tmax C Programming Guide

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

함수

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

tpsetunsol_fl

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

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

비요청 메시

지 처리 함수

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

표 2-1 클라이언트 기본 API

Page 38: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

37 Tmax C Programming Guide

연결 및 연결 해제 함수

Tmax 시스템과의 연결과 연결 해제를 위한 API 들을 소개한다. 몇몇 API들은

Tmax 와 연결이 되어 있지 않을 경우 내부적으로 접속을 시도하므로 반드시

Tmax 와 연결을 맺은후 다른 API 를 사용할 것을 권장한다.

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

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

Page 39: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

38Tmax C Programming Guide

Tmax 시스템에 접속하는 API 이다. 클라이언트는 서비스 요청이나 비요청 메시지 핸들러를 설

정하기 전에 Tmax 시스템에 접속된 상태이어야 하며 그렇지 않은 상태에서 서비스를 요청하거

나 비요청 메시지 핸들러를 설정하는 경우 자동적으로 라이브러리 내부에서 tpstart(NULL) 를

수행하게 된다. tpstart() 는 Tmax 시스템에 클라이언트의 정보를 넣어서 넘길 수 있다.

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 헤더 파일에 선언되어 있다.

Page 40: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

39 Tmax C Programming Guide

tpend

int tpend (void)

인수 없음

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

롤백된다.

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>

Page 41: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

40Tmax C Programming Guide

main()

{

TPSTART_T *tpinfo;

/* TPSTART Buffer 할당 */

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

== NULL){

error processing routine

}

/* TPSTART_T 구조체 항목 */

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

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

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

/* Tmax 시스템에 접속 */

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

error processing routine

}

. . . . .

tpend( ) ;

}

Page 42: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

41 Tmax C Programming Guide

버퍼 관리 함수

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로 지정된다.

Tmax 시스템과의 통신을 위한 버퍼를 할당한다. 송신 및 수신을 위한 모든 버퍼는 tpalloc() 을

통해 할당되어야 한다. 호출이 성공하면 char 타입의 포인터를 반환한다. 따라서 STRING,

CARRAY, X_OCTET 이외의 타입 버퍼는 적절한 형변환을 해주어야 한다. 호출이 실패하면 NULL

포인터를 반환한다. 에러는 지정되지 않은 버퍼타입을 사용하거나 구조체형 버퍼 사용시 존재하지

않는 subtype 을 지정했을 경우에 주로 발생한다.

Page 43: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

42Tmax C Programming Guide

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

char *data;

. . .

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

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

Ex 4)

. . .

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

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

== NULL){

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

exit(0) ;

}

strdata->id = cltid;

Page 44: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

43 Tmax C Programming Guide

strdata->passwd = cltpasswd;

strcpy(strdata->msg, cltmsg);

...

Ex5)

....

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

...

Page 45: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

44Tmax C Programming Guide

tpfree

void tpfree (char *bufptr)

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

Page 46: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

45 Tmax C Programming Guide

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

. . .

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

. . .

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

Page 47: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

46Tmax C Programming Guide

서비스 호출

할당한 버퍼를 이용하여 실제 서비스를 요청하고 결과값을 받아오는 기본적인

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가

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

TPNOTRAN 호출 시점이 트랜잭션 영역일 경우 호출로 인한 결과를

트랜잭션 범주에서 제외한다.

Page 48: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

47 Tmax C Programming Guide

TPNOCHANGE

서비스 호출 결과로 받아온 데이터 타입이 rbuf 의 타입과

다를 경우 형변환이 일어나는데 TPNOCHANGE 플래그를

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

TPNOTIME

클라이언트 혹은 서버측이 설정한 블록 타입아웃 시간을

무시하고 결과값을 받을때까지 기다린다. 그러나 트랜잭션

영역에서 호출했다면 트랜잭션 타임아웃 시간은 그대로

적용된다.

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때 사용한다.

개발자가 시그널을 사용할 경우 시스템 함수 호출 도중에

시그널이 발생하면 시스템 함수 호출은 중단되고 해당 API

는 TPGOTSIG 에러를 리턴하지만 TPSIGRSTRT 플래그를

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

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

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

는 API이다.

그림 2-1. 동기형 통신

sbuf 와 rbuf 는 데이터를 주고 받을 버퍼에 대한 포인터로써 반드시 tpalloc() 으로 할당되어야

한다. 하나의 버퍼로 데이터를 주고 받을수도 있으며 이경우 응답 버퍼(rbuf)는 보내는 버퍼와

동일하게 설정한다. 즉 (char **)&sbuf 와 같이 지정해야 한다.

slen 은 보낼 버퍼 (sbuf)의 길이를 나타내며 CARRAY, X_OCTET 형과 구조체 배열을 사용하는

경우에는 반드시 설정해 주어야 한다. 이외의 타입에서는 0으로 설정할 수 있다.

rlen 은 응답 버퍼 (rbuf)의 길이를 나타내며 CARRAY, X_OCTET, 구조체 배열 이외의 버퍼 타

Page 49: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

48Tmax C Programming Guide

입을 사용한 경우 이 값은 무시된다.

만일 서버로부터 받는 데이터가 할당된 응답 버퍼의 크기보다 크면 받는 버퍼는 자동적으로 커

지며 이경우 버퍼의 주소도 달라질 수 있다. 이것은 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;

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

Page 50: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

49 Tmax C Programming Guide

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

}

Page 51: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

50Tmax C Programming Guide

tpacall

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() 에 대한 응답이

올때까지 블록 상태로 기다린다.

TPNOTIME

클라이언트 측에 설정된 블록 타입아웃 시간을 무시하고

결과값을 받을때까지 기다린다. 그러나 트랜잭션

영역에서 호출했다면 트랜잭션 타임아웃 시간은 그대로

적용된다.

Page 52: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

51 Tmax C Programming Guide

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때

사용한다. 개발자가 시그널을 사용할 경우 시스템 함수

호출 도중에 시그널이 발생하면 시스템 함수 호출은

중단되고 해당 API 는 TPGOTSIG 에러를 리턴하지만

TPSIGRSTRT 플래그를 설정할 경우 중단된 시스템 함수

호출은 재실행된다.

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

tpacall() 은 클라이언트가 서비스를 요청하고 필요한 때에 응답을 받는 비동기형 통신에 사용되

는 API이다.

tpacall() 은 해당 서비스로 데이터를 보낸후 구별자(cd)를 리턴하고 즉시 제어를 반환한다. 요

청에 대한 응답은 리턴받은 cd 값을 이용하여 받아온다.

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

Page 53: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

52Tmax C Programming Guide

tpgetrply

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

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

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

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

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

flags TPNOTIME,TPSIGRSTRT, TPNOCHANGE, TPNOBLOCK, TPGETANY,

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

TPNOCHANGE

서비스 호출 결과로 받아온 데이터 타입이 rbuf 의

타입과 다를 경우 형변환이 일어나는데 TPNOCHANGE

플래그를 설정하면 형변환 대신 에러가 발생한다.

(TPEOTYPE)

TPNOBLOCK

서비스 수행결과 받아온 데이터가 내부 버퍼에 존재하지

않을 경우 타임아웃 시간동안 Tmax 시스템과 접속된

소켓을 검사하게 되는데 TPNOBLOCK 플래그를

사용하면 원하는 메시지가 없는 경우 바로 에러를

리턴하게 된다. (TPEBLOCK)

TPNOTIME

클라이언트 측에 설정된 블록 타입아웃 시간을 무시하고

결과값을 받을때까지 기다린다. 그러나 트랜잭션

영역에서 호출했다면 트랜잭션 타임아웃 시간은 그대로

적용된다.

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때

사용한다. 개발자가 시그널을 사용할 경우 시스템 함수

호출 도중에 시그널이 발생하면 시스템 함수 호출은

중단되고 해당 API 는 TPGOTSIG 에러를 리턴하지만

Page 54: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

53 Tmax C Programming Guide

TPSIGRSTRT 플래그를 설정할 경우 중단된 시스템 함수

호출은 재실행된다.

TPGETANY

구별자의 값을 무시하고 현재 버퍼에 쌓여있거나 Tmax

시스템과 연결된 소켓에 준비된 비동기형 서비스 수행

결과 중 가장 먼저 도착한 값을 받아온다.

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

tpgetrply() 는 tpacall() 로 보낸 요청에 대한 응답을 받는데 사용한다. tpgetrply() 는 기본적으

로 블럭킹 통신이다. 즉 일단 호출하면 응답을 받거나 블럭킹 타임 아웃이 발생할 때까지 기다

린다. 타임 아웃이 발생하면 호출은 실패하고 tperrno 에는 TPETIME이 설정된다.

그림 2-2. 비동기형 통신

cd 는 tpacall() 이 반환한 구별자로써 요청에 대한 정확한 응답을 구별할 수 있도록 한다. rbuf

와 rlen은 tpcall() 과 동일하다.

만일 서버로부터 받는 데이터가 할당된 응답 버퍼의 크기보다 크면 받는 버퍼는 자동적으로 커

지며 이경우 버퍼의 주소도 달라질 수 있다. 이것은 TPNOCHANGE 플래그의 영향을 받지 않는

다.

Ex)

...

Page 55: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

54Tmax C Programming Guide

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

...

Page 56: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

55 Tmax C Programming Guide

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 57: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

56Tmax C Programming Guide

비요청 메시지 처리

비요청 메시지는 어떤 요청에 대한 응답이 아닌 일방적으로 보내진 데이터이다.

이러한 메시지에 대한 대응 방법은 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 을 설

정한 상태에서 비요청 메시지 핸들러를 설정하지 않으면 모든 비요청 메시지는 버려진다.

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

Page 58: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

57 Tmax C Programming Guide

tpsetunsol

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

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

}

Page 59: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

58Tmax C Programming Guide

tpgetunsol

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

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

UNSOL_TPPOST, UNSOL_TPSENTOCLI, UNSOL_TPNOTIFY 가 있다.

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

len 받아온 데이터의 길이가 설정된다. CARRAY, X_OCTET, 구조체 배열 이외의

타입일 경우는 무시한다.

flags TPGETANY, TPNOCHANGE, TPBLOCK, TPNOTIME, TPSIGRSTRT 를

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

TPGETANY

현재 버퍼에 쌓여있거나 Tmax 시스템과 연결된 소켓에

준비된 비요청 메시지 중 가장 먼저 도착한 값을

받아온다. 버퍼 혹은 Tmax 시스템과의 연결 소켓에

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

TPBLOCK

tpgetunsol() 은 기본적으로 버퍼에 있는 비요청

메시지를 체크한후 다시 Tmax 시스템과 접속된 소켓을

검사하여 해당하는 메시지가 없으면 에러를 리턴한다.

TPBLOCK 플래그를 설정할 경우 해당하는 메시지가

도착할때까지 타임아웃 시간 범위 내에서 기다리게

된다.

TPNOTIME

TPBLOCK 플래그를 설정한 경우 타임아웃 시간도

무시하고 메시지가 도착할떄 까지 기다린다.

독자적으로는 의미가 없다.

TPNOCHANGE

해당 하는 메시지의 데이터 타입이 data 의 타입과

다를 경우 형 변환이 일어나는데 TPNOCHANGE

플래그를 설정하면 형변환 대신 에러를 리턴한다.

(TPEOTYPE)

Page 60: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

59 Tmax C Programming Guide

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

}

...

Page 61: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

60Tmax C Programming Guide

tpchkunsol

int *tpchkunsol(void)

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)

{

Page 62: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

61 Tmax C Programming Guide

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

exit(1);

}

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

}

Page 63: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

62Tmax C Programming Guide

타임아웃 시간 변경

클라이언트가 블록 상태로 메시지를 기다려 받아오는 최대 시간을 설정한다.

tpsleep(). tpschedule() 과 같은 API 들은 서정된 시간의 영향을 받지 않는다.

디폴트 값은 Tmax 시스템의 환경파일에 설정된 값이며 트랜잭션 타임아웃이나

서비스 타임아웃 시간과는 별도로 적용된다.

tpset_timeout

int tpset_timeout (int sec)

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

Page 64: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

63 Tmax C Programming Guide

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

}

. . . .

tpend() ;

}

Page 65: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

64Tmax C Programming Guide

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

클라이언트 프로그램의 코딩이 끝났다면 이제 컴파일하여 실행 파일을 만

들 차례다. 클라이언트 프로그램을 컴파일하기 위해서는 개발자가 작성한

클라이언트 프로그램, Tmax 클라이언트 라이브러리, 구조체 버퍼를 사용한

다면 구조체 파일이, 그리고 필드 버퍼는 필드 테이블이 정의된 파일이 준

비 되어야 한다.

클라이언트 프로그램:

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

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

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

필요하다.

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

구조체형 버퍼(STRUCT, X_C_TYPE, X_COMMON)를 사용하였다면 이를 정의하는

“xxxx.s” 형식의 구조체 파일이 필요하다. 이 구조체 파일은 sdlc –c 명령어를 이용

하여 컴파일하며 그 결과 구조체의 멤버들을 표준 통신형으로 변환하는데 필요한 바

이너리 테이블 파일이 생성된다. 이는 클라이언트 프로그램 실행시에 구조체형의 데

이터를 표준 통신형으로 변환/역변환 하는데 사용된다.

필드버퍼 바이너리 테이블(FDL

FILE)

필드 버퍼를 사용하였다면 “xxxx.f” 형식으로 정의된 필드 버퍼 파일이 필요하다. 이

파일은 fdlc 명령어를 이용하여 컴파일 하며 그 결과 필드키와 데이터를 대응시켜

주는 바이너리 테이블 파일과 필드키와 필드키 이름을 대응시켜주는 헤더 파일

(xxxx_fdl.h)이 만들어 진다. 기존의 구조체 파일과는 달리 사용자가 원하는 필드의

값만을 조작하고 전달할 수 있으므로 다양한 타입의 데이터를 사용하는 경우 자원의

낭비를 줄일 수 있다. 하지만 데이터 값과 필드키 값을 같이 관리하므로 많은 필드

를 사용하지 않는다면 역효과가 발생할 수도 있다.

Page 66: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

65 Tmax C Programming Guide

Page 67: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

66Tmax C Programming Guide

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

클라이언트 프로그램을 컴파일하여 오브젝트 파일을 생성한다. 클라이

언트 프로그램은 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

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

Page 68: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

67 Tmax C Programming Guide

그림2-4. 필드 버퍼를 사용한 클라이언트 프로그램 컴파일

Page 69: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

68Tmax C Programming Guide

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

Tmax 를 설치하면 예제 클라이언트 프로그램 디렉토리에는 기본적으로 예

제 프로그램 외에 메이크 파일과 이를 이용하는 쉘 프로그램이 생긴다

(Makefile.c, compile).

다음은 클라이언트 프로그램 메이크 파일(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:

Page 70: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

69 Tmax C Programming Guide

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

#

# client compile

#

$(TARGET): $(APOBJS)

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

$(TMAXLIBS)

#

clean:

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

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

./compile c toupper

Page 71: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

70Tmax C Programming Guide

2. Tmax 서버 프로그램(TCS)

TCS 서버 프로그램은 클라이언트가 보낸 데이터를 받아서 필요한 작업을

하며 그 결과를 다시 클라이언트로 보내주고 다음 요청을 기다린다. main()

루틴을 Tmax 시스템에서 관리하므로 개발자는 클라이언트를 직접 처리해

줄 필요 없이 비즈니스 로직에만 신경 쓰면 된다. 하나의 서버 프로그램은

하나 이상의 서비스 루틴을 가질수 있으며 한 서비스 내에서 다른 서비스

를 호출할 수 있다. 그러나 한 프로세스 내의 재귀적인 호출은 불가능하다.

하나의 서버 프로세스는 한번에 한가지 서비스만을 수행 할 수 있으므로

많은 서비스 루틴을 하나의 서버 프로그램으로 구성하는 것은 바람직 하지

않다.

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

TCS 서버프로그램은 Tmax에서 관리하는 main() 과 서비스루틴으로 이루

어진다. main() 은 데이터베이스 연결 및 해제, 명령어 라인 옵션 처리 등

의 역할을 하는 루틴으로 이루어져 있으며, 서비스 루틴은 실제로 클라이언

트의 요청을 받아 업무를 처리한다.

main() 루틴은 tpsvrinit() 이나 tpsvrdone() 루틴을 호출하고 TMM, CLH

의 제어 메시지에 대한 처리를 한다. 클라이언트의 서비스 요청이 있을 경

우 클라이언트의 정보와 데이터를 TPSVCINFO 구조체에 넣어서 해당 서

비스를 호출한다. TPSVCINFO 구조체는 서비스를 요청한 클라이언트에 대

한 정보와 처리할 데이터 정보를 가지고 있다. TPSVCINFO 구조체는

atmi.h 헤더 파일에 선언되어 있으며, 구성요소는 아래와 같다.

Page 72: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

71 Tmax C Programming Guide

TPSVCINFO

char name[XATMI_SERVICE_NAME_LENGTH] XATMI_SERVICE_NAME_LENGTH=16

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

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 에서 내부적으로 사용하므로 사용하지 말것을 권장한

다.

예)

TOUPPER(TPSVCINFO *msg)

{

.....

}

Page 73: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

72Tmax C Programming Guide

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

여기서는 TCS 방식의 서버프로그램 작성시 사용되는 API 들에 대해 알아

본다. 서버 또한 클라이언트 역할도 할 수 있기 때문에 클라이언트에서 사

용하는 함수도 사용이 가능하다. 추가적인 자세한 설명이나 여기에 빠진

API에 대한 설명은 Tmax Reference Manual 을 참조하도록 한다.

함 수 이 름 기 능

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

서비스 루틴을 완료한다.

서비스 완료,

결과 반환 관련

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

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

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

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

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

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

지를 보낸다.

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

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

비요청 메시지

전송 관련

함수

tpchkclid() 해당 서버 프로세스가 위치한 노드에 클라이언트 ID

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

표 2-2. UCS /TCS 서버 기본 API

Page 74: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

73 Tmax C Programming Guide

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

서비스 루틴의 완료를 표시하는 함수로 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 와 동일하지만 서버 프로세스 종료후 재기동

되지 않는다.

rcode 사용자에게 서비스 수행 결과에 대해 추가적인 정보를 주고자 할때 지정할

수 있다. 보통 DB 억세스 에러 값이 설정된다. 클라이언트는 gettpurcode()

를 사용하여 이 값을 얻을 수 있다.

Page 75: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

74Tmax C Programming Guide

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)

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

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

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

Page 76: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

75 Tmax C Programming Guide

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 를 사용하여 어느 서비스 루

틴에서 에러가 발생하였는지 알 수 있다. 이 API 사용법은 Tmax Reference Manual 을 참조하

도록 한다.

Page 77: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

76Tmax C Programming Guide

그림 2-5. tpforward

Ex )

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

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

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

Page 78: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

77 Tmax C Programming Guide

서버 초기화와 종료 루틴

서버의 main() 루틴 내에서 관리하는 서브루틴 으로 tpsvrint() 와 tpsvrdo

ne() 이 있다. 이들은 각각 서버 프로세스가 처음 시작될때와 종료될때 수

행하는 루틴으로 주로 NON-XA 모드로 데이터베이스와의 연결을 설정하거

나 해제하고 필요에 따라 명령라인 인수를 처리하는 등의 기능을 제공한다.

이 서브 루틴들은 개발자가 임의로 작성할 수 있으며 그렇지 않을 경우 디

폴트 루틴이 설정된다.

tpsvrinit

int tpsvrinit (int argc, char **argv)

argc 명령라인 인수의 갯수

argv 명령라인 인수

tpsvrinit() 는 서버 프로세스가 처음 시작될 때 초기화를 위한 루틴이며, 만일 사용자가 작성하

지 않으면 기본으로 제공되는 초기화 루틴이 포함된다. 일반적으로 Non-XA 모드로 데이터베이

스를 열거나 명령어 라인 인수를 처리하는 작업을 한다.

tpsvrinit() 가 사용하는 명령어 라인 인수는 Tmax 시스템 환경파일 서버절의 CLOPT 에 설정된

값이다. 자세한 내용은 Tmax Administration Guide 를 참조하도록 한다.

Ex )

#include <stdio.h>

#include <usrinc/atmi.h>

EXEC SQL INCLUDE sqlca.h;

Page 79: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

78Tmax C Programming Guide

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

strcpy(user_passwd, optarg);

break;

}

}

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

EXEC SQL CONNECT :user_name IDENTIFIED BY :user_passwd;

if (sqlca.sqlcode != 0) {

error processing routine

}

return(0);

}

Page 80: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

79 Tmax C Programming Guide

tpsvrdone

void tpsvrdone( void)

인수없음

서버가 종료되는 경우(tmdown 혹은 서비스 실패로 인한 비정상적인 종료)에 수행되는 루틴으로

만일 사용자가 작성하지 않으면 Tmax에서 기본적으로 제공되는 종료 루틴이 실행된다. 일반적

으로 Non-XA 모드로 연결된 데이터베이스와의 연결을 끊는 작업을 한다.

Ex )

void tpsvrdone()

{

EXEC SQL COMMIT WORK RELEASE;

}

Page 81: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

80Tmax C Programming Guide

비요청 메시지 API

Tmax 시스템은 현재 접속해 있는 클라이언트들에게 비요청 메시지를 보낼

수 있다. 클라이언트가 Tmax 시스템에 접속할때 넘긴 클라이언트의 정보

를 바탕으로 메시지를 보낼 수도 있고 Tmax 시스템이 내부적으로 관리하

는 클라이언트 아이디를 사용할 수도 있다. 또한 클라이언트 혹은 서버가

자신이 원하는 이벤트를 등록하고 해당 이벤트가 발생하면 메시지를 수령

하는 것도 가능하다.

여기에서는 Tmax 시스템이 내부적으로 관리하는 클라이언트 아이디를 이

용하여 메시지를 보내는 API 들에 대한 설명을 하며 기타 다른 방법을 사

용하는 API들은 “III. 5. 브로드 캐스트 / 멀티 캐스트” 를 참조하도록 한다.

tpgetclid

int tpgetclid ( void)

인수없음

클라이언트의 아이디를 반환한다. 클라이언트 아이디는 클라이언트가 접속한 최초의 노드와

CLH를 바탕으로 만들어지며 해당 클라이언트의 연결이 종료될때 까지 다른 클라이언트에 의해

재사용 되지 않으며 중간에 내용이 변하거나 하지 않는다.

클라이언트 아이디는 하나의 Tmax 시스템 내(Tmax 도메인)에서 유일한 값이며 클라이언트가

접속해 있는 노드의 위치에 상관없이 사용할 수 있다. tpsendtocli() 의 인수로 사용된다.

예)

...

clid = tpgetclid();

if (clid < 0)

Page 82: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

81 Tmax C Programming Guide

{

error processing routine

}

...

tpchkclid

int tpchkclid ( int clid)

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

클라이언트 아이디에 해당하는 클라이언트가 해당 서버 프로세스가 위치한 노드에 접속한 상태

인지를 확인한다. 주로 RDP 방식의 서버 프로그램 개발시 서비스 루틴에서 접속한 클라이언트

아이디를 저장하고 usermain() 루틴에서 tpsendtocli() 로 메시지를 보내는 경우 사용하면 불필

요한 에러를 사전에 막을 수 있다. (RPD 방식에서는 서버 프로세스가 위치한 노드에 직접 연결

된 상태가 아니면 tpsendtocli() 를 사용할 수 없다.)

클라이언트가 접속되지 않았거나 에러상황시는 –1을, 서버 프로세스가 위치한 노드의 클라이언

트 아이디에 대해서는 1을 리턴한다. 다른 노드에 접속된 클라이언트 아이디는 –2 를 리턴하며

이경우 클라이언트의 접속 상태는 정확히 알 수 없다.

예)

ret = tpchkclid(clid);

if (ret<0)

{

error processing routine

}

Page 83: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

82Tmax C Programming Guide

tpsendtocli

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

clid

Tmax 시스템에 접속한 모든 클라이언트에게 부여하는 유일한 아이디로

내부적으로 관리되는 번호이다. 즉 tpsendtocli() 는 클라이언트는 사용할

수 없는 API 이다.

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

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

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

len 보내고자 하는 데이터의 길이이다. CARRAY, X_OCTET, 구조체 배열

타입일 경우에는 반드시 명시해야 한다.

flags TPNOBLOCK, TPUDP, TPFLOWCONTROL, TPNOFLAGS 가 사용되며

내용은 다음과 같다.

TPNOBLOCK

송신 버퍼나 클라이언트 측의 수신버퍼가 차서

메시지가 블록되는 경우 TPEBLOCK 에러를

발생한다.

TPUDP

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

데이터를 버려도 됨. 데이터를 버려도 에러를

발생하지 않는다.

TPFLOWCONTROL

클라이언트의 수신 버퍼를 점검하여 메시지를

수신할 수 있는 상황이면 메시지를 보낸다. 그렇지

않으며 에러를 리턴하고 tperrno 에는 TPEQFULL

이 설정된다.

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

tpsendtocli() 는 서버에서만 사용할 수 있고, 클라이언트에서는 사용할 수 없다. TCS, UCS 방식

인 경우 서버 프로세스가 위치한 노드로 처음 접속하지 않은 클라이언트에게도 메시지를 보낼

Page 84: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

83 Tmax C Programming Guide

수 있으나 RDP 방식의 경우는 보낼 수 없으므로 주의하도록 한다.

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

}

Page 85: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

84Tmax C Programming Guide

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

개발자가 서버프로그램을 모두 작성하였다면 이제 컴파일하여 실행 파일을

만들 차례다. 서버 프로그램을 컴파일하기 위해서는 개발자가 작성한 서버

프로그램, Tmax 서버 라이브러리, 서비스 테이블이 필요하다. 구조체 버퍼

를 사용한 경우는 구조체-표준버퍼 변환/역변환 프로그램과 구조체 바이너

리 테이블이 있어야 하고 필드 버퍼를 사용하였다면 필드버퍼 헤더 파일과

필드버퍼 바이너리 테이블이 있어야 한다.

서버프로그램

개발자가 작성한 서비스 루틴이다. SQL 문을 사용하였다면 해당 DB 벤더가 제공하

는 툴을 이용하여 프리 컴파일을 마쳐야 한다.

Tmax 서버 라이브러리

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

하다.

서비스 테이블

서비스 테이블은 클라이언트가 요청한 서비스의 위치를 알기 위해 각각의 서버 프로

세스가 제공하는 서비스 이름들이 나열되어 있는 파일로써 Tmax 환경파일을 참조하

여 gst 명령으로 만든다. 서비스 테이블은 서비스 수행시 실제적으로 서버내에서 해

당 서비스 루틴의 위치를 찾기 위해 사용된다. 서비스 테이블은 Tmax 시스템 관리

자가 제공해야 한다. 이에 대한 자세한 내용은 Tmax Administration Guide 를 참조

한다.

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

구조체형 버퍼(STRUCT, X_C_TYPE, X_COMMON)를 사용하였다면 이를 정의하는

“xxxx.s” 형식의 구조체 파일이 필요하다. 이 구조체 파일은 sdlc –c 명령어를 이용

하여 컴파일하며 그 결과 구조체의 멤버들을 표준 통신형으로 변환하는데 필요한 바

이너리 테이블 파일이 생성된다. 이는 서버 프로그램 실행시에 구조체형의 데이터를

Page 86: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

85 Tmax C Programming Guide

표준 통신형으로 변환/역변환 하는데 사용된다.

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

서버 프로그램 내에서 구조체 버퍼를 사용하기 위해서는 sdlc 명령어로 만들어진 구

조체-표준버퍼 변환/역변환 프로그램(xxxx_sdl.c, xxxx_sdl.h)을 컴파일하여 같이 링

크해야 한다. 구조체를 사용하지 않을 경우에는 TMAXDIR/lib/sdl.o 를 링크하도록

한다.

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

필드 버퍼를 사용하였다면 “xxxx.f” 형식으로 정의된 필드 버퍼 파일이 필요하다. 이

파일은 fdlc 명령어를 이용하여 컴파일 하며 그 결과 필드키와 데이터를 대응시켜

주는 바이너리 테이블 파일과 필드키와 필드키 이름을 대응시켜주는 헤더 파일

(xxxx_fdl.h)이 만들어 진다. 기존의 구조체 파일과는 달리 사용자가 원하는 필드의

값만을 조작하고 전달할 수 있으므로 다양한 타입의 데이터를 사용하는 경우 자원의

낭비를 줄일 수 있다. 하지만 데이터 값과 필드키 값을 같이 관리하므로 많은 필드

를 사용하지 않는다면 역효과가 발생할 수도 있다.

Page 87: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

86Tmax C Programming Guide

서버 프로그램 컴파일 순서

아래는 일반적인 C 컴파일러를 이용한 컴파일 방법이다. 이 과정은 기본적

으로 Tmax를 설치하면 생성되는 쉘 프로그램을 사용하거나 mksvr 유틸리

티를 이용하여 간단하게 할 수 있다. 아래의 예는 리눅스에서의 실행 결과

이며 개발 환경(32/64비트)과 플랫폼에 따라 사용되는 플래그 및 라이브러

리가 조금씩 다르다. 자세한 내용은 다음절 “쉘 프로그램을 이용한 컴파일”

을 참조하도록 한다.

서버 프로그램을 컴파일하여 오브젝트 파일을 생성한다. 서버 프로그

램은 Tmax에서 제공하는 헤더 파일들을 참조해야 하며 필요에 따라

구조체 파일이나 필드버퍼 헤더파일도 참조되어야 한다.

만약 SQL 문을 사용하였다면 먼저 해당 DB벤더가 제공하는 툴로 프

리 컴파일을 마쳐야 한다.

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

구조체 통신인 경우 구조체 파일을 컴파일한다. 이 단계는 sdlc 을 이

용하여 구조체-표준버퍼 변환/역변환 프로그램을 생성하는 단계와 생

성한 프로그램을 다시 오브젝트 파일로 컴파일 하는 2단계로 이루어

진다.

Ex ) Step 1 : sdlc -i demo.s -> demo_sdl.c

Step 2 : cc -c -I/home/tmax/usrinc demo_sdl.c -> demo_sdl.o

구조체 파일을 사용하지 않는다면 TMAXDIR/lib/sdl.o 를 사용한다.

시스템 관리자가 제공해준 서비스 테이블을 컴파일하여 오브젝트 파일

형태를 생성한다.

Ex ) cc -c app_svctab.c -> app_svctab.o

만들어진 오브젝트 파일들과 Tmax시스템에서 제공하는 서버 라이브

러리를 함께 링크하여 서버 실행 프로그램을 생성한다.

Page 88: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

87 Tmax C Programming Guide

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

위의 예는 DB를 사용하지 않는 경우이다. DB를 사용하는 경우 DB에

따라 liboras.so(a) / libinfs.so(a) / libdb2.so(a) / libsybs.so(a) 를 사

용한다.

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

그림2-6. 서버 프로그램 컴파일(sdl)

Page 89: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

88Tmax C Programming Guide

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

그림2-7. 서버 프로그램 컴파일(fdl)

Page 90: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

89 Tmax C Programming Guide

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

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

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

Page 91: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

90Tmax C Programming Guide

#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)/.

rm -f $(OBJS)

$(APOBJS): $(TARGET).c

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

$(SVCTOBJ):

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

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

Page 92: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

91 Tmax C Programming Guide

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

Page 93: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

92Tmax C Programming Guide

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

Page 94: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

93 Tmax C Programming Guide

3. Tmax 서버 프로그램(UCS)

UCS 서버 프로그램은 클라이언트의 요청을 기다리고 있는 일반 TCS 서버

프로그램과는 달리 클라이언트의 요청이 없을 때도 다른 작업을 할수 있도

록 Tmax 에서 프로세스 관리를 해준다. TCS 와 마찬가지로 main() 루틴

은 Tmax 시스템이 관리하며 개발자는 클라이언트의 요청이 없는 동안 원

하는 작업이 이루어지는 usermain() 루틴을 작성해 주면 되며 필요에 따라

서비스 루틴을 추가할 수도 있다.

TCS 와 마찬가지로 하나의 서비스 내에서 다른 서비스를 호출할 수 있으

나 한 프로세스 내의 재귀적인 호출은 불가능하다.

3.1 UCS 방식 서버 프로그램의 구성

UCS 서버프로그램은 Tmax에서 관리하는 main() 과 usermain() 루틴, 여

기에 필요에 따라 서비스 루틴으로 이루어진다. main() 은 데이터베이스 연

결 및 해제, 명령어 라인 옵션 처리 등의 역할을 하며 usermain() 은 특별

한 메시지(서비스 요청이나 제어 메시지)가 없는 동안에 독자적인 작업을

수행하는 루틴이다. 서비스 루틴은 실제로 클라이언트의 요청을 받아 업무

를 처리한다.

UCS 방식의 main() 루틴은 일반적인 초기화 작업을 하고 usermain() 루틴

을 호출한다. TMM, CLH 로 부터 도착하는 메시지는 usermain() 에서 이

루어 진다. 만약 usermain() 이 종료되면 main() 루틴은 tpsvrdone() 루틴

을 수행하고 같이 종료된다.

usermain() 루틴은 독자적인 작업을 하다가 일정 시점에 스케줄링 API 를

통하여 TMM, CLH 로부터의 제어 명령이나 서비스 수행 명령을 처리한다.

Page 95: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

94Tmax C Programming Guide

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 방식 서버 프로그램의 경우 서비스 루틴은 존재하지 않아도 무관하며

Page 96: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

95 Tmax C Programming Guide

이경우 서버 프로세스는 데몬 프로세스와 비슷한 성격을 갖게 된다.

예)

TOUPPER(TPSVCINFO *msg)

{

.....

}

3.2 UCS 방식 서버 프로그램 기본 API

여기서는 UCS 방식의 서버 프로그램 작성시 사용되는 API 들에 대해 알아

본다. 클라이언트 API 뿐 아니라 일반 TCS 방식의 API 서버 API도 동일

하게 사용이 가능하다. 여기에서는 UCS 방식 서버 프로세스에서만 사용할

수 있는 API 들에 대해 설명한다.

함 수 이 름 기 능

tpschedule() 지정 시간(초)동안 CLH 혹은 사용자 설정 FD에 메

시지가 도착했는지 확인한다. 스케줄링 관련

API

tpuschedule() 지정 시간(마이크로초)동안 CLH 혹은 사용자 설정

FD에 메시지가 도착했는지 확인한다.

소켓 FD 관련

매크로 tpgetfd()

UCS 스케줄러에 FD를 등록한다. tpschedule()

/tpuschedule() 은 해당 FD에 도착한 메시지도 검

사하게 된다.

Page 97: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

96Tmax C Programming Guide

tpissetfd() 해당 FD에 메시지가 도착했는지 검사한다.

tpclrfd() 해당 FD를 UCS 스케줄러에서 해제한다.

tpgetctx() 서버 라이브러리 내의 CTX_T 구조체의 값을 사용

자 변수에 저장한다.

tpcancelctx() 서버 라이브러리 내의 CTX_T 구조체의 내용을 지

운다.

tpsavectx() 서버 라이브러리 내에 클라이언트의 정보를 저장한

다.

서비스 포워딩

tprelay()

tpgetctx() 혹은 tpsavectx() 로 얻은 클라이언트 정

보/트랜잭션 정보와 함께 다른 서비스 루틴으로 클

라이언트의 관리를 넘긴다(TCS 방식 서버 프로그램

에서 사용되는 tpforward() 와 유사하다)

tpregcb() 비동기형 서비스 요청을 처리하는 콜백 펑션을 설정

한다. usermain()

루틴 내에서의

비동기형 통신 tpunregcb() 설정된 콜백 펑션을 해제한다.

표 2-3. 서버 함수

Page 98: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

97 Tmax C Programming Guide

스케줄링 관련 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 의 값을 확인해야 한다.

만약 tpsetfd() 등으로 사용자가 지정한 소켓 FD 에 메시지가 도착한 경우는 UCS_USER_MSG

(2)를, 그 이외의 경우는 UCS_TMAX_MSG(1) 를 리턴한다.

예)

usermain()

Page 99: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

98Tmax C Programming Guide

{

.....

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

}

Page 100: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

99 Tmax C Programming Guide

소켓 FD 관련 매크로

소켓 관련 매크로는 앞서 설명한 tpschedule() 등의 UCS 스케줄러에 사용자의

소켓 FD 를 같이 사용하기 위한 것으로 일반 네트웍 프로그램에서 사용하는

FD_SET, FD_CLR, FD_ISSET 과 유사하다.

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 에 메시지가 도착했는지를 검사한다.

Page 101: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

100Tmax C Programming Guide

해당 소켓FD 에 메시지가 도착했는지를 검사하는 API 이다. 메시지가 도착했을 경우는 양의정

수를, 도착하지 않은 경우 0을 리턴한다. 에러가 발생하는 경우 –1을 리턴한다.

tpclrfd

int tpclrfd (int fd)

fd 해당 소켓 fd 를 UCS 스케줄러에서 제외한다.

더이상 해당 소켓 FD 의 메시지를 스케줄링 하지 않는다.

예)

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

}

Page 102: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

101 Tmax C Programming Guide

.....

/* 해당 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;

}

}

}

Page 103: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

102Tmax C Programming Guide

서비스 포워딩

Tmax 시스템이 아닌 일반 호스트 시스템과 연동을 하여 운영하는 경우 일반적

으로 서버 프로그램에서 소켓을 열고 데이터를 주고 받는 과정을 클라이언트를

대신하여 수행한다. 그러나 외부 호스트 시스템과의 연결이 불안정하거나 서비

스 시간이 길경우 해당 서버 프로그램은 블록 상태에 놓이게 되고 추가적인 서

비스를 하지 못하게 된다.

이러한 경우를 해결하기 위해 서비스 루틴은 클라이언트의 요청을 받아 클라이

언트의 정보를 저장하고 외부 호스트로 요청을 보내는 부분까지만 하고 응답은

usermain() 루틴을 이용하여 받아 저장된 클라이언트의 정보와 함께 다른 서비

스 루틴으로 넘겨서 그 서비스 루틴이 클라이언트에게 결과값을 보내도록 한다

면 서버 프로그램은 블록되지 않고도 모든 과정을 수행 할 수 있게 된다.

그림 2.8 UCS 방식 서비스 포워딩

Page 104: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

103 Tmax C Programming Guide

tpsavectx

CTX_T * tpsavectx (void)

인수없음

라이브러리 내부에 현재 접속된 클라이언트의 정보를 저장하며 이 저장된 정보에 대한 포인터를

리턴한다. 리턴된 값은 tprelay() 및 tpcancelctx() 에 인수로 사용될 수 있으며 사용자 임의로

내용을 수정하거나 해제해서는 안된다. 하나의 클라이언트에 대해 한번만 수행되어야 하며 두번

이상 수행될 경우 불필요한 에러 메시지를 발생 시킬 수 있다.

Tmax 는 링크드 리스트 형식으로 이 클라이언트의 정보들을 관리하며 tprelay() 된 클라이언트

데이터는 자동적으로 링크드 리스트에서 제거된다. 만약 서비스 루틴이 종료될때 아직 해결되지

않은 CTX_T 정보가 존재할 경우 클라이언트는 계속 응답을 기다리게 된다.

tpsavectx() 은 서비스 루틴 내에서만 사용할 수 있다.

예)

RELAY_SVC(TPSVCINFO *msg)

{

CTX_T *ctxp;

.....

ctxp = (CTX_T *)tpsavectx();

if (ctxp==NULL) {

error process routine

}

.....

}

Page 105: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

104Tmax C Programming Guide

tpgetctx

int tpgetctx (CTX_T *ctxp)

ctxp tpsavectx() 로 저장된 클라이언트의 정보를 CTX_T 구조체로 받아온다.

현재 클라이언트의 정보를 사용자가 선언, 할당한 CTX_T 구조체에 복사해온다. tpgetctx() 를 사

용했을 경우 tprelay() 로 이 정보를 사용하지 않을 경우 해당 서비스 루틴이 완료되더라도 클라

이언트는 계속 응답을 기다리게 된다. tpgetctx() 로 얻어진 정보는 tpcancelctx() 로 취소할 수

없으므로 반드시 tprelay() 를 사용해 줘야 한다.

tpgetctx() 는 서비스 루틴 내에서만 사용할 수 있다.

예)

RELAY_SVC(TPSVCINFO *msg)

{

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)

Page 106: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

105 Tmax C Programming Guide

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)

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

data 서비스를 호출 할 때 전달되는 데이터로 NULL이 아닌 경우는 반드시

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

Page 107: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

106Tmax C Programming Guide

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

.....

ret=tprelay(("SELECT_ORA", ptr, 0, TPNOFLAGS, ctxp); if (ret < 0) { error process routine ..... } return 0;

}

Page 108: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

107 Tmax C Programming Guide

usermain() 루틴 내에서의 비동기형 통신

usermain() 루틴 내에서 서비스 시간이 긴 비동기형 통신을 사용하는 경우

tpgetreply() 에서 블록이 일어나 스케줄링이 늦어지는 경우가 있다. 이때 서비

스 결과를 tpgetreply() 로 받지 않고 콜백 펑션을 지정하면 스케줄링에 지장이

없이 결과값을 처리할 수 있다. 그러나 루프 시간이 짧은 usermain() 내에서 매

번 비동기형 통신이 일어나는 경우 최대 비동기형 서비스 수를 초과하게 되어

에러가 발생하게 되므로 주의하도록 한다.

tpregcb

typedef int (__cdecl *UcsCallback)(UCSMSGINFO*)

int tpregcb (UcsCallback)

UcsCallback 비동기형 서비스 호출 즉 tpacall() 에 대한 응답을 받는 콜백 함수를

설정한다.

usermain() 루틴에서 사용된 tpacall() 에 대한 응답을 콜백 펑션으로 처리하고 싶을때 사용한다.

처리시점은 tpschedule() 혹은 tpuschedule() 이 수행 되었을 때이다. 콜백 펑션의 인수로 사용

되는 UCSMSGINFO 구조체의 내용은 아래와 같다.

UCSMSGINFO

long urcode 사용자가 지정한 urcode 값이다.

int errcode 에러 상황일 경우 에러코드가 저장된다.

int msgtype Tmax 시스템이 내부적으로 사용하는 메시지 타입이다. tpacall() 에

대한 정상적인 응답은 1004로 나타난다.

Page 109: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

108Tmax C Programming Guide

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

return 0;

}

Page 110: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

109 Tmax C Programming Guide

tpunregcb

int tpunregcb (void)

인수없음

설정된 콜백펑션을 해제하는 함수이다.

Page 111: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

110Tmax C Programming Guide

3.3 UCS 방식 서버 프로그램 컴파일

UCS 방식 서버 프로그램의 컴파일은 TCS 방식의 서버 프로그램과 크게

다르지 않다. 준비 사항과 컴파일 순서는 완전히 동일하며 다만 서버 라이

브러리를 libsvr.a (혹은 libsvr.so) 가 아닌 libsvrucs.a (혹은 libsvrucs.so)

를 사용하면 된다.

서버 프로그램 컴파일 순서

아래는 일반적인 C 컴파일러를 이용한 컴파일 방법이다. 이 과정은 적당한

쉘 프로그램을 사용 만들어 사용하거나 mksvr 유틸리티를 이용하면 간단

하게 처리 할 수 있다. 아래의 예는 리눅스에서의 실행 결과이며 개발 환경

(32/64비트)과 플랫폼에 따라 사용되는 플래그 및 라이브러리가 조금씩 다

르다. 사용 라이브러리를 제외하고는 TCS 방식과 완전히 동일하므로 자세

한 내용은 “II. 2.3 TCS 방식 서버 프로그램 컴파일” 을 참조하도록 한다.

서버 프로그램을 컴파일하여 오브젝트 파일을 생성한다. 서버 프로그

램은 Tmax에서 제공하는 헤더 파일들을 참조해야 하며 필요에 따라

구조체 파일이나 필드버퍼 헤더파일도 참조되어야 한다.

만약 SQL 문을 사용하였다면 먼저 해당 DB벤더가 제공하는 툴로 프

리 컴파일을 마쳐야 한다.

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

구조체 통신인 경우 구조체 파일을 컴파일한다. 이 단계는 sdlc 을 이

용하여 구조체-표준버퍼 변환/역변환 프로그램을 생성하는 단계와 생

성한 프로그램을 다시 오브젝트 파일로 컴파일 하는 2단계로 이루어

진다..

Ex ) Step 1 : sdlc -i demo.s -> demo_sdl.c

Page 112: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

111 Tmax C Programming Guide

Step 2 : cc -c -I/home/tmax/usrinc demo_sdl.c -> demo_sdl.o

구조체 파일을 사용하지 않는다면 이 과정을 수행할 필요 없이 TMAXDIR/lib

디렉토리 내의 sdl.o 를 사용하여 같이 컴파일 하도록 한다.

시스템 관리자가 제공해준 서비스 테이블을 컴파일하여 오브젝트 파일

형태를 생성한다.

Ex ) cc -c app_svctab.c -> app_svctab.o

만들어진 오브젝트 파일들과 Tmax시스템에서 제공하는 서버 라이브

러리를 함께 링크하여 서버 실행 프로그램을 생성한다.

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

로 바꾼다. 사용법은 동일하다.

Page 113: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

112Tmax C Programming Guide

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 114: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

113 Tmax C Programming Guide

III. Tmax 어플리케이션 개발(B)

3장 에서는 이전장에서 설명한 것 이외에 Tmax 시스템이 제공하는 고유의

기능을 사용하기 위한 API의 사용법과 간단한 예제를 제시하며 개발 과정

에 발생하는 에러메시지에 대한 간략한 설명을 포함한다.

대화형 통신

트랜잭션 관리

RQ 시스템

RDP

멀티 캐스트

Windows 환경 프로그래밍

Tmax 보안 시스템

디버깅

Page 115: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

114Tmax C Programming Guide

1. 대화형 통신

대화형 통신은 클라이언트와 서버간에 이루어지는 반이중 통신이다. 처음

대화형 모드로 접속할때 대화 주도권을 설정하며 대화 주도권을 잡는 쪽은

송신, 상대편은 수신만이 가능하다. 대화 주도권을 갖고 있는 쪽은 언제든

지 상대편에게 주도권을 넘길 수 있으므로 메시지를 주고 받은 것이 가능

하다. 이러한 대화 주도권의 제어는 송신측의 플래그를 사용하여 이루어지

며 수신측은 이러한 변화를 이벤트값을 통해 알 수 있다.

1.1 대화형 통신의 흐름

대화형 통신은 tpconnect() 를 호출함으로써 시작된다. 이 함수는 해당 대

화형 서비스에 데이터를 보내는 동시에 대화 주도권을 설정하게 된다.

tpconnect() 가 성공적으로 수행되면 각각의 대화모드를 구분하기 위한 ‘연결 구분자(cd)’ 를 반환하며 이것을 이용하여 해당 대화 모드를 이용하여

메시지를 송수신 할 수 있게 된다.

대화형 통신은 서비스 중의 문맥(context)에 따라 추가적인 정보가 필요한

다던가 하는 경우에 사용한다. 그러나 연결 시간이 길고 서버 자원의 사용

도가 낮아지므로 가급적 일반적인 동기형/비동기형 통신을 사용하여 개발하

는 것을 권장한다.

일반적으로 대화형 통신은 서버 측에서 tpreturn() 을 호출하여 완료된다.

이경우 상대방은 데이터와 함께 TPEV_SVCSUCC 이벤트를 수신하게 된다.

대화를 시도한 측에서 tpdiscon() 를 호출함으로써 대화형 통신을 강제적으

로 종료할 수도 있으며 이 경우 전송중의 데이터는 사라질 수도 있고 진행

Page 116: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

115 Tmax C Programming Guide

중인 트랜잭션은 롤백된다.

대화 주도권은 주도권을 갖고 있는 쪽에서만 상대방에게 넘겨줄 수 있으며

tpsend() API의 TPRECVONLY 플래그를 이용한다. 상대방은 데이터와 함

께 TPEV_SENDONLY 이벤트를 수신하게 되고 대화 주도권을 잡게 된다.

그림3-1. 대화형 통신

1.2 대화형 통신 API

아래는 대화형 통신의 대표적인 API 만을 요약한 것이다. API 들에 대한

상세한 설명은 Tmax Reference Manul 을 참고하도록 한다.

함 수 이 름 기 능

Page 117: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

116Tmax C Programming Guide

tpconnect()

대화형 서비스와 연결을 설정하고 각각의 대화모드를

구분하기 위한 연결 구분자를 반환한다. 연결 설정시

반드시 대화 주도권을 설정해야 한다.

tpdiscon() 대화형 서비스와의 연결을 즉시 종료한다. 처음 연결을

주도한 측에서만 사용할 수 있는 API 이다.

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

대화형 통신

API

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

표 3-1 대화형 통신 API

Page 118: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

117 Tmax C Programming Guide

대화형 통신 API

대화형 통신에 사용되는 API 들의 사용법에 대해 설명한다. 대화를 시작하는 측

은 처음 대화를 누가 시작할지를 지정해야 하며 대화 주도권을 갖고 있는 측은

플래그를 설정하여 대화 주도권을 넘길 수 있다.

대화를 일방적으로 단절하는 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 호출 시점이 트랜잭션 영역일 경우 호출로 인한 결과를

트랜잭션 범주에서 제외한다.

Page 119: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

118Tmax C Programming Guide

TPNOTIME

클라이언트 혹은 서버측이 설정한 블록 타입아웃 시간을

무시하고 결과값을 받을때까지 기다린다. 그러나 트랜잭션

영역에서 호출했다면 트랜잭션 타임아웃 시간은 그대로

적용된다.

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때 사용한다.

개발자가 시그널을 사용할 경우 시스템 함수 호출 도중에

시그널이 발생하면 시스템 함수 호출은 중단되고 해당 API

는 TPGOTSIG 에러를 리턴하지만 TPSIGRSTRT 플래그를

설정할 경우 중단된 시스템 함수 호출이 재실행된다.

TPSENDONLY 대화 주도권을 클라이언트측이 갖는다. 클라이언트는

반드시 tpsend() 로 대화를 시작해야 한다.

TPRECVONLY 대화 주도권을 서버측이 갖는다. 클라이언트는 반드시

tprecv() 로 대화를 시작해야 한다.

tpconnect() 로 보내진 데이터는 일반적인 동기형/비동기형 서비스와 마찬가지로 TPSVCINFO

구조체에 넣어져 대화형 서비스 루틴에 전달된다. 이때 TPSENDONLY 와 TPRECVONLY 중 하

나는 반드시 설정되어야 한다.

tpconnect() 가 정상적으로 수행되면 다른 대화형 모드와의 구분을 위한 연결 구분자(cd)가 리

턴된다. 이 값은 해당 대화형 모드로 데이터를 주거나 받을때 인수로 사용된다.

Ex 1)

...

if ((cd = tpconnect(“ACCOUNT”, NULL, 0, TPSENDONLY)) == -1)

{

error processing routine;

}

tpsend(cd, ..... )

Page 120: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

119 Tmax C Programming Guide

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 플래그를 설정할 경우 중단된 시스템 함수

호출이 재실행된다.

TPRECVONLY 대화 주도권을 상대편에게 넘긴다.

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

revent 이벤트 발생시 발생 이벤트 값이 설정된다. 이벤트가 발생하면 API는

실패하고 데이터는 송신되지 않으며 tperrno는 TPEEVENT가 설정된다.

자세한 내용은 다음과 같다.

Page 121: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

120Tmax C Programming Guide

TPEV_DISCONIMM 대화모드 종속자에게 전달되며 대화모드 시작자가

tpdiscon() 으로 연결을 해제하였음을 나타낸다.

Ex )

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() 로 얻어진 연결 구분자이다.

rbuf 서비스를 호출 할 때 전달되는 데이터로 NULL이 아닌 경우는 반드시

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

rlen 보내는 데이터의 길이를 지정한다. CARRAY, X_OCTET, 구조체 배열 타입

일 경우에는 반드시 설정해야 한다.

flags TPNOTIME,TPSIGRSTRT, TPNOBLOCK, TPNOCHANGE, TPNOFLAGS가

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

Page 122: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

121 Tmax C Programming Guide

TPNOTIME

클라이언트 혹은 서버측이 설정한 블록 타입아웃 시간을

무시하고 결과값을 받을때까지 기다린다. 그러나

트랜잭션 영역에서 호출했다면 트랜잭션 타임아웃 시간은

그대로 적용된다.

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때

사용한다. 개발자가 시그널을 사용할 경우 시스템 함수

호출 도중에 시그널이 발생하면 시스템 함수 호출은

중단되고 해당 API 는 TPGOTSIG 에러를 리턴하지만

TPSIGRSTRT 플래그를 설정할 경우 중단된 시스템 함수

호출이 재실행된다.

TPNOBLOCK

서비스 수행결과 받아온 데이터가 내부 버퍼에 존재하지

않을 경우 타임아웃 시간동안 Tmax 시스템과 접속된

소켓을 검사하게 되는데 TPNOBLOCK 플래그를

사용하면 원하는 메시지가 없는 경우 바로 에러를

리턴하게 된다. (TPEBLOCK)

TPNOCHANGE

서비스 호출 결과로 받아온 데이터 타입이 rbuf 의 타입과

다를 경우 형변환이 일어나는데 TPNOCHANGE 플래그를

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

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

revent 이벤트 발생시 발생 이벤트 값이 설정된다. 이벤트가 발생하면 API는

실패하고 데이터는 송신되지 않으며 tperrno는 TPEEVENT가 설정된다.

자세한 내용은 다음과 같다.

TPEV_DISCONIMM 대화모드 종속자에게 전달되며 대화모드 시작자가

tpdiscon() 으로 연결을 해제하였음을 나타낸다.

TPEV_SENDONLY 대화 주도권이 넘어왔음을 의미한다.

TPEV_SVCSUCC

대화 시작자에게 수신되며 서비스가 성공적으로 완료

되었음을 알린다. 즉 tpreturn () 의 rval 값이

TPSUCCESS 인 경우이다.

Page 123: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

122Tmax C Programming Guide

TPEV_SVCFAIL 서비스가 실패하였음을 알린다. tpreturn () 의 rval

값이 TPFAIL 이다.

TPEV_SVCERR

tpreturn() 과정에 시작된 로컬 트랜잭션이 완료되지

않은 경우나 아직 받지 않은 비동기형 응답이

존재하는 등 비정상적인 경우 rval 값에 무관하게

발생한다.

Ex )

SVC(tpsvcinfo *msg)

{

...

if (tprecv(msg->cd, &rcvbuf, &rlen, TPNOFLAGS, &revent)==-1)

{

/*제어권이 넘어온 경우는 정상*/

if (revent != TPEV_SENDONLY)

{

tpreturn(TPFAIL, 0, rcvbuf, 0, 0);

}

}

...

}

Page 124: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

123 Tmax C Programming Guide

tpdiscon

void tpdiscon (int cd)

cd tpconnect() 로 얻어진 연결 구분자.

tpdiscon() 은 이미 설정된 대화형 모드를 즉시 해제하는 API로써 처음 tpconnect() 를

호출하여 연결을 설정한 측에서만 사용할 수 있다. 그렇지 않을경우 tpdiscon() 은 에러를

리턴하며 tperrno 는 TPEPROTO 가 설정된다.

API 가 성공적으로 수행되면 상대방은 TPEV_DISCONIMM 이벤트를 수신하며 해당 cd 는

더이상 사용할 수 없다. 만약 트랜잭션이 진행 중이었다면 롤백되고 전송중의 메시지는

버려진다. 그러므로 대화형 모드에서 연결을 끊는 적당한 방법으로 서버 쪽에서 tpreturn()를

호출하는 것을 권장한다.

연결 해제에 tpdiscon() 을 사용하는 경우 메시지가 유실될 우려가 있으므로 일반적으로 대화형

통신의 완료는 tpreturn() 을 통해 이루어지게 된다. tpreturn() 의 인수값에 따라 이벤트 값은

TPEV_SVCSUCC 또는 TPEV_SVCFAIL 로 설정된다.

Ex)

if ((cd = tpconnect(“ACCOUNT”, NULL, 0, TPSENDONLY)) == -1) {

error

}

. . .

if (error){

tpdiscon(cd); /* 예외적인 경우 발생 */

}

Page 125: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

124Tmax C Programming Guide

대화형 통신 이벤트

대화형 통신에서는 5가지의 이벤트가 존재한다. 아래의 표는 5개의 이벤트가 발

생되는 함수와 의미를 나타내고 있다.

Event 받는 함수 의 미

TPEV_DISCONIMN

(0x0001)

tpsend()

tprecv()

연결이 비정상적으로 끊어졌을 때를 의미하며 대화형

모드를 설정한 측에서 tpdiscon() 을 호출하였거나 기타

네트웍 장애로 대화형 통신 API 의 수행이 실패하였을

때에도 발생한다.

TPEV_SVCERR

(0x0002) tprecv()

tpreturn() 과정에 에러가 발생하거나 서비스가 완전히

완료되지 않은 경우에 발생한다.

TPEV_SVCFAIL

(0x0004) tprecv()

tpreturn() 의 rval 에 TPFAIL나 TPEXIT를 지정하여

호출할 때 발생한다.

TPEV_SVCSUCC

(0x0008) tprecv()

tpreturn() 의 rval 에 TPSUCCES 를 지정하였으며 서

비스를 정상적으로 완료하였음을 의미한다.

TPEV_SENDONLY

(0x0020) tprecv() 상대방에게서 대화 주도권이 넘어 왔음을 의미한다.

표3-2. 대화형 통신시의 이벤트

Page 126: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

125 Tmax C Programming Guide

2. 트랜잭션 관리

트랜잭션은 하나의 자원에 접근하는 다수의 다단계 구성의 업무 처리과정

에 있어 일관적으로 자원의 상태 변화를 적용하기 위해 모든 구성단계를

하나의 작업 단위로 묶은 것이다. 트랜잭션 과정은 이른바 ACID 특성을 지

원함으로써 자원은 일관성을 보장받게 된다.

로컬 트랜잭션 : 하나의 자원관리자(DB) 가 참여하는 트랜잭션.

전역 트랜잭션 : 둘 이상의 자원관리자가 참여하는 트랜잭션

현재 Tmax 시스템은 중첩(nested) 트랜잭션을 지원하지 않는다.

2.1 Tmax 시스템의 트랜잭션 관리

Tmax 시스템에서 자원 관리자를 사용하는 경우 두가지 방식으로 운영이

가능하다.

첫째 XA 모드 Tmax시스템은 따로 트랜잭션 관리자(TMS)를 두어 트랜잭

션 전체를 관리하도록 하는 것을 말한다. XA 모드로 운영되는 경우 모든

트랜잭션은 일단 전역 트랜잭션으로 간주되며 데이터의 무결성 확보를 위

해 2PC(Two-Phase Commit)를 사용한다.

Page 127: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

126Tmax C Programming Guide

XA 모드인 경우 따로 Tmax 환경 파일에 자원관리자와의 접속과 접속 해

제를 위한 설정이 필요하며 트랜잭션 관리는 Tmax API 를 사용하여 처리

하게 된다. 분산환경의 전역 트랜잭션의 관리하는데 사용된다.

아래는 XA 모드를 사용하는 Tmax 환경 파일의 예이다(부분). 자세한 내용

은 Tmax Administration 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 모드의 경우 특별히 다른 설정을 필요로 하지 않으나 어플리케이

션에서 따로 자원관리자와 연결을 맺고 트랜잭션을 선언해 주어야 한다.

2.2 트랜잭션 관리 API

아래는 트랜잭션 처리의 기본적인 API 만을 요약한 것이다. API 들에 대한

상세한 설명은 Tmax Reference Manul 을 참고하도록 한다.

Page 128: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

127 Tmax C Programming Guide

함 수 이 름 기 능

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

tx_commit() 트랜잭션을 완료한다(커밋).

tx_rollback() 트랜잭션을 완료한다(롤백).

tx_set_transacti

on_timeout() 트랜잭션 처리 한계시간을 설정한다.

tx_set_transacti

on_control()

트랜잭션 완료후 바로 트랜잭션을 시작할 것이지 설

정한다.

tx_set_commit_r

eturn() 커밋 명령의 리턴 시점을 결정한다.

트랜잭션

처리 함수

tx_info() 트랜잭션 상태정보를 보여준다.

표 3-3 트랜잭션 관리 API

Page 129: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

128Tmax C Programming Guide

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 를 리턴하게 된다.

반환되는 에러 값은 아래와 같다:

TX_OUTSIDE ( -1 )

이미 외부의 다른 전역 트랜잭션에 참여하고 있어서 새로운 트랜잭션을 시작할 수

없을 때 반환되는 에러이다.

TX_PROTOCOL_ERROR ( -5 )

Tmax 시스템과 연결이 설정되어 있지 않거나 트랜잭션 내에서 다시 트랜잭션을 시

작하는 등 적당하지 않은 문맥에서 tx_begin() 이 호출될 때 반환되는 에러이다.

TX_ERROR ( -6 )

새로운 트랜잭션을 시작하려고 할 때 TM(transaction manager)이나 RM(resource

manager)에서 일시적인 에러가 발생하여 반환되는 값이다.

TX_FAIL ( -7 )

메모리 할당이나 데이터베이스와의 연결 실패와 같은 심각한 에러가 발생하여 트랜

Page 130: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

129 Tmax C Programming Guide

잭션을 시작하는데 실패하였다.

Ex)

...

ret = tx_begin();

if (ret < 0){

error processing routine

}

printf("tx begin ok!\n");

tx_commit

int tx_commit (void)

인수 없음.

tx_commit() 은 트랜잭션을 완료하고 정보를 갱신한다.

만일 트랜잭션이 체인모드 라면 (tx_set_transaction_control() 참조) 커밋 완료후 새로운 트랜잭

션을 시작하고 체인상태로 설정되어 있지 않으면 비 트랜잭션 상태로 전환된다.

tx_commit() 이 성공하면, TX_OK ( 0 )를 반환하고, 실패하면 아래와 같은 에러값을 반환한다.:

TX_NO_BEGIN ( -100 )

트랜잭션이 체인모드로 설정되어 있는 경우에 발생하며 현재 트랜잭션은 커밋에 성

공하였지만 새로운 트랜잭션을 시작하는데 실패하였다.

TX_ROLLBACK ( -2 )

타임아웃이나 에러등으로 커밋이 불가능한 상황에 발생하며 트랜잭션은 커밋되지 않

고 롤백 된다.

Page 131: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

130Tmax C Programming Guide

TX_ROLLBACK_NO_BEGIN ( -102 )

트랜잭션이 체인모드로 설정되어 있는 경우에 발생하며 트랜잭션은 롤백되었고 새로

운 트랜잭션을 시작하는데 실패하였다.

TX_MIXED ( -3 )

트랜잭션이 부분적으로 실행(commit)되고 부분적으로 취소(rollback)되었다. 트랜잭

션이 체인상태로 설정된 경우 새로운 트랜잭션은 시작될 수 있다.

TX_MIXED_NO_BEGIN ( -103 )

트랜잭션이 부분적으로 실행되고 부분적으로 취소되었고, 트랜잭션이 체인상태로 설

정된 경우 새로운 트랜잭션을 시작할 수 없다.

TX_HAZARD ( -4 )

외부 장애로 인해, 트랜잭션이 부분적으로 실행(commit)되고 부분적으로 취소

(rollback)되었다. 트랜잭션이 체인상태로 설정된 경우 새로운 트랜잭션은 시작될 수

있다.

TX_HAZARD_NO_BEGIN (-104 )

외부 장애로 인해, 트랜잭션이 부분적으로 실행되고 부분적으로 취소되었으며 트랜

잭션이 체인상태로 설정된 경우 새로운 트랜잭션을 시작할 수 없다.

TX_PROTOCOL_ERROR ( -5 )

Tmax 시스템과 접속되지 않은 상태나 트랜잭션이 시작되지 않은 상태, 아직 완료되

지 않은 대화형 모드나 비동기형 모드가 존재하는 경우와 같은 적절하지 않은 상황

에서 tx _commit() 이 호출되었다.

TX_FAIL ( -7 )

메모리 할당이나 데이터베이스와의 연결 실패와 같은 심각한 에러가 발생하여 더 이

상 트랜잭션을 처리할 수 없을 때 반환되며 비 트랜잭션 상태로 전환된다.

Ex)

...

ret = tx_commit();

if (ret < 0)

{

Page 132: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

131 Tmax C Programming Guide

error processing routine

}

printf("tx commit ok!\n");

tx_rollback

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)되었다. 트랜잭

Page 133: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

132Tmax C Programming Guide

션이 체인상태로 설정된 경우 새로운 트랜잭션은 시작될 수 있다.

TX_MIXED_NO_BEGIN ( -103 )

트랜잭션이 부분적으로 실행되고 부분적으로 취소되었고, 트랜잭션이 체인상태로 설

정된 경우 새로운 트랜잭션을 시작할 수 없다.

TX_HAZARD ( -4 )

외부 장애로 인해, 트랜잭션이 부분적으로 실행(commit)되고 부분적으로 취소

(rollback)되었다. 트랜잭션이 체인상태로 설정된 경우 새로운 트랜잭션은 시작될 수

있다.

TX_HAZARD_NO_BEGIN ( -104 )

외부 장애로 인해, 트랜잭션이 부분적으로 실행되고 부분적으로 취소되었으며 트랜

잭션이 체인상태로 설정된 경우 새로운 트랜잭션을 시작할 수 없다.

TX_PROTOCOL_ERROR ( -5 )

Tmax 시스템과 접속되지 않은 상태나 트랜잭션이 시작되지 않은 상태, 아직 완료되

지 않은 대화형 모드나 비동기형 모드가 존재하는 경우와 같은 적절하지 않은 상황

에서 tx _commit() 이 호출되었다.

TX_FAIL ( -7 )

메모리 할당이나 데이터베이스와의 연결 실패와 같은 심각한 에러가 발생하여 더 이

상 트랜잭션을 처리할 수 없을 때 반환되며 비 트랜잭션 상태로 전환된다.

Ex)

...

ret = tx_rollback();

if (ret < 0)

{

error processing routine

}

printf("tx rollback ok!\n");

Page 134: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

133 Tmax C Programming Guide

tx_set_transaction_timeout

typedef long TRANSACTION_TIMEOUT int tx_set_transacion_timeout (TRANSACTION_TIMEOUT timeout)

timout 트랜잭션 타임아웃 시간 (초)

트랜잭션 시작에서 완료까지의 제한 시간을 설정한다. 이 함수는 현재 트랜잭션 상태 여부에 관

계없이 호출 가능하며 트랜잭션 상태에서 호출되었다면 그 값은 다음 트랜잭션부터 영향을 준다.

기본적으로 지정되는 제한시간은 0으로 트랜잭션의 제한 시간이 없다는 것을 의미한다.

호출이 성공하면 TX_OK, 실패하면 아래와 같은 에러 값을 반환한다.:

TX_EINVAL

지정된 제한시간이 정당하지 않다.

TX_PROTOCOL_ERROR

서버 프로세스와 데이터베이스와의 연결이 설정되지 않은 상태에서 서버 프로세스내

에서 해당 API를 호출하는 경우 발생한다.

TX_FAIL

트랜잭션 관리자에 치명적인 에러가 발생하여 더 이상 처리를 수행할 수 없다.

Ex)

...

tx_set_transaction_timeout(20);

Page 135: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

134Tmax C Programming Guide

tx_set_transaction_control

int tx_set_transacion_control (TRANSACTION_CONTROL control)

control 트랜잭션 모드를 설정한다. 사용 가능한 값은 다음과 같다.

TX_UNCHAINED 트랜잭션이 완료된 시점에서 다시 새로운

트랜잭션을 시작하지 않는다.(default)

TX_CHAINED 트랜잭션이 완료된 시점에서 다시 새로운

트랜잭션을 시작한다.

트랜잭션 모드를 설정한다. 이 함수는 트랜잭션을 시작한 프로세스에만 영향을 미치며 값을 변

경하면 다음 트랜잭션 완료 시점부터 적용된다.

Ex)

...

tx_set_transaction_control(TX_CHAINED);

tx_set_commit_return

int tx_set_commit_return (COMMIT_RETURN when_return)

when_r

eturn 2PC 트랜잭션에서 커밋 명령의 리턴 시점을 결정한다.

TX_COMMIT_DECI

SION_LOGGED

2PC의 1단계 준비과정이 모두 끝나면 커밋

명령을 내리고 바로 콘트롤을 리턴한다.

Page 136: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

135 Tmax C Programming Guide

TX_COMMIT_COM

PLETED

2PC의 1단계 준비과정이 모두 끝나면 커밋

명령을 내리고 반환 값이 도착하면 컨트롤을

리턴한다. (default)

2PC의 1단계 준비작업이 모두 끝났을때 커밋 명령을 내리면 일반적인 경우 성공적으로 커밋된

다. 그러나 네트웍 불량이나 기타의 이유로 커밋이 제대로 수행되지 않는 경우가 있으며 이 경

우 커밋 명령은 제대로 된 에러 메세지를 받지 못하므로 상황을 알 수 없다.

Ex)

...

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

- 트랜잭션 모드

TRANSACTION_TIMEOUT transaction_timeout

- 트랜잭션 처리 한계시간

TRANSACTION_STATE transaction_state

Page 137: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

136Tmax C Programming Guide

- 트랜잭션 상태 여부

tx_info() 는 트랜잭션 상태정보를 TXINFO 구조체(usrinc/tx.h 참조)를 통하여 전달해준다. 호출

의 반환값이 1이면 트랜잭션 상태이고 0이면 트랜잭션 상태가 아니다. 트랜잭션이 아닌 상태에

서 호출되면 xid 는 null 이 설정된다.

Ex)

...

TXINFO info;

...

ret = tx_info(&info);

if (ret < 0)

{

error processing routine

}

Page 138: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

137 Tmax C Programming Guide

2.3 트랜잭션 관련 에러

트랜잭션에 관련해서 발생할 수 있는 에러는 TX 와 XA 두가지 종류가 있다.

TX 에러는 Tmax 시스템이 사용하는 에러 메시지로 usrinc/tx.h 에 정의되어

있고 XA 에러는 운용중인 데이터베이스에서 사용하는 에러 메시지로 해당 데이

터베이스 벤더가 제공한다.

오라클의 경우 $ORACLE_HOME/rdbms/demo/xa.h 를 참조하면 된다

TX error

리턴 값 기 능

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 잘못된 인수를 받았음

Page 139: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

138Tmax C Programming Guide

TX_COMMITTED -9 트랜잭션이 데이터베이스 독자적으로 수행됨

TX_NO_BEGIN -100 트랜잭션은 COMMIT되었지만 새 트랜잭션은 시작할수 없

표3-3. 트랜잭션 에러(TX)

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 트랜잭션모드에서 벗어나 있음

표3-4. 트랜잭션 에러(XA)

Page 140: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

139 Tmax C Programming Guide

3. RQ 시스템

신뢰성 있는 서비스 수행을 위하여 RQ를 관리하는 서비스가 존재할때 이

RQ를 사용하는 것은 전적으로 클라이언트 프로그램이 작성되는 방법에 의

해 결정된다. 클라이언트의 요청으로 저장된 RQ의 데이터는 시스템의 장애

나 오류로 인해 Tmax 시스템이 재시동 되더라도 추후에 관리자에 의해 재

수행 될 수 있다.

3.1 RQ API

아래는 RQ 사용을 위한 가장 기본적인 API 만을 요약한 것이다. API 들에

대한 상세한 설명은 Tmax Reference Manul 과 Tmax RQ Programming

Guide 를 참고하도록 한다.

함 수 이 름 기 능

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

tpdeq() RQ 에 저장된 데이터를 꺼낸다.

tpqstat() RQ 에 저장된 데이터의 갯수를 보여준다.

RQ 관련 함수

tpextsvcname() RQ 에서 꺼내온 데이터의 서비스 이름을 가져온다.

표 3-5 RQ 관련 API

Page 141: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

140Tmax C Programming Guide

tpenq

int tpenq(char *qname, char *svc, char *data, long len, long flags)

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 큐에 데이터가 기록된다.

TPNOREPLY

tpenq()의 첫번째 인자가 NULL이 아닌 서비스 이름으로

지정된 경우 해당 서비스를 수행 한 후 그 결과를 Reply

큐에 저장하지 않는다.

TPFUNC tpenq()의 첫번째 인자를 서비스 이름으로 호출하는 경우

Page 142: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

141 Tmax C Programming Guide

Reply 큐에 데이터가 기록되고 서비스를 호출하지 않는다.

TPNOFLAGS

tpenq()의 첫번째 인자가 NULL이 아닌 서비스 이름으로

지정된 경우 해당 서비스를 수행 한 후 서버가 리턴한

(TPSVCSUCCESS 나 TPSVCFAIL에 관계없이) 결과는

클라이언트의 버퍼에 저장된다. 이 값을 받아오기

위해서는 tpdeq()시에도 플래그를 TPNOFLAGS로 주어야

한다. 서버가 결과값을 리턴하기 전에 에러가 발생하면

데이터는 Fail 큐에 저장되며 이값은 tpdeq()시에

TPRQS플래그로 받아와야 한다..

서비스 요청 데이터를 RQ에 저장하는 함수이다. tpenq() 의 두번째 인자를 지정하면 데이터는

Request큐에 저장되며, 두번째 인자를 NULL을 지정하면 데이터는 Reply큐에 저장된다. Fail 큐

에는 tpenq()를 사용하여 인위적으로 데이터를 저장할 수 없다.

또한 tpenq() 로 저장된 데이터들은 도착 순서에 따라 링크드 리스트로 관리되며 데이터를 읽을

때는 들어온 순서대로 처리 된다(FIFO). 현재 Tmax 버전은 LIFO나 우선순위 처리를 지원하지

않는다.

Ex)

...

ret = tpenq(“rq1”, “TOUPPER”, ibuf, strlen(ibuf), TPRQS);

if (cd == -1)

{

error processing routine

}

Page 143: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

142Tmax C Programming Guide

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 큐에서 데이터를 수신하고자 할 때 지정된다.

TPFUNC

tpenq()시 TPFUNC로 플래그를 지정한 경우 Reqly 큐에

저장된 데이터를 수신하고자 할 때 TPRQS와 함께

지정된다.

TPNOFLAGS

tpenq()시에 svc 에 서비스 이름을 지정하고 flags 값을

TPNOFLAGS로 지정한 경우 그 결과값을 클라이언트의

버퍼에 송신하게 된다. 이런 경우 tpdeq()시에도 그

결과값을 수신하기 위해서는 flags값을 TPNOFLAGS로

지정해야 한다.

Page 144: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

143 Tmax C Programming Guide

RQ에 저장된 데이터를 읽을때 사용하는 함수이다. tpdeq()를 읽어온 데이터는 RQ에서 제거되기

때문에 한번 수신한 데이터를 다시 읽을수는 없다. tpenq() 에서 설명한 대로 먼저 저장된 데이

터 부터 순서대로 읽어온다.

Ex 1)

...

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 145: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

144Tmax C Programming Guide

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에 적체되어있는 데이터

의 통계를 구한다.

Ex)

...

if (tpqstat(“rq1”, TMAX_FAIL_QUEUE) < 0)

{

error processing routine

}

Page 146: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

145 Tmax C Programming Guide

tpextsvcname

int tpextsvcname(char *data, char *svc)

data tpdeq()로 RQ로부터 읽은 데이터가 저장되어 있는 포인터로 tpalloc()으로

할당된 주소값을 사용한다.

svc 알아오고자 하는 서비스 명이 수신될 버퍼이다.

tpdeq()로 RQ에서 데이터를 읽은 경우, 해당 데이터의 서비스명을 알고자

할 때 사용하는 함수이다. 이 함수는 보통 Fail 큐에 저장되어 있는 데이터

를 tpdeq()로 읽은 경우에 사용한다.

Ex)

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 147: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

146Tmax C Programming Guide

4. RDP(Realtime Data Processor)

RDP는 지속적으로 변하는 데이터를 클라이언트에게 효율적이고 빠르게 전

달하는 상황에 효과적으로 대처하기 위하여 UCS타입의 프로세스를 커널

수준에서 수정한 서버 프로세스 방식이다. 데이터를 전달하는데 있어서

Tmax 시스템 내부적인 부하가 걸리는 CLH를 거치지 않고 서버 프로세스

자체에서 바로 클라이언트로 보내므로 위와 같은 특별한 상황의 시스템 운

영에 있어 일반 UCS 프로그램에 비해 프로세스 점유율이나 처리 속도의

측면에서 월등한 성능을 보인다.

하나의 노드에는 한 종류의 RDP 타입 서버 프로그램만을 사용할 수 있으

며 해당 노드의 모든 서비스 수행 결과는 이 서버 프로세스들을 통해 클라

이언트로 전달된다.

RDP 방식은 클라이언트에게 비요청 메시지를 보내는 경우 제한 사항이 존

재한다. 자세한 내용은 “II. 2.2 TCS 방식 서버 프로그램 기본 API” 를 참

조하도록 한다.

RDP 프로그램의 구조는 일반 UCS 프로그램과 동일하며 다만 환경 파일

설정과 컴파일시의 링크 라이브러리만 다르다. 환경 파일 설정에 대한 자세

한 설명은 Tmax Administration Guide 을 참조하도록 한다.

4.1 RDP 방식 서버 프로그램 환경설정

CLH 프로세스 수보다 RDP 프로세스의 수가 같거나 많아야 한다.

CLH 프로세스 수는 MIN과 MAX 값이 같도록 설정해야 한다.

노드절에 REALSVR=<svrname> 을 지정하고 필요에 따라 RSCPC 값

을 설정한다. RSCPC 는 RDP 프로세스와 여타 다른 서버 프로세스와

Page 148: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

147 Tmax C Programming Guide

의 통신 채널수이다. <svrname>은 RDP 타입의 서버 프로세스의 이름

이다.

서버절의 해당 RDP 서버 프로세스는 SVRTYPE=REALSVR 라고 설

정한다.

RDP 를 사용하는 환경 파일의 예

*DOMAIN

tmax1

*NODE

tmaxi1

*SVRGROUP

svg1

svg2

*SERVER

deal

real

*SERVICE

IN

OUT

WORK

SHMKEY =70990, MINCLH=2, MAXCLH=2

TMAXDIR = "/home/navis/tmax",

APPDIR = "/home/navis/tmax/appbin",

PATHDIR = "/home/navis/tmax/path",

REALSVR = “real", RSCPC = 2

NODENAME = "tmaxi1"

NODENAME = "tmaxi1"

SVGNAME = svg2, MIN=1

SVGNAME = svg1, MIN=2, MAX=4, SVRTYPE = REALSVR,

SVRNAME = deal

SVRNAME = deal

SVRNAME = real

Page 149: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

148Tmax C Programming Guide

4.2 RDP 방식 서버 프로그램 컴파일

RDP 방식 서버 프로그램의 컴파일은 일반 TCS 방식이나 UCS 방식 서버

프로그램과 크게 다르지 않다. 준비 사항과 컴파일 순서는 완전히 동일하며

다만 서버 라이브러리를 libsvrrs.a (혹은 libsvrrs.so) 를 사용하면 된다.

서버 프로그램 컴파일 순서

아래는 일반적인 C 컴파일러를 이용한 컴파일 방법이다. 이 과정은 적당한

쉘 프로그램을 사용 만들어 사용하거나 mksvr 유틸리티를 이용하면 간단

하게 처리 할 수 있다. 아래의 예는 리눅스에서의 실행 결과이며 개발 환경

(32/64비트)과 플랫폼에 따라 사용되는 플래그 및 라이브러리가 조금씩 다

르다. 사용 라이브러리를 제외하고는 TCS 방식과 완전히 동일하므로 자세

한 내용은 “II. 2.3 TCS 방식 서버 프로그램 컴파일” 을 참조하도록 한다.

서버 프로그램을 컴파일하여 오브젝트 파일을 생성한다. 서버 프로그

램은 Tmax에서 제공하는 헤더 파일들을 참조해야 하며 필요에 따라

구조체 파일이나 필드버퍼 헤더파일도 참조되어야 한다.

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

구조체 통신인 경우 구조체 파일을 컴파일한다. 이 단계는 sdlc 을 이

용하여 구조체-표준버퍼 변환/역변환 프로그램을 생성하는 단계와 생

성한 프로그램을 다시 오브젝트 파일로 컴파일 하는 2단계로 이루어

진다.

Ex ) Step 1 : sdlc -i demo.s -> demo_sdl.c

Step 2 : cc -c -I/home/tmax/usrinc demo_sdl.c -> demo_sdl.o

구조체 파일을 사용하지 않는다면 이 과정을 수행할 필요 없이 TMAXDIR/lib

Page 150: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

149 Tmax C Programming Guide

디렉토리 내의 sdl.o 를 사용하여 같이 컴파일 하도록 한다.

시스템 관리자가 제공해준 서비스 테이블을 컴파일하여 오브젝트 파일

형태를 생성한다.

Ex ) cc -c app_svctab.c -> app_svctab.o

만들어진 오브젝트 파일들과 Tmax시스템에서 제공하는 서버 라이브

러리를 함께 링크하여 서버 실행 프로그램을 생성한다.

Ex ) cc -o app app.o demo_sdl.o app_svctab.o libsvrrs.a libnodb.a -> app 또는

cc -o app app.o sdl.o app_svctab.o libsvrrs.a libnodb.a -> app

쉘 프로그램을 사용하는 경우 해당 메이크 파일의 –lsvr을 –lsvrrs 로

바꾼다. 사용법은 동일하다

Page 151: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

150Tmax C Programming Guide

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 152: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

151 Tmax C Programming Guide

5. 브로드 캐스트 / 멀티 캐스트

Tmax 는 다양한 방법으로 클라이언트에게 데이터를 전달할 수 있다. 관리나 기

타 개발상의 목적으로 다수의 클라이언트에게 데이터를 보내야 하는 경우가 있

을 경우 모든 클라이언트의 아이디를 관리하여 각각 메시지를 보내는 것도 한

방법이겠지만 시스템의 동시 사용자가 많은 경우 그리 효율적인 방법이 되지 않

는다.

다수의 클라이언트를 몇개의 그룹으로 구분할 수 있다면 하나의 API 를 이용하

여 해당되는 모든 클라이언트에게 메시지를 보내는 것이 가능해지게 된다.

Tmax 는 클라이언트의 접속 정보를 활용하거나 이벤트를 이용하는 방법으로

이러한 브로드 캐스트 및 멀티 캐스트를 구현하고 있다.

두 방식 모두 일반적인 의미의 브로드 캐스트 및 멀티 캐스트가 모두 가능하지

만 구분의 편의상 전자를 브로드 캐스트 API, 후자를 멀티 캐스트 API 라 부르

겠다.

5.1 클라이언트 정보를 활용하는 API

tpbroadcast

int tpbroadcast (char *lmid, char *usrname, char *cltname, char *data, long *len, long falgs)

lmid

메시지를 받을 대상이 되는 노드 이름. 해당 노드에 접속된 모든

클라이언트에게 메시지를 보낸다. ‘*’로 설정하면 모든 노드의

클라이언트에게 메시지를 보낸다. 이외의 와일드카드 문자 사용은

허용되지 않는다

Page 153: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

152Tmax C Programming Guide

usrname 메시지를 받을 대상이 되는 사용자 이름으로 tpstart() 시 tpinfo 구조체를

통해 전달되는 값이다. ‘?’, ‘*’ 와 같은 와일드카드 문자를 사용할 수

있다.

cltname 메시지를 받을 클라이언트 그룹으로 tpstart() 시 전달되는 값이다. ‘?’, ‘*’

와 같은 와일드카드 문자를 사용할 수 있다.

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

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

len 보내고자 하는 데이터의 길이이다. CARRAY, X_OCTET, 구조체 배열

타입일 경우에는 반드시 명시해야 한다.

flags TPNOBLOCK, TPNOTIME, TPSIGRSTRT, TPNOFLAGS 가 사용되며

내용은 다음과 같다.

TPNOBLOCK

송신 버퍼나 클라이언트 측의 수신버퍼가 꽉 차서

메시지가 블록되는 경우 에러를 발생한다.

(TPEBLOCK)

TPNOTIME 메시지 블록 상황에서 타임아웃 시간을 무시한다.

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

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

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

이 함수는 클라이언트와 서버가 다른 클라이언트에게로 비요청 메시지를 보내고자 할 때 사용한

다. 이 때 비요청 메시지를 받을 클라이언트는 Tmax에 접속되어 있어야 하며, tpstart()에서 비

요청 메시지를 받겠다는 플래그로 접속되어 있어야만 한다.

이 API 는 클라이언트와 서버 모두 사용할 수 있다.

Ex)

...

ret = tpbroadcast(NULL, "user", “cli1”, (char *)msg->data, 0, 0);

if (ret < 0)

Page 154: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

153 Tmax C Programming Guide

{

error processing routine

}

...

5.2 이벤트를 활용하는 API

Tmax 는 이벤트를 통해 다수의 클라이언트 뿐만 아니라 서비스 루틴에도 메시

지를 보낼수 있다. 모든 클라이언트와 서비스 루틴은 개발자 임의로 이벤트에

가입하거나 취소할 수 있고 이벤트를 발생시킬 수 있다. 또한 하나의 이벤트에

중복 가입하거나 동시에 여러가지 이벤트에 가입할 수도 있다.

발생된 이벤트에 의한 이벤트 데이터 전송과 그에 따른 결과는 트랜잭션의 범주

에 들지 않으므로 주의하도록 한다.

tpsubscribe

int tpsubscribe(char *eventname, char *filter, TPEVCTL *ctl, long flags)

eventname eventname 은 가입 하고자 하는 이벤트의 이름으로 NULL로 끝나는

15자 이내의 문자열이다. 현재 와일드 카드 문자는 지원되지 않는다.

Page 155: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

154Tmax C Programming Guide

filter 현재 사용되지 않으며 NULL 로 지정한다.

ctl 메시지 처리 방법에 대한 구조체로 클라이언트의 경우 NULL을

지정하도록 한다. 서버의 경우는 아래에 다시 설명한다.

flags 현재 의미있는 플래그는 존재하지 않는다. TPNOFLAGS 로 설정하도록

한다.

지정한 이벤트에 가입한다. 클라이언트 프로그램에서 사용되는 경우 이벤트가 발생하면 앞서 설

명한 tpsetunsol() 이나 tpgetunsol() 을 이용하여 이벤트 데이터를 수신할 수 있다. 서버 프로그

램 측에서 사용되는 경우는 ctl 구조체에 지정된 방식으로 전달된다. ctl 구조체의 내용은 다음과

같다.

TPEVCTL

long ctlflags 현재 사용되지 않으며 0으로 지정한다.

long post_flags 현재 사용되지 않으며 0으로 지정한다.

char svc[XATMI_SERVICE_NAME_LENGTH] XATMI_SERVICE_NAME_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, TPNOFLAGS) 의 형식으로 저장된다. 자세한 내용은 Tmax RQ

Programming Guide 를 참조한다.

tpsubscribe() 는 해당 이벤트의 핸들러를 리턴하며 이 핸들러는 이벤트 가입을 취소하고자 할

때 사용한다. 이벤트의 발생은 클라이언트와 서버 어느쪽에서든 일어날 수 있으며 하나의 이벤

트에 여러번 가입할 수도, 여러가지 이벤트에 중복 가입할 수도 있다.

Page 156: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

155 Tmax C Programming Guide

예)

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 157: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

156Tmax C Programming Guide

tpunsubscribe

int tpunsubscribe(long sd, long flags)

sd tpsubscribe() 에서 얻어진 이벤트 핸들러이다.

flags 현재 의미있는 플래그는 존재하지 않는다. TPNOFLAGS 로 설정하도록

한다.

이벤트 가입을 취소한다. 더이상 이벤트 메시지를 수신하지 않는다.

예)

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;

}

Page 158: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

157 Tmax C Programming Guide

tppost

int tppost(char *eventname, char *data, long len, long flags)

eventname eventname 은 가입 하고자 하는 이벤트의 이름으로 NULL로 끝나는

15자 이내의 문자열이다. 현재 와일드 카드 문자는 지원되지 않는다.

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

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

len 보내고자 하는 데이터의 길이이다. CARRAY, X_OCTET, 구조체 배열

타입일 경우에는 반드시 명시해야 한다.

flags 현재 의미있는 플래그는 존재하지 않는다. TPNOFLAGS 로 설정하도록

한다.

이벤트를 발생시킨다. 해당 이벤트에 참가하고 있는 모든 클라이언트 프로그램에는 비요청 데이

터가 보내지고 참가하고 있는 서버 프로그램은 가입시 설정한 대로 서비스가 수행되거나 RQ에

데이터가 저장된다. 이벤트에 의해 서비스가 수행되는 경우 트랜잭션의 범주에 들지 않는다.

예)

strcpy(sndbuf, "data");

ret=tppost(sub, sndbuf, 0, TPNOFLAGS);

if (ret<0) printf("tppost failed.. %s\n", tpstrerror(tperrno));

Page 159: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

158Tmax C Programming Guide

6. Windows 환경 프로그래밍

개발된 서비스가 일반 사용자를 위한 것일 경우 클라이언트 프로그램은 주

로 개인 PC 에 많이 사용되는 윈도우즈 환경을 기반으로 하여 개발된다.

Tmax 는 이를 위해 다양한 개발툴을 위한 인터페이스를 제공한다. Tmax

가 지원하는 개발툴은 다음과 같으며 자세한 사용법은 Tmax 4GL

Programming Guide 를 참조하도록 한다.

파워빌더

델파이

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)

Page 160: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

159 Tmax C Programming Guide

6.1 tmaxmt.dll

윈도우 프로그래밍 환경에서 사용되는 Message-Driven 방식의 서비스 요

청을 위해 두가지 API 를 추가하였다.

WinTmaxAcall()

WinTmaxAcall2()

두 API 는 거의 동일하며 지정한 윈도우로 메시지를 넘기느냐 지정한 콜백

펑션으로 넘기느냐 하는 차이가 있을 뿐이다. API 를 수행할 때마다 쓰레드

를 하나씩 생성하여 메시지를 처리한다.

헤더 파일은 tmaxpi.h 를 사용한다.

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

하여 사용한다.

Page 161: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

160Tmax C Programming Guide

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

sndbuf 서비스를 호출 할 때 전달되는 데이터로 NULL이 아닌 경우는 반드시

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

len 보내는 데이터의 길이를 지정한다. CARRAY, X_OCTET, 구조체 배열 타입

일 경우에는 반드시 설정해야 한다.

flags tpacall() 의 플래그를 그대로 사용한다. 자세한 내용은 다음과 같다.

TPNOTRAN 호출 시점이 트랜잭션 영역일 경우 호출로 인한 결과를

트랜잭션 범주에서 제외한다.

TPNOREPLY

이 플래그는 서비스 요청에 대한 응답을 받지 않겠다는

것으로 호출이 성공적으로 완료되면 구별자로 0을

반환한다. WinTmaxAcall () 의 호출이 트랜잭션

영역에서 일어난 경우는 응답을 반드시 받아야 하므로

TPNOREPLY 플래그를 사용할 수 없다. 꼭 사용하기

위해서는 TPNOTRAN 플래그와 함께 설정하여 트랜잭션

영역에서 제외해야 한다.

TPBLOCK 타임 아웃 시간 내에서 WinTmaxAcall () 에 대한 응답이

올때까지 블록 상태로 기다린다.

TPNOTIME

클라이언트 측에 설정된 블록 타입아웃 시간을 무시하고

결과값을 받을때까지 기다린다. 그러나 트랜잭션

영역에서 호출했다면 트랜잭션 타임아웃 시간은 그대로

적용된다.

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때

사용한다. 개발자가 시그널을 사용할 경우 시스템 함수

호출 도중에 시그널이 발생하면 시스템 함수 호출은

중단되고 해당 API 는 TPGOTSIG 에러를 리턴하지만

TPSIGRSTRT 플래그를 설정할 경우 중단된 시스템 함수

Page 162: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

161 Tmax C Programming Guide

호출은 재실행된다.

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

WinTmaxAcall() 은 Tmax 시스템에 접속하여 서비스를 요청하고 결과를 받아 다시 원하는 윈도

우의 윈도우 프로시저로 넘긴후 연결을 종료한다. 사용자는 이 메시지를 처리하는 루틴을 만들

고 윈도우 프로시저에 등록하면 된다.

예)

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

Page 163: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

162Tmax C Programming Guide

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)

{

CString temp;

sprintf(msg, "%s", ((TPSVCINFO *)wp)->data);

.....

SetDlgItemText(IDC_EDIT2, msg);

return 0;

}

Page 164: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

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

반환한다. WinTmaxAcall2 () 의 호출이 트랜잭션

영역에서 일어난 경우는 응답을 반드시 받아야 하므로

TPNOREPLY 플래그를 사용할 수 없다. 꼭 사용하기

위해서는 TPNOTRAN 플래그와 함께 설정하여 트랜잭션

영역에서 제외해야 한다.

TPBLOCK 타임 아웃 시간 내에서 tpacall() 에 대한 응답이

올때까지 블록 상태로 기다린다.

Page 165: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

164Tmax C Programming Guide

TPNOTIME

클라이언트 측에 설정된 블록 타입아웃 시간을 무시하고

결과값을 받을때까지 기다린다. 그러나 트랜잭션

영역에서 호출했다면 트랜잭션 타임아웃 시간은 그대로

적용된다.

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때

사용한다. 개발자가 시그널을 사용할 경우 시스템 함수

호출 도중에 시그널이 발생하면 시스템 함수 호출은

중단되고 해당 API 는 TPGOTSIG 에러를 리턴하지만

TPSIGRSTRT 플래그를 설정할 경우 중단된 시스템 함수

호출은 재실행된다.

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

WinTmaxAcall() 은 Tmax 시스템에 접속하여 서비스를 요청하며 응답은 지정한 콜백 펑션으로

넘어간다.

예)

int Callbackfn(WPARAM wp, LPARAM lp);

....

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

Page 166: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

165 Tmax C Programming Guide

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 167: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

166Tmax C Programming Guide

6.2 WinTmax.dll

윈도우 프로그래밍 환경에서 사용되는 Message-Driven 방식의 서비스 요

청을 위한 API 를 추가하였다. 독립적인 쓰레드를 이용하여 메시지를 처리

하므로 tpstart() 나 tpend() 대신 WinTmaxStart(), WinTmaxEnd() 를 사

용한다.

WinTmaxStart()

WinTmaxEnd()

WinTmaxSetContext ()

WinTmaxSend ()

tmaxmt.dll 과 유사한 방식으로 동작하지만 Tmax 시스템에 자동으로 접속

/해제 작업을 하지 않으며 API 당 하나씩 쓰레드를 생성하는 대신 하나의

쓰레드로 모든 메시지를 처리한다. 에러 메시지와 비요청 메시지를 처리하

기 위해 따로 윈도우를 지정하지 않으면 메시지는 무시된다.

디버그 및 관리의 목적으로 MAX_DEBUG 환경 변수에 지정된 파일에 로

그를 남길 수 있다.

헤더 파일은 WinTmax.h 를 사용한다.

Page 168: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

167 Tmax C Programming Guide

WinTmaxStart

int WinTmaxStart (TPSTART_T *tpinfo)

tpinfo Tmax 시스템에 클라이언트의 정보를 넘길 필요가 있을 경우 사용하는

구조체로 tpalloc() 으로 할당하여 사용해야 한다. 그럴 필요가 없을 경우는

NULL 값을 넣어도 무방하다.

메시지를 처리하는 쓰레드를 만들고 사용 메모리를 초기화 하는 외에 기능상 tpstart() 와 같으

며 사용 인수도 동일하다. tpstart() 의 내용을 참조하도록 한다.

WinTmaxEnd

int WinTmaxEnd (void)

인수없음

메시지를 처리하는 쓰레드를 종료하고 사용 메모리를 해제하는 외에 기능상 tpend() 와 같으므

로 tpend() 의 내용을 참조하도록 한다.

예)

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

error process routine..

return FALSE;

}

.....

WinTmaxEnd();

Page 169: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

168Tmax C Programming Guide

WinTmaxSetContext

int WinTmaxSetContext (HANDLE winhandle, unsigned int msgtype, int slot)

winhandle 메시지를 받은 윈도우의 핸들러이다.

msgtype 해당 윈도우에서 처리하기 위한 메시지 번호를 지정한다.

slot

메시지 전달 정보가 기록될 슬롯 번호를 지정한다. 사용 범위는 0~255

이다. –1 일 경우 2~255 중에서 사용하지 않는 슬롯을 임의로 설정하며

이미 설정된 슬롯 번호를 사용자가 지정하는 경우 이전의 내용은

무시된다.

Tmax 시스템에서 도착한 데이터를 보낼 윈도우와 메시지 번호를 지정한다. 비요청 메시지의 경

우 0번 슬롯에 지정된 윈도우로 보내지고 에러메시지는 1번 슬롯에 지정된 윈도우로 보내진다.

해당 슬롯에 값이 설정되지 않았을 경우 데이터는 버려진다.

리턴값은 설정된 슬롯 번호이며 WinTmaxSend() API 에 인수로 사용된다.

예)

#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 170: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

169 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 플래그를 사용할 수

없다. 꼭 사용하기 위해서는 TPNOTRAN 플래그와

함께 설정하여 트랜잭션 영역에서 제외해야 한다.

TPNOTIME

클라이언트 혹은 서버측이 설정한 블록 타입아웃 시간을

무시하고 결과값을 받을때까지 기다린다. 그러나

트랜잭션 영역에서 호출했다면 트랜잭션 타임아웃 시간은

그대로 적용된다.

TPBLOCK 타임 아웃 시간 내에서 WinTmaxSend () 에 대한

Page 171: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

170Tmax C Programming Guide

응답이 올때까지 블록 상태로 기다린다.

TPSIGRSTRT

이 플래그는 시그널 인터럽트를 수용하고자 할때

사용한다. 개발자가 시그널을 사용할 경우 시스템 함수

호출 도중에 시그널이 발생하면 시스템 함수 호출은

중단되고 해당 API 는 TPGOTSIG 에러를 리턴하지만

TPSIGRSTRT 플래그를 설정할 경우 중단된 시스템 함수

호출은 재실행된다.

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

WinTmaxSend() 는 기능적으로 tpacall() 과 동일하다. 그러나 WinTmax.dll 내부의 메시지 처리

쓰레드가 도착한 결과 데이터를 처리해 주므로 tpgetrply() 와 같은 메시지를 받는 API는 존재하

지 않는다.

예)

context=WinTmaxSetContext(m_hWnd, WM_TMAX_RECV_ERR, -1);

int Result = WinTmaxSend(context, “TOUPPER”, (char*)buf, 0, TPNOFLAGS);

if (Result<0) {

error process routine ....

}

Page 172: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

171 Tmax C Programming Guide

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

여기 에서는 C 를 이용하여 작성된 윈도우즈 환경의 프로그램을 컴파일 하

는 방법에 대해 알아본다. MS VC++ 가 설치된 환경이라고 가정한다.

윈도우즈 환경에서는 별도의 mksvr 유틸을 제공하지 않는다.

메이크 파일

VC++ 의 nmake 유틸리티를 사용한다. 사용방법은 다음과 같다.

nmake /f <메이크 파일명>

서버 프로그램

1:

2:

3:

4:

5:

6:

7:

8:

9:

#

#

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)

Page 173: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

172Tmax C Programming Guide

APOBJS = $(TARGET2:.pc=.c)

SVCTSRC = $(TARGET:.exe=_svctab.c)

SVCTOBJ = $(TARGET:.exe=_svctab.obj)

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

#

#

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

1 : 오라클이 설치된 디렉토리를 지정한다.

2 : Tmax 가 설치된 디렉토리를 지정한다.

3 : 사용할 서버 라이브러리를 지정한다. TCS 방식의 경우 tmaxsvr.lib 를 UCS / RDP

방식의 경우는 tmaxucs.lib 을 사용한다.

4 : 오라클 라이브러리를 지정한다.

5 : 구조체 버퍼를 사용하는 경우 /D _USE_SDL 을, tpsvrinit() 및 tpsvrdone() 루틴

을 사용하는 경우 /D_USE_TPSVRINIT 을 지정한다.

6 : 오라클에서 제공하는 proc 컴파일러를 이용한 프리컴파일 과정에 사용되는 옵션

이다.

7 : 실행 파일명을 지정한다.

8 : 확장자를 제외한, 컴파일을 할 파일명이다.

9 : 사용하는 구조체 파일명이다.

Page 174: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

173 Tmax C Programming Guide

클라이언트 프로그램

1:

2:

3:

4:

#

#

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)

1 : Tmax 가 설치된 디렉토리이다.

2 : 사용하는 Tmax 클라이언트 라이브러리이다. tmax.lib, tmaxmt.lib, Wintmax.lib 중

사용하고자 하는 라이브러리를 지정한다.

3 : 컴파일 플래그이다. 사용자가 사용한 API 에 따라 MD, MT, ML 을 지정할 수 있

으며 tmaxmt.lib Wintmax.lib 을 사용하는 경우 ML 은 사용하지 못한다.

4 : 실행파일명을 지정한다. 컴파일 대상도 같이 정해진다.

Page 175: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

174Tmax C Programming Guide

7. Tmax 보안 시스템

Tmax는 시스템 접속 제어, 사용자 인증, 서비스 접근 제어의 3단계로 보

안 기능을 제공하고 있다.

각 단계의 보안 기능 설정은 Tmax 시스템 환경파일의 도메인절에서 설정

한다. 도메인절의 SECURITY항목은 “DOMAIN_SEC”, “USER_AUTH”, “ACL_SVG” 을 설정할 수 있으며 각각 시스템 접속 제어, 사용자 인증, 서

비스 접근제어 보안을 의미한다. 이 값이 “NO_SECURITY” 라면 보안 기능

은 사용되지 않는다.

7.1 1단계 보안: 시스템 접속 제어

시스템 접속 보안은 1단계 보안으로 클라이언트가 Tmax 시스템에 접속 하

고자 할 때 이를 제한 할수 있도록 한다. 이는 해당 Tmax 시스템에 대한

단일 암호를 설정하는 것으로 도메인절의 OWNER 항목에 정의된 계정의

암호를 의미한다. 이 계정과 암호는 Tmax 시스템이 기동되기 전에 mkpw

유틸리티로 미리 만들어져야 한다. 시스템 접속제어 보안이 설정되면 클라

이언트는 Tmax 시스템 접속시 TPSTART_T 구조체의 dompwd 항목에 해

당 암호를 등록해야 하며 그 암호가 옳은 경우에만 접속에 성공하게 된다.

mkpw 유틸리티의 사용법은 Tmax Reference Guide 를 찾아보기 바란다.

1단계 보안을 사용하는 Tmax 환경 파일의 예

#시스템 인증인 경우 SECURITY항목에 “DOMAIN_SEC”라고 설정한다.

*DOMAIN

res1 SHMKEY = 66999, MAXUSER=256,

Page 176: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

175 Tmax C Programming Guide

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

...

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

}

...

}

Page 177: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

176Tmax C Programming Guide

7.2 2단계 보안: 사용자 인증

사용자 인증 보안은 2단계 보안으로써 Tmax시스템에 인증된 사용자만이

Tmax시스템 접속을 허락한다.

클라이언트는 Tmax 시스템에 접속할 때 tpstart() 의 인수로 TPSTART_T

구조체의 usrname 과 usrpwd 항목을 등록하여야 한다. usrname은 Tmax

시스템에 인증된 사용자 계정이며 usrpwd 는 그에 대한 암호가 된다. 여기

서 사용자 계정과 암호는 Tmax 시스템의 기동전에 관리자에 의해 mkpw

유틸리티로 만들어져 있어야 한다. mkpw 유틸리티에 관한 내용은 Tmax

Reference Guide를 참조하도록 한다.

이러한 사용자 인증 보안이 설정되었다면 해당 계정이 Tmax시스템에 인증

된 것으로 확인되어야 접속에 성공한다. 사용자 인증 보안은 시스템 접속

제어 보안의 다음 단계로써 시스템 접속 제어 보안을 포함하므로 클라이언

트는 dompwd 항목도 정확하게 입력 하여야 한다.

2단계 보안을 사용하는 Tmax 환경 파일의 예

*DOMAIN

res1 SHMKEY = 66999, MAXUSER=256,

SECURITY = “USER_AUTH”, OWNER=tmax

*NODE

tmax TMAXDIR = “/home/tmax”,

APPDIR = “/home/tmax/appbin”

*SVRGROUP

svg1 NODENAME = tmax

Page 178: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

177 Tmax C Programming Guide

*SERVER

upper SVGNAME = svg1, RESTART=Y,

AXRSTART=3

*SERVICE

TOUPPER SVRNAME = upper

TOLOWER SVRNAME = upper, PRIO=100

Ex 2)

...

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 179: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

178Tmax C Programming Guide

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

Page 180: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

179 Tmax C Programming Guide

TOUPPER SVRNAME = upper

TOLOWER SVRNAME = upper, PRIO=100

Ex 2)

...

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, “secret ”) ;

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

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

printf(“tpstart failed, errno=%s\n”, tpstrerror(tperrno));

exit (1) ;

}

...

}

Page 181: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

180Tmax C Programming Guide

8. 디버깅

Tmax 의 API 는 에러가 발생하는 경우 상황에 따른 적절한 에러 번호를 설정

하여 준다. 에러 메시지를 참고하면 에러에 대한 원인 규명에 많은 도움을 줄

것이다. 이외에 API 내부 시스템 콜 레벨의 에러정보가 알고 싶다면

tuxinc/Uunix.h 에 정의되어 있는 에러메시지와 API 들이 도움을 줄 것이다.

어플리케이션 레벨이 아닌 Tmax 시스템 운영상에 발생하는 문제를 도출하는데

도움을 주기위해 운영상의 여러가지 정보를 콘솔에 뿌려주는 디버깅용 CLH 를

제공하고 있으니 참고하기 바란다.

8.1 API 레벨 에러 처리

Tmax API 가 실패하는 경우의 리턴 값은 API 마다 다르며 전역변수 tperrno

에는 에러 상황에 대한 에러 번호가 설정된다. Tmax 운영 중에 발생하는 에러

메시지는 Tmax Message Manual 를 참조하기 바란다.

tpstrerror

int tpstrerror (int errno)

errno 알고 싶은 에러 메시지의 에러 번호이다.

Ex )

Page 182: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

181 Tmax C Programming Guide

...

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 에서 지원하지 않는

인수를 사용한 경우이다.

TPELIMIT 5 시스템 자원 또는 Tmax에서 제

공하는 자원의 부족이다.

운영체제에서 제공하는 자원, 예를

들면 FD_SET이 부족한 경우이다.

TPENOENT 6 서비스테이블에 존재하지 않는

서비스를 호출한 경우이다.

환경파일이 수정되었다면 gst 로

서비스 테이블을 새로 만들어 서버

응용프로그램 컴파일시 같이 컴파

일 해 주어야 한다

TPEOS 7 OS 레벨의 오류이다. 예를 들면

malloc() 등이 실패한 경우이다.

운영체제를 비롯하여 네트웍 및 기

존 운영되던 환경이 변경되었는지

제반환경을 점검해 보아야 한다

- 8 사용되지 않는다. -

TPEPROTO 9 부적절한 상황에서 API가 호출

되었다.

tpstart() 가 두번 수행되거나 서비

스를 재귀적으로 호출한 경우이다.

대화형 모드에서 대화 주도권이 없

Page 183: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

182Tmax C Programming Guide

Tmax 응답 코드 내 용 조치 사항

는 쪽에서 송신을 시도하는 경우

등에도 발생한다.

TPESVCERR 10 정상적으로 서비스가 종료되지

않았다.

tpreturn() 으로 서비스 완료시 종

료되지 않은 대화형 모드나 비동기

형 서비스 호출이 남아 있는 경우,

서비스 루틴 내에서 시작된 트랜잭

션이 완료되지 않은 경우이다.

TPESVCFAIL 11 서비스 루틴에서 서비스 수행을

실패한 것으로 간주하였다.

tpreturn() 에 TPSUCCESS 이외

의 값을 지정하여 클라이언트에게

넘긴 경우이다. 정상적인 서비스

실패이다.

TPESYSTEM 12 Tmax 시스템에 이상이 발견되

었다.

주로 네트워크 에러로 인해 발생하

며 이경우 tpreset() 을 사용한 후

재접속 하도록 한다..

TPETIME 13

환경 파일 혹은 어플리케이션에

서 설정한 타임 아웃 시간을 초

과하였다.

타임아웃 시간을 조절하거나 네트웍

설정상의 문제가 없는지 조사한다.

TPETRAN 14

트랜잭션을 지원하지 않는 서비

스를 트랜잭션 모드로 호출 하였

해당 API의 플래그를 TPNOTRAN

으로 설정하여 사용한다.

TPEGOTSIG 15 TPSIGRSTRT가 설정되지 않은

상태에서 시그널이 수신되었다

시그널을 사용하는 경우 해당 API

를 TPSIGRSTRT를 설정하여 사용

한다.

- 16 사용되지 않는다. -

TPEITYPE 17 버퍼 타입을 잘못 사용한 경우이

다.

Tmax 에서 지원되지 않는 버퍼타

입을 사용하였거나 해당 API 에서

사용할 수 없는 버퍼를 사용한 경

우, DDR 사용시 라우팅을 할수

없는 버퍼를 사용한 경우이다.

TPEOTYPE 18

클라이언트와 서버프로그램의 버

퍼 타입이 서로 일치하지 않는

경우이다.

TPNOCHANGE 가 설정된 경우

서버에서 보낸 버퍼 타입과 클라이

언트가 제공한 버퍼 타입이 일치

하지 않는 경우이다.

- 19 사용되지 않는다. -

- 20 사용되지 않는다, -

Page 184: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

183 Tmax C Programming Guide

Tmax 응답 코드 내 용 조치 사항

- 21 사용되지 않는다. -

TPEEVENT 22 대화형 모드에서 이벤트가 발생

한 경우이다.

이벤트가 발생하였다. 자세한 내용

은 revent 에 설정된다

TPEMATCH 23

RQ 사용시 발생하며 서비스명에

해당하는 데이터가 저장되어 있

지 않은 경우이다.

tpdeq() 로 데이터를 꺼내올 때

RQ 데이터 파일 내에 서비스 이름

에 해당하는 데이터가 존재하지 않

는다.

TPENOREADY 24

서비스가 준비되지 않은 것이거

나 구동은 되어있으나 활성화가

안돼 있는 경우이다.

tmadmin 에서 st –s 로 서비스에

대한 상태를 확인해 보아 NRDY로

나타난다면 제대로 구동되어 있지

않은 것이다. 서버 프로세서를 다

시 확인하고 다시 구동해야 한다.

TPESECURITY 25

Tmax 보안 시스템에 설정되지

않은 사용자가 접속을 시도하였

다.

사용자 아이디와 암호등을 확인한

다.

TPEQFULL 26 요청된 서비스가 지정한 Max

Queue에 도달했다.

Tmax환경파일에서 또는 동적으로

Tmadmin Tool에서 Max Queue값

을 조절 할 수 있다.

TPEQPURGE 27

큐에 저장된 클라이언트의 서비

스 요청을 관리자가 지운 경우이

다.

관리자는 ASQCOUNT 등으로 서

비스의 부하를 조절하는 설정을 하

도록 한다.

TPECLOSE 28 Tmax가 구동되지 않았거나 접

속을 할 수 없는 경우이다.

Tmax 시스템이 정상적으로 구동

되었는지를 확인한다.

TPESVRDOWN 29 서버 프로세스가 다운된 상태이

다.

서버프로세서의 정상 작동 중인지

를 확인해 본다.

TPEPRESVC 30 전처리 서비스 수행시 에러가 발

생하였다.

RQ사용시 PRESVC를 지정하여 사

용할 수 있는데 이때 전처리 서비

스에서 오류가 발생하였다.

TPEMAXNO 31

운영중인 Tmax 시스템이 한번

에 관리할 수 있는 최대 사용자

수를 초과하였다.

클라이언트 접속 상태를 확인한 후

타임아웃 시간등을 조절한다.

표3-6. Tmax 함수 에러 메세지

Page 185: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

184Tmax C Programming Guide

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

Tmax API 는 많은 시스템 콜을 사용한다. 운영체제나 플랫폼 상에 문제가 있어

서 특정 시스템 콜에서 에러가 나는 경우 이를 확인하고 싶을 때나 에러메시지

가 다른 이종 플랫폼으로 포팅하고자 하는 경우 에러메시지를 통합하여 관리하

고 싶을 때 아래에 소개하는 API 를 사용하면 많은 도움이 될 것이다.

사용하는 헤더 파일의 위치는 TMAXDIR/tuxinc/Uunix.h 이다.

Uunixerr

int Uunix_err 시스템 콜 도중 에러발생시 통합된 에러번호가 설정되는 변수이다.

Uunix_err

void Uunix_err (char *msg)

msg 에러가 난 시스템 콜에 앞서 추가하고 싶은 메시지 이다. 일반적으로

프로그램 명을 기록한다.

예)

ret=tmaxreadenv("NO THAT FILE", "TMAX");

if (ret<0)

{

Uunix_err("myprog");

Page 186: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

185 Tmax C Programming Guide

exit(1);

}

결과:

mypog: UOPEN

Ustrerror

char * Uunix_err (int err)

err 알고 싶은 에러 메시지의 통합 에러 번호이다.

예)

ret=tmaxreadenv("NO THAT FILE", "TMAX");

if (ret<0)

{

printf("%d->%s\n", Uunixerr, Ustrerror(Uunixerr));

exit(1);

}

결과:

11->UOPEN

Page 187: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

186Tmax C Programming Guide

8.3 디버그 CLH

TMAXDIR/bin 디렉토리에 clh.dbg 라는 이름의 파일이 있다. 이 파일을

clh 로 이름을 바꾸어 사용하면 CLH 에서 이루어지는 모든 메시지 전달의

내용을 확인할 수 있다. 반드시 원본 clh 를 백업해 두도록 한다.

예)

/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 188: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

187 Tmax C Programming Guide

8.4 디버그 라이브러리

TMAXDIR/lib 디렉토리에 libsvrd.a / libsvr.so 라는 라이브러리가 존재한

다. libsvr.a / libsvr.so 대신에 이들 라이브러리를 사용하면 콘솔창으로 여

러가지 데이터값을 보여주므로 서버 라이브러리에서 일어나는 흐름을 파악

할 수 있고 에러가 발생하는 시점을 찾는데도 편리하다. libsvrd.so 의 경우

이름만 libsvr.so 로 이름만 바꿔쓰면 되며 libsvrd.a 의 경우는 재컴파일을

필요로 한다.

예)

/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

LIB: read 96 bytes

register_to_tmm success

......

Page 189: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

188Tmax C Programming Guide

IV. Tmax 어플리케이션 예제

4장 에서는 앞서 설명한 API 들을 사용하여 개발된 실제 어플리케이션의

예제를 보여준다. 가장 기본적인 프로그램에서 DB를 사용하거나 좀 더 응

용된 예제를 보여줌으로써 사용자는 기본적인 사용법 외에도 Tmax 를 이

용한 프로그래밍 기법에 대해서도 익숙하게 될 것이다.

기초 프로그램

DB 적용 프로그램

응용 프로그램

Page 190: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

189 Tmax C Programming Guide

1. 기초 프로그램

이 장에서는 Tmax 에서 사용하는 세가지 통신형인 동기형, 비동기형, 대화

형 어플리케이션의 간단한 예를 제시하여 전체적인 흐름에 대한 이해를 돕

는다.

1.1 동기형 통신

클라이언트는 string 형 버퍼에 문자열을 복사해서 서비스를 호출하고 서버

측의 서비스 루틴은 이 문자열을 받아서 대문자열로 바꾸어 리턴해주는 프

로그램이다.

클라이언트 부분

- Tmax 연결 : 기본 연결(클라이언트 정보 없음).

- 사용 버퍼 : STRING

- 통신 유형 : tpcall() 을 이용한 동기형 통신

서버 부분

- 서비스 : TOUPPERSTR

- 데이터베이스 연결: 없음

Page 191: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

190Tmax C Programming Guide

클라이언트 프로그램

#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 192: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

191 Tmax C Programming Guide

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

}

Page 193: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

192Tmax C Programming Guide

서버 프로그램(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);

}

Page 194: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

193 Tmax C Programming Guide

Tmax 환경파일

*DOMAIN

resrc SHMKEY = 77990, MAXUSER = 256

*NODE

tmax TMAXDIR = “/home/tmax”,

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

Page 195: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

194Tmax C Programming Guide

1.2 비동기형 통신

클라이언트는 구조체형 버퍼의 멤버에 문자열을 복사해서 서비스를 호출하

고 서버측의 서비스 루틴은 이 문자열을 받아서 소문자열 혹은 대문자열로

바꾸어 리턴해주는 프로그램이다.

클라이언트는 비동기형 통신으로 TOUPPER서비스를 요청하고 다시 동기

형으로 TOLOWER 서비스를 호출하여 결과를 받은 다음 앞서 요청한

TOUPPER 서비스의 수행결과를 받는다.

클라이언트 부분

- Tmax 연결 : 기본 연결

- 사용 버퍼 : 구조체 버퍼(STRUCT)

- 통신 유형 : 동기형 및 비동기형

서버 부분

- 서비스 : TOUPPER, TOLOWER.

- 데이터베이스 연결: 없음

사용 구조체 버퍼(demo.s)

struct strdata {

int flag;

char sdata[20];

};

Page 196: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

195 Tmax C Programming Guide

클라이언트 프로그램

#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); if (sendbuf1 == NULL) {

fprintf(stderr, “Error allocation send1 buffer\n”); tpend(); exit(1) ;

Page 197: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

196Tmax C Programming Guide

}

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

}

Page 198: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

197 Tmax C Programming Guide

서버 프로그램(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 199: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

198Tmax C Programming Guide

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

Page 200: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

199 Tmax C Programming Guide

1.3 대화형 통신

클라이언트는 사용자의 입력을 받아 STRING 버퍼를 통해 고유번호를 보내

며 서버측의 서비스 루틴은 DB 에 저장된 테이블에서 그 고유번호보다 큰

번호를 가지는 고객정보를 구조체를 통해 리턴해준다.

클라이언트는 대화형 모드를 설정하면서 고유번호를 보내며 대화 주도권은

서버측에 넘긴다. 서버측은 조건을 만족하는 DB의 모든 데이터를 커서를

통해 읽어서 클라이언트로 보낸다. 클라이언트는 TPEVSVCSUCC 를 통해

이상없이 모든 데이터를 읽어왔다는 것을 확인 할 수 있다.

클라이언트 부분

- Tmax 연결 : 기본 연결

- 사용 버퍼 : 보내는 버퍼 STRING형, 받는 버퍼 구조체형(STRUCT)

- 통신 유형 : 대화형 통신

서버 부분

- 서비스 : MULTI.

- 데이터베이스 연결 : 오라클 사용

사용 구조체 버퍼(demo.s)

struct sel_o {

char seqno[10];

char corpno[10];

char compdate[8];

int totmon;

float guarat;

float guamon;

} ;

Page 201: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

200Tmax C Programming Guide

클라이언트 프로그램

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

}

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

Page 202: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

201 Tmax C Programming Guide

}

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

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,

Page 203: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

202Tmax C Programming Guide

rcvbuf->guamon) ; }

tpfree(sndbuf) ; tpfree((char *)rcvbuf); tpend () ; printf( "FINISH\n");

}

Page 204: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

203 Tmax C Programming Guide

서버 프로그램(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; memset(seq, 0, 10); strcpy(seq, msg->data); if ((sndbuf = (struct sel_o *) tpalloc (“STRUCT”, “sel_o”, 0)) == NULL) {

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;

Page 205: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

204Tmax C Programming Guide

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

} }

tpreturn (TPFAIL, sqlca.sqlcode, NULL, 0, TPNOFLAGS);

end_of_fetch: exec sql close democursor; printf(“tpreturn before”); tpreturn (TPSUCCESS, 0, NULL, 0, TPNOFLAGS);

}

Page 206: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

205 Tmax C Programming Guide

오라클 테이블 작성 스크립트

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

오라클 테이블 및 데이터 출력 스크립트

sqlplus scott/tiger << EOF

Desc multi_sel;

select * from multi_sel;

EOF

Page 207: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

206Tmax C Programming Guide

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=60”,

TMSNAME = svg1_tms

*SERVER

convsvc SVGNAME = svg1, CONV = Y

*SERVICE

MULTI SVRNAME = convsvc

추가 부분

1. DBNAME

사용하는 데이터베이스명 정의

2. OPENINFO

오라클 데이터베이스와 연동하기 위한 연결 정보 설정

3. TMSNAME

전역 트랜잭션 처리를 주재하는 프로세스 이름 설정

4. CONV = Y

대화형 모드 서버 지정

Page 208: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

207 Tmax C Programming Guide

2. DB 적용 프로그램

이 장에서는 대표적인 DB인 오라클과 인포믹스를 사용하는 몇가지 예제를

제시한다.

2.1 오라클 Insert 프로그램

클라이언트는 사용자의 입력을 받아 구조체 버퍼에 넣어 서비스를 호출하

며 서버측은 이를 받아 해당 테이블에 추가해준다. 클라이언트는 트랜잭션

을 지정하여 에러가 발생하였을 경우 롤백할 수 있도록 한다.

클라이언트 부분

- Tmax 접속 : 기본 접속

- 사용 버퍼 : 구조체 버퍼(STRUCT) 사용

- 통신 유형 : tpcall() 에 의한 동기 통신

- 트랜잭션 처리: 클라이언트에서 트랜잭션 범위 지정

서버 부분

- 서비스 : ORAINS

- DB 연결 : 오라클 데이터베이스

사용 구조체 버퍼(demo.s)

struct ktran {

int no;

char name[20];

};

Page 209: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

208Tmax C Programming Guide

클라이언트 프로그램

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

Page 210: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

209 Tmax C Programming Guide

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

}

Page 211: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

210Tmax C Programming Guide

서버 프로그램(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”);

/* 데이터베이스에 삽입 */ 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);

}

Page 212: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

211 Tmax C Programming Guide

오라클 테이블 작성 스크립트

sqlplus scott/tiger << EOF

create table testdb1 (

no number(7),

name char(30)

) ;

EOF

오라클 테이블 및 데이터 출력 스크립트

sqlpus scott/tiger << EOF

desc testdb1;

select * from testdb1;

select count (*) from testdb1;

EOF

Page 213: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

212Tmax C Programming Guide

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=60”,

TMSNAME = svg1_tms

*SERVER

oinssvc SVGNAME = svg1, MIN = 1, MAX = 5

*SERVICE

ORAINS SVRNAME = oinssvc

추가 부분

1. DBNAME

사용하는 데이터베이스 정의

2. OPENINFO

오라클 데이터베이스 연결 정보 설정

tpsvrinfo()에서 호출.

오라클 데이터베이스인 경우 CLOSEINFO는 지정하지 않아도 됨

3. TMSNAME

트랜잭션 처리를 주재하는 프로세스 이름 지정

4. OPENINFO 지정으로 인한 자동 트랜잭션 처리

svg1에 속한 해당 서비스를 자동 트랜잭션 상태에서 처리

Page 214: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

213 Tmax C Programming Guide

2.2 오라클 Select 프로그램

클라이언트는 사용자의 입력을 받아 구조체 버퍼에 넣어 서비스를 호출하

며 서버측은 이에 해당하는 모든 데이터를 받아 구조체 배열을 사용하여

결과를 리턴한다. 클라이언트는 트랜잭션을 지정하여 에러가 발생하였을 경

우 롤백할 수 있도록 한다.

클라이언트 부분

- Tmax 접속 : 기본 접속

- 사용 버퍼 : 구조체 버퍼(STRUCT) 사용

- 통신 유형 : tpcall() 에 의한 동기 통신

- 트랜잭션 처리: 클라이언트에서 트랜잭션 범위 지정

서버 부분

- 서비스 : ORASEL

- DB 연결: 오라클 데이터베이스

- 필요에 의해 버퍼 크기를 재조정

사용 구조체 버퍼 (demo.s)

struct stru_his{

long ACCOUNT_ID ;

long TELLER_ID ;

long BRANCH_ID ;

long AMOUNT ;

} ;

Page 215: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

214Tmax C Programming Guide

클라이언트 프로그램

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

Page 216: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

215 Tmax C Programming Guide

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

Page 217: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

216Tmax C Programming Guide

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

printf(“No records selected!\n”); tpfree((char *)transf); tpend(); return 0;

}

tpfree((char *)transf); tpend();

}

Page 218: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

217 Tmax C Programming Guide

서버 프로그램(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 *)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

h t id k /* t id가 li t에서 보낸 k 값 보다 큰 것을

Page 219: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

218Tmax C Programming Guide

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

} tpreturn(TPSUCCESS, lastno, transf, i * sizeof(struct stru_his), TPNOFLAGS );

}

Page 220: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

219 Tmax C Programming Guide

오라클 테이블 작성 스크립트

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

오라클 테이블 및 데이터 출력 스크립트

sqlplus scott/tiger << EOF

desc sel_his;

select * from sel_his;

EOF

Page 221: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

220Tmax C Programming Guide

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

추가 부분

1. DBNAME

사용 데이터베이스명 설정

2. OPENINFO

오라클 데이터 베이스 연결 정보 설정

오라클에서는 CLOSEINFO는 설정 안해도 됨

3. TMSNAME

트랜잭션 처리를 관리하는 프로세스 이름 지정

4. AUTOTRAN

해당 서비스 처리시 자동으로 트랜잭션 상태로 처리

Page 222: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

221 Tmax C Programming Guide

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나는 상황을 피할 수 있다.

Page 223: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

222Tmax C Programming Guide

2.3 인포믹스 Insert 프로그램

클라이언트는 사용자의 입력을 받아 구조체 버퍼에 넣어 서비스를 호출하

며 서버측은 이를 받아 해당 테이블에 추가해준다. 클라이언트는 트랜잭션

을 지정하여 에러가 발생하였을 경우 롤백할 수 있도록 한다.

클라이언트 부분

- Tmax 접속 : 기본 접속

- 사용 버퍼 : 구조체 버퍼(STRUCT) 사용

- 통신 유형 : tpcall() 에 의한 동기 통신

- 트랜잭션 처리: 클라이언트에서 트랜잭션 범위 지정

서버 부분

- 서비스 : INSERT

- DB 연결: 인포믹스 데이터베이스

사용 구조체 버퍼(demo.s)

struct info {

char seq[8];

char data01[128];

char data02[128];

char data03[128];

} ;

Page 224: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

223 Tmax C Programming Guide

클라이언트 프로그램

#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”); strcpy(transf->data02, “World”); strcpy(transf->data03, “1234”); /* 트랜잭션 timeout 설정 * / tx_set_transaction_timeout (30);

Page 225: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

224Tmax C Programming Guide

/* 트랜잭션 시작을 알림. */ 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 226: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

225 Tmax C Programming Guide

서버 프로그램(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 227: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

226Tmax C Programming Guide

{ /* 인서트 실패를 알린다. */ printf(“SQL error => %d !” ,sqlca.sqlcode); tpreturn (TPFAIL, sqlca.sqlcode, NULL, 0, TPNOFLAGS);

} /* 인서트가 성공적으로 끝났을 때 */ tpreturn (TPSUCCESS, 0, NULL, 0, TPNOFLAGS);

}

Page 228: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

227 Tmax C Programming Guide

인포믹스 테이블 작성 스크립트

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

인포믹스 테이블 및 데이터 출력 스크립트

dbaccess << EOF

database stores7;

select * from testdb1;

EOF

Tmax 환경 파일

Page 229: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

228Tmax C Programming Guide

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

추가 부분

1. DBNAME

사용 데이터베이스명 설정

2. OPENINFO, CLOSEINFO

인포믹스 데이터베이스 연결 및 해제를 위한 정보

tpsvrinfo(), tpsvrdone()에서 호출

3. TMSNAME

트랜잭션 처리를 주재하는 프로세스 이름 지정.

4. OPENINFO 지정으로 인한 자동 트랜잭션 처리

svg1에 속한 해당 서비스를 자동 트랜잭션 상태에서 처리

Page 230: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

229 Tmax C Programming Guide

2.4 인포믹스 Select 프로그램

클라이언트는 사용자의 입력을 받아 구조체 버퍼에 넣어 서비스를 호출하

며 서버측은 이에 해당하는 모든 데이터를 받아 구조체 배열을 사용하여

결과를 리턴한다. 클라이언트는 트랜잭션을 지정하여 에러가 발생하였을 경

우 롤백할 수 있도록 한다.

클라이언트 부분

- Tmax 접속 : 기본 접속

- 사용 버퍼 : 구조체 버퍼(STRUCT) 사용

- 통신 유형 : tpcall() 에 의한 동기 통신

- 트랜잭션 처리: 클라이언트에서 트랜잭션 범위 지정

서버 부분

- 서비스 : SEL_ACCT

- DB 연결: 인포믹스 데이터베이스

- 필요에 의해 버퍼 크기를 재조정

사용 구조체 버퍼 (demo.s)

struct stru_acct {

int ACCOUNT_ID;

char PHONE[20];

char ADDRESS[80];

} ;

Page 231: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

230Tmax C Programming Guide

클라이언트 프로그램

#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 = 시작시간 */

Page 232: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

231 Tmax C Programming Guide

htime(ts,&sec1); key=0; /* 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( ) ; e x i t ( 1 ) ;

} urcode = tpurcode;

Page 233: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

232Tmax C Programming Guide

/*성공적인 서비스 완결 : transaction결과로 실제 resource변화시킴*/ if (tx_commit() < 0 ) {

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

Page 234: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

233 Tmax C Programming Guide

/* message buffer free */ tpfree ((char *)transf); /* Tmax 연결을 끊음. */ tpend (); /* 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); }

Page 235: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

234Tmax C Programming Guide

서버 프로그램(sel_acct.pc)

#include <stdio.h> #include <usrinc/atmi.h> #include <usrinc/tx.h> #include “acct.s” #define NFETCH 5 #define NOTFOUND 100

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 초기화*/

Page 236: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

235 Tmax C Programming Guide

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

Page 237: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

236Tmax C Programming Guide

} 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; 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 238: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

237 Tmax C Programming Guide

인포믹스 테이블 작성 스크립트

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

인포믹스 테이블 및 데이터 출력 스크립트

dbaccess << EOF

database stores7;

select * from ACCOUNT;

EOF

Page 239: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

238Tmax C Programming Guide

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

추가 부분

1. DBNAME

사용 데이터베이스 설정.

2. OPENINFO, CLOSEINFO

인포믹스 데이터베이스에 연결 및 해제를 위한 정보

tpsvrinit(), tpsvrdone()에서 호출

3. TMSNAME

트랜잭션 처리를 주재하는 프로세스 이름 지정.

4. OPENINFO 지정으로 인한 자동 트랜잭션 처리

svg1에 속한 해당 서비스를 자동 트랜잭션 상태에서 처리

Page 240: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

239 Tmax C Programming Guide

3. 응용 프로그램

이 장에서는 어플리케이션 개발시에 응용하여 사용할 수 있는 예제를 제시

하며 이를 통해 실제 프로그래밍 시의 기법을 보여준다.

3.1 글로벌 트랜잭션 처리 프로그램

클라이언트는 사용자의 입력을 받아 구조체 버퍼를 통해 고유번호와 데이

터를 보내며 서버측은 해당 고유번호의 데이터를 업데이트 하고 이 데이터

로 다른 DB를 사용하는 서비스를 호출하여 테이블에 추가한다.

클라이언트는 이 모든 과정을 하나의 트랜잭션으로 지정하여 에러가 발생

하였을 경우 두개의 DB를 동시에 롤백할 수 있도록 한다.

그림3-1. 두개의 DB 접속

Page 241: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

240Tmax C Programming Guide

클라이언트 부분

- Tmax 접속 : 기본 접속

- 사용 버퍼 : 구조체 버퍼(STRUCT) 사용

- 통신 유형 : tpcall() 에 의한 동기 통신

- 트랜잭션 처리: 클라이언트에서 트랜잭션 범위 지정

서버 부분

- 서버 프로그램 : 서로 다른 DB를 사용하는 2개의 서버 프로그램

- 서비스 : UPDATE, INSERT

- DB 연결 : 두 종류의 오라클 데이터베이스

사용 구조체 버퍼(demo.s)

struct input {

int account_id;

int branch_id;

char phone[15];

char address[61];

};

Page 242: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

241 Tmax C Programming Guide

클라이언트 프로그램

#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[]) {

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

Page 243: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

242Tmax C Programming Guide

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

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

}

Page 244: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

243 Tmax C Programming Guide

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

Page 245: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

244Tmax C Programming Guide

서버 프로그램(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; 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;

Page 246: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

245 Tmax C Programming Guide

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 247: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

246Tmax C Programming Guide

서버 프로그램(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); }

Page 248: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

247 Tmax C Programming Guide

account_id = rcvbuf->account_id; branch_id = rcvbuf->branch_id; strcpy(phone, rcvbuf->phone); 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); }

Page 249: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

248Tmax C Programming Guide

오라클 테이블 작성 스크립트

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

CONSTRAINT ACCOUNT_PK PRIMARY KEY(ACCOUNT_ID)

);

quit

EOF

Page 250: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

249 Tmax C Programming Guide

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

*SERVER

update SVGNAME=svg1

insert SVGNAME=svg2

Page 251: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

250Tmax C Programming Guide

*SERVICE

UPDATE SVRNAME=update

INSERT SVRNAME=insert

Page 252: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

251 Tmax C Programming Guide

3.2 대화형 모드를 이용한 DB 사용

클라이언트는 사용자의 입력을 받아 구조체 버퍼를 통해 고유번호와 데이

터를 보내며 서버측은 해당 고유번호의 데이터를 업데이트 한다. 클라이언

트와 서버는 이 과정을 10회 반복한다.

클라이언트는 트랜잭션을 선언하고 대화형 모드를 설정하며 대화 주도권은

자신이 가진다. 클라이언트는 고유번호와 데이터를 보내면서 대화 주도권을

서버측에 넘기며 서버측은 해당 고유번호의 데이터를 업데이트 하고 성공

을 알리는 메시지와 함께 다시 클라이언트 쪽으로 대화 주도권을 넘긴다.

마지막 열번째에 서버는 대화 주도권을 넘기지 않고 tpreturn() 을 수행하

며 클라이언트는 TPEV_SVCSUCC 이벤트를 받고 트랜잭션을 커밋한다.

그림3-4. 대화형 모델 흐름도

Page 253: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

252Tmax C Programming Guide

클라이언트 부분

- Tmax 연결 : 기본 연결

- 사용 버퍼 : 보내는 버퍼 STRING형, 받는 버퍼 구조체형(STRUCT)

- 통신 유형 : 대화형 통신

- 클라이언트는 트랜잭션 범위를 설정

서버 부분

- 서비스 : UPDATE.

- 데이터베이스 연결 : 오라클 사용

사용 구조체 버퍼(demo.s)

struct input {

int account_id;

int branch_id;

char phone[15];

char address[61];

};

Page 254: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

253 Tmax C Programming Guide

클라이언트 프로그램

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

Page 255: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

254Tmax C Programming Guide

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

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

}

Page 256: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

255 Tmax C Programming Guide

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); tx_rollback(); tpend(); exit(1);

} printf("rcvbuf = [%s]\n", rcvbuf);

Page 257: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

256Tmax C Programming Guide

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

Page 258: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

257 Tmax C Programming Guide

서버 프로그램(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; 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;

Page 259: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

258Tmax C Programming Guide

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

}

Page 260: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

259 Tmax C Programming Guide

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

Page 261: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

260Tmax C Programming Guide

오라클 테이블 작성 스크립트

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

CONSTRAINT ACCOUNT_PK PRIMARY KEY(ACCOUNT_ID)

);

quit

EOF

Page 262: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

261 Tmax C Programming Guide

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

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 263: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

262Tmax C Programming Guide

V. Tmax client Multithread / Multicontext

3.8.15 버전 이후부터는 클라이언트 라이브러리에 multithread를 위한 부분

이 추가되었다. 5장에서는 multithread를 사용하기 위해서 설정해 주어야

할 내용들이 설명되어 있다.

개요

Multithread/Multicontext 구현

Multithread/Multicontext API

예제

Page 264: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

263 Tmax C Programming Guide

1. 개요

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

Multithreading 이라는 것은 하나의 프로세스안에 하나 이상의 실행 unit을 가지고 있는 것이다. 따라서

Tmax Multithread 어플리케이션에서는 같은 프로세스에서 동시에 여러개의 서비스를 요청할 수 있다.

<그림 1> Tmax Client Multithread Application

위의 그림에서 볼수 있듯이 하나의 클라이언트 프로세스는 동시에 2개의 서비스를 호출할 수 있게 된다.

Page 265: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

264Tmax C Programming Guide

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

Multicontext란 하나의 클라이언트가 Tmax 시스템과 여러개의 연결을 맺고 통신할 수 있도록 하는 프

로그램 기법이다.

<그림 2> Tmax Client Multicontext Application

위의 그림에서 볼 수 있듯이 하나의 클라이언트는 여러개의 context를 가지며 각 context는 Tmax시스

템과 각각 하나씩의 connection을 맺고 통신하게 된다.

따라서 multicontext를 사용하는 경우 Tmax시스템은 하나의 user로 인식하게 된다.

1.3 Tmax의 Multithread/Multicontext 지원사항

Tmax 시스템은 Multithread/Multicontext에 대해 아래와 같은것들을 지원한다.

- Kernel-level packages : thread를 생성하고 소멸하는등의 프로그램은 개발자가 로직을 고려

하여 작성하여야 한다.

- C로 작성된 Multithead 어플리케이션 : Cobol로 작성된 Multithread 어플리케이션은 지원하지

않는다.

- C로 작성된 Multicontext 어플리케이션 : Cobol로 작성된 Multicontext어플리케이션은 지원하

지 않는다.

Page 266: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

265 Tmax C Programming Guide

2. Multithread/Multicontext 구현 Multithread및 Multicontext를 사용하기 위해서는 다음의 세가지 루틴을 따라 프로그램을 작성해야 한

다.

- Multithread/Multicontext 시작

- Multithread/Multicontext 구현

- Multithread/Multicontext 종료

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()라는 함수를 사용하여 리턴되는 값으로

확인할 수 있다.

2.2 Multithread/Multicontext 구현 구문

Multithread/Multicontext는 ATMI 함수들을 사용하여 구현한다. 이 ATMI 함수들을 사용할 때는 반드

시 현재 context인지를 알고 사용해야 정상적으로 사용할 수 있다.

Page 267: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

266Tmax C Programming Guide

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를

명시적으로 사용하여야 한다.

2.2.2 비동기형 통신

Multicontext를 사용하는 경우 같은 context를 같은 두개의 thread가 있는 경우 하나의 thread에서

tpacall()후 다른 thread에서 tpgetrply()를 사용하여 결과를 가져올 수 있다. 그러나 이렇게 사용할 때

는 tpacall()이 반드시 먼저 호출되어야 하므로 두 thread간에 우선 순위가 반드시 명확한 경우에 사용

해야 올바른 결과를 받아올 수 있으므로 조심해서 사용해야 한다. 그리고 동기형 통신과 마친가지로

TPINVALIDCONTEXT가 아닌 경우에 정상적으로 수행된다.

2.2.3 transaction

만약 하나의 thread에서 transaction을 시작하였다면, 그 thread와 같은 context를 쓰는 thread들은

transaction을 시작한 이후부터 하나의 transaction이 된다.

이렇게 사용하는 경우도 비동기형 통신과 마찬가지로 우선 순위가 명확한 경우에 사용하는것이 바람직

하다. 또한 TPINVALIDCONTEXT가 아닌 경우에 정상적으로 수행된다.

2.3 Multithread/Multicontext 종료 구문

tpend()함수를 통하여 Multithread/Multicontext를 종료하게 된다.

이 함수를 사용하지 않는 경우 context와 해당하는 thread에 대한 정보가 메모리에서 지워지지 않으므

로 나중에 문제가 발생할 수 있으므로, 반드시 context를 다 사용한 후에는 tpend()를 해 주어야 한다.

Page 268: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

267 Tmax C Programming Guide

3. Multithread/Multicontext API

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] Tmax 시스템에 에러가 발생하였다. 자세한 정보는 로그파일에 기록된다.

[TPEOS] 운영 시스템에 에러가 발생하였다.

참 조 tpsetctxt()

Page 269: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

268Tmax C Programming Guide

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]

잘못된 인자가 설정되었다. 첫번쨰 인자에 0 또는 TPINVALIDCONTEXT가 설정된

경우나, flags값에 0 이외의 값이 설정된 경우 등이다.

[TPENOENT]

첫번째 인자에 설정된 값이 설정 가능한 context가 아닌경우 발생한다.

[TPEINVAL]

tpstart()하기 전에 이 함수를 호출한 경우 발생한다.

tpstart()를 TPMULTICONTEXTS로 설정하지 않은 상태에서 이 함수를 호출한 경우

발생한다.

multicontext인 경우 0으로 설정된 경우에 발생한다.

[TPESYSTEM] Tmax 시스템에 에러가 발생하였다. 자세한 정보는 로그파일에 기록된다.

[TPEOS] 운영 시스템에 에러가 발생하였다.

참 조 tpgetctxt()

Page 270: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

269 Tmax C Programming Guide

4.예제 클라이언트 프로그램

/*********************************************************************************************/ /* Multi-thread/Multi-context Sample Program */ /* */ /* Tmax Soft Co. / QA */ /* remarks: Tmax의 TOUPPER 서비스가 구동되어 있어야 함. */ /*********************************************************************************************/ #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 271: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

270Tmax C Programming Guide

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; } } for(tcnt=0 ; tcnt<NUM_THREADS ; tcnt++) { pthread_join(p_thread[tcnt], &retVal); } scnt++; sleep(1); }

Page 272: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

271 Tmax C Programming Guide

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

Page 273: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

272Tmax C Programming Guide

printf("[THR:%d] thread finish\n",pthread_self()); return THRSUC; } /********************************************************************************/ /* Sub Process : delContext */ /********************************************************************************/ int delContext() { int i; 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; }

Page 274: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

273 Tmax C Programming Guide

i = tpgetctxt(&id,TPNOFLAGS); 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) { 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;

Page 275: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

274Tmax C Programming Guide

} 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); } tpfree((char *)sbuf); tpfree((char *)rbuf); } /********************************************************************************/ /* END */ /********************************************************************************/

서버 프로그램

#include <stdio.h> #include <usrinc/atmi.h> TOUPPER(TPSVCINFO *msg) { int i;

Page 276: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

275 Tmax C Programming Guide

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

Makefile

TARGET = $(COMP_TARGET) APOBJS = $(TARGET).o TMAXLIBD = $(TMAXDIR)/lib64 TMAXLIBS = -lcli #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:

Page 277: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

276Tmax C Programming Guide

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

Page 278: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

277 Tmax C Programming Guide

VI. INDEX 대화형 통신 ............................................................................................................................ 32, 110

메시지 송신(tpsend).................................................................................................................................................................115 메시지 수신(tprecv)..................................................................................................................................................................116 시작(tpconnect)..........................................................................................................................................................................113 연결 해제(tpdiscon)..................................................................................................................................................................119 예제(서버)...........................................................................................................................................................................199, 253 예제(클라이언트) .......................................................................................................................................................................196 예제(클라이언트) .......................................................................................................................................................................249 이벤트 .........................................................................................................................................................................................120 흐름도 ...........................................................................................................................................................................32, 110, 247 API 요약.....................................................................................................................................................................................111

데이터 버퍼 .................................................................................................................................... 25 버퍼 타입(tptypes)......................................................................................................................................................................44 버퍼 할당(tpalloc) .......................................................................................................................................................................40 버퍼 해제(tpfree) ........................................................................................................................................................................43 종류 ...............................................................................................................................................................................................26 표준 통신형 버퍼........................................................................................................................................................................27 표준 통신형 변환(구조체 버퍼) ...............................................................................................................................................27 표준 통신형 변환(필드 버퍼) ...................................................................................................................................................28 필드버퍼 .......................................................................................................................................................................................26 CARRAY, X_OCTET...................................................................................................................................................................26 STRING ........................................................................................................................................................................................26 STRUCT, X_C_TYPE...................................................................................................................................................................26 X_COMMON...............................................................................................................................................................................26

동기형 통신 .................................................................................................................................... 30 서비스 요청(tpcall) .....................................................................................................................................................................45 예제(클라이언트) ............................................................................................................................... 186, 204, 210, 219, 226, 237 흐름도 .....................................................................................................................................................................................30, 46

디버깅 ........................................................................................................................................... 177 디버그 CLH...............................................................................................................................................................................183 시스템 레벨 에러......................................................................................................................................................................181 API 레벨 에러...........................................................................................................................................................................177

멀티 캐스트 .......................................................................................................................... 147, 150 이벤트 가입(tpsubscribe).........................................................................................................................................................150 이벤트 가입해제(tpunsubscribe) ............................................................................................................................................153 이벤트 발생(tppost)..................................................................................................................................................................154

브로드 캐스트............................................................................................................................... 147

비동기형 통신................................................................................................................................. 31 서비스 요청(tpacall) ...................................................................................................................................................................49 서비스 응답(tpgetrply)...............................................................................................................................................................51

Page 279: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

1 Tmax C Programming Guide

예제(클라이언트) .......................................................................................................................................................................191 응답 취소(tpcancel) ....................................................................................................................................................................54 흐름도 .....................................................................................................................................................................................31, 52

비요청 메시지................................................................................................................................. 55 멀티 캐스트(이벤트) .................................................................................................................................................................150 브로드 캐스트(tpbroadcast) ....................................................................................................................................................147 수신 (tpgetunsol) ........................................................................................................................................................................57 처리방법 설정(tpinfo) ................................................................................................................................................................36 처리방법 설정(tpsetunsol_flag) ................................................................................................................................................55 클라이언트 아이디(tpsendtocli)................................................................................................................................................78 핸들러 설정 (tpsetunsol)...........................................................................................................................................................56

서버 프로그램................................................................................................................................... 8 개발환경 .......................................................................................................................................................................................12 컴파일(윈도우즈) .......................................................................................................................................................................168 컴파일(RDP)...............................................................................................................................................................................144 컴파일(TCS) .................................................................................................................................................................................80 컴파일(UCS)...............................................................................................................................................................................106 특징 ...............................................................................................................................................................................................14 흐름도(TCS) .................................................................................................................................................................................12 흐름도(UCS).................................................................................................................................................................................13 API 요약(TCS).............................................................................................................................................................................68 API 요약(UCS) ............................................................................................................................................................................91 TPSVCINFO 구조체 ...................................................................................................................................................................66

윈도우즈 환경............................................................................................................................... 155 컴파일 .........................................................................................................................................................................................168 tmaxmt.dll ..................................................................................................................................................................................156 WinTmax.dll ..............................................................................................................................................................................163

클라이언트 아이디 ......................................................................................................................... 76 클라이언트 아이디 검사(tpchkclid).........................................................................................................................................77 클라이언트 아이디를 얻음(tpgetclid)......................................................................................................................................76

클라이언트 프로그램 ............................................................................................................ 8, 10, 34 개발환경 .......................................................................................................................................................................................10 컴파일 ...........................................................................................................................................................................................61 컴파일(윈도우즈) .......................................................................................................................................................................170 특징 ...............................................................................................................................................................................................11 흐름도 ...........................................................................................................................................................................................10 API 요약.......................................................................................................................................................................................34 TPSTART_T 구조체....................................................................................................................................................................36

통신 유형.......................................................................................................................................... 9 대화형 통신 .................................................................................................................................................................................32 동기형 통신 .................................................................................................................................................................................30 비동기형 통신..............................................................................................................................................................................31

트랜잭션........................................................................................................................................ 121

Page 280: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

2Tmax C Programming Guide

2PC ..........................................................................................................................................................................................9, 121 로컬 .............................................................................................................................................................................................121 롤백(tx_rollback) .......................................................................................................................................................................127 시작(tx_begin)............................................................................................................................................................................124 에러 코드(XA error) .................................................................................................................................................................134 전역 .............................................................................................................................................................................................121 정보(tx_info) ..............................................................................................................................................................................131 중첩(nested) ...............................................................................................................................................................................121 커밋 시점(tx_set_commit_return) ..........................................................................................................................................130 커밋(tx_commot) .......................................................................................................................................................................125 타임아웃 설정(tx_set_transaction_timeout)..........................................................................................................................129 트랜잭션 모드(tx_set_transaction_control) ...........................................................................................................................130 ACID 특성 .................................................................................................................................................................................121 API 요약.....................................................................................................................................................................................122 Non-XA 모드.............................................................................................................................................................................122 XA 모드......................................................................................................................................................................................121

RDP .............................................................................................................................................. 142 컴파일 .........................................................................................................................................................................................144 환경설정 방법............................................................................................................................................................................142 환경설정 예 ...............................................................................................................................................................................143

RQ 시스템 .................................................................................................................................... 135 서비스 이름 반환(tpextsvcname)...........................................................................................................................................141 API 요약.....................................................................................................................................................................................135 RQ 메시지 반환(tpdeq) ...........................................................................................................................................................138 RQ 메시지 저장(tpenq) ...........................................................................................................................................................136 RQ 상태정보(tpqstat) ...............................................................................................................................................................140

TCS................................................................................................................................................. 66 구성 ...............................................................................................................................................................................................66 서버 종료 루틴(tpsvrdone) .......................................................................................................................................................75 서버 초기화 루틴(tpsvrinit) ......................................................................................................................................................73 서비스 완료(tpreturn) ................................................................................................................................................................69 서비스 포워딩(tpforward) .........................................................................................................................................................71 컴파일 ...........................................................................................................................................................................................80 API ................................................................................................................................................................................................68

Tmax 보안 시스템 ....................................................................................................................... 171 1단계(시스템 접속 제어) ...................................................................................................................................................36, 171 2단계(사용자 인증) .............................................................................................................................................................36, 173 3단계(서비스 접근 제어) .........................................................................................................................................................175 TPSTART_T 구조체....................................................................................................................................................................36

tmaxmt.dll...................................................................................................................................... 156 WinTmaxAcall...........................................................................................................................................................................156 WinTmaxAcall2.........................................................................................................................................................................160

tpacall...................................................................................................... 16, 31, 34, 49, 50, 103, 191

Page 281: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

3 Tmax C Programming Guide

tpalloc............................................................................................ 16, 34, 39, 40, 41, 42, 43, 47, 178

tpbroadcast ........................................................................................................... 18, 37, 57, 68, 147

tpcall...................................................................... 16, 30, 34, 45, 186, 204, 210, 219, 226, 237, 240

tpcancel......................................................................................................................... 16, 35, 54, 70

tpcancelctx .............................................................................................................................. 92, 100

tpchkclid .......................................................................................................................................... 77

tpclrfd .............................................................................................................................................. 96

tpconnect .................................................................. 16, 32, 110, 112, 113, 115, 116, 119, 196, 249

tpdeq ....................................................................................................... 19, 136, 137, 138, 141, 180

tpdiscon........................................................................................... 16, 110, 112, 116, 117, 119, 120

tpend ........................................................................... 19, 34, 38, 124, 186, 191, 196, 210, 226, 237

tpenq ....................................................................................................................... 19, 135, 136, 138

tperrno..................................................... 19, 52, 69, 78, 93, 115, 117, 119, 176, 191, 204, 219, 237

TPEVCTL 구조체....................................................................................................................... 151

tpextsvcname.................................................................................................................. 19, 135, 141

tpforward ....................................................................................................................... 68, 69, 71, 92

tpfree..................................................................................................... 16, 34, 43, 67, 196, 204, 219

tpgetclid........................................................................................................................................... 76

tpgetctx ......................................................................................................................................... 100

tpgetrply ................................................................................................................ 16, 31, 35, 51, 191

tpgetunsol ........................................................................................................................... 18, 35, 57

tpissetfd........................................................................................................................................... 95

tppost ............................................................................................................................................ 154

tpqstat ............................................................................................................................. 19, 135, 140

tprecv ................................................................................................ 16, 32, 112, 116, 196, 249, 253

tpregcb .......................................................................................................................................... 103

tprelay ........................................................................................................................................... 101

tpreturn................................................ 16, 68, 69, 110, 117, 118, 119, 193, 199, 213, 221, 230, 240

tpsavectx......................................................................................................................................... 99

tpschedule....................................................................................................................................... 93

tpsend ............................................................................................... 16, 32, 111, 112, 115, 199, 249

tpsendtocli..................................................................................................................... 18, 57, 68, 78

tpset_timeout ............................................................................................................................ 19, 59

Page 282: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

4Tmax C Programming Guide

tpsetfd ............................................................................................................................................. 95

tpsetunsol............................................................................................................................ 18, 35, 56

tpsetunsol_flag.................................................................................................................... 18, 35, 55

tpstart ...................................... 11, 19, 34, 36, 59, 172, 186, 191, 196, 204, 210, 219, 226, 237, 249

TPSTART_T 구조체...................................................................................................... 36, 148, 172

tpsubscribe.................................................................................................................................... 150

TPSVCINFO 구조체.................................................................................................................... 67

tpsvrdone .......................................................................................................................... 68, 75, 234

tpsvrinit...................................................................................................................................... 73, 75

tptypes ................................................................................................................................ 16, 34, 44

tpunregcb ...................................................................................................................................... 105

tpunsubscribe................................................................................................................................ 153

tpuschedule..................................................................................................................................... 94

tx_begin .................................................................................. 17, 123, 124, 204, 219, 226, 237, 249

tx_close........................................................................................................................................... 17

tx_commit................................................................ 17, 123, 124, 125, 204, 210, 219, 226, 237, 249

tx_info ............................................................................................................................. 17, 123, 131

tx_open ........................................................................................................................................... 17

tx_rollback............................................................................... 17, 123, 124, 127, 204, 219, 226, 249

tx_set_commit_return ..................................................................................................... 17, 123, 130

tx_set_transaction_control ...................................................................... 17, 123, 124, 125, 127, 130

tx_set_transaction_timeout ............................................................................................. 17, 123, 129

UCS ................................................................................................................................................ 89 구성 ...............................................................................................................................................................................................89 소켓관리(tpclrfd) .........................................................................................................................................................................96 소켓관리(tpissetfd)......................................................................................................................................................................95 소켓관리(tpsetfd).........................................................................................................................................................................95 스케줄링(tpschedule)..................................................................................................................................................................93 스케줄링(tpuschedule) ...............................................................................................................................................................94 컴파일 .........................................................................................................................................................................................106 콜백설정(tpregcb)......................................................................................................................................................................103 콜백해제(tpregcb)......................................................................................................................................................................105 포워딩(tpcancelctx) ...................................................................................................................................................................100 포워딩(tpgetctx).........................................................................................................................................................................100 포워딩(tprelay) ..........................................................................................................................................................................101 포워딩(tpsavectx) ........................................................................................................................................................................99 API ................................................................................................................................................................................................91

Page 283: Version 3 - TmaxSoft · 2019. 4. 9. · Tmax C Programming Guide Version 3.8 파트번호 : TMCP-0702-05-380 버 전 : Tmax 3.8 개 정 : July 2, 2003 인 쇄 : Sep 20, 2003

5 Tmax C Programming Guide

UCSMSGINFO 구조체.............................................................................................................. 103

WinTmax.dll .................................................................................................................................. 163 WinTmaxEnd.............................................................................................................................................................................164 WinTmaxSend ...........................................................................................................................................................................166 WinTmaxSetContext.................................................................................................................................................................165 WinTmaxStart............................................................................................................................................................................164

WinTmaxAcall ............................................................................................................................... 156

WinTmaxAcall2 ............................................................................................................................. 160

WinTmaxEnd ................................................................................................................................ 164

WinTmaxSend .............................................................................................................................. 166

WinTmaxSetContext ..................................................................................................................... 165

WinTmaxStart ............................................................................................................................... 164