Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1756112
  • 博文数量: 600
  • 博客积分: 10581
  • 博客等级: 上将
  • 技术积分: 6205
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-06 10:13
文章分类
文章存档

2016年(2)

2015年(9)

2014年(8)

2013年(5)

2012年(8)

2011年(36)

2010年(34)

2009年(451)

2008年(47)

分类:

2009-08-22 13:19:37


#include                   /* UNIX */

#include "atmi.h"                   /* TUXEDO */

 

main( argc, argv )

int argc;

char *argv[];

{

    char *sendbuf;                  /* 发送包 */

    char *rcvbuf;                   /* 返回包 */

    int sendlen;                    /* 发送包长度 */

    int rcvlen;                     /* 返回包长度 */

    int ret;                        /* 返回标志 */

 

    if( argc != 2) {

        fprintf( stderr, "Usage: simpcl string\n" );

        exit( 1 );

    }

 

    /* Attach to System/T as a Client Process */

    if ( tpinit( ( TPINIT * ) NULL ) == -1) {

        fprintf( stderr, "Tpinit failed\n" );

        exit( 1 );

    }

    sendlen = strlen( argv[ 1 ] );

    if( ( sendbuf = ( char* )tpalloc( "STRING", NULL, sendlen + 1 ) ) == NULL) {

        fprintf( stderr, "Error allocating send buffer\n" );

        tpterm( );

        exit( 1 );

    }

 

    if( ( rcvbuf = ( char* )tpalloc( "STRING", NULL, sendlen + 1 ) ) == NULL) {

        fprintf( stderr, "Error allocating receive buffer\n" );

        tpfree( sendbuf );

        tpterm( );

        exit( 1 );

    }

 

    strcpy( sendbuf, argv[ 1 ] );

    ret = tpcall( "TOUPPER", sendbuf, NULL, &rcvbuf, &rcvlen, 0 );

    if( ret == -1) {

        fprintf( stderr, "Can't send request to service TOUPPER\n" );

        fprintf( stderr, "Tperrno = %d, %s\n", tperrno, tmemsgs[ tperrno ] );

        tpfree( sendbuf );

        tpfree( rcvbuf );

        tpterm( );

        exit( 1 );

    }

 

    printf( "Returned string is: %s\n", rcvbuf );

 

    /* Free Buffers & Detach from System/T */

    tpfree( sendbuf );

    tpfree( rcvbuf );

    tpterm( );

}

 

$ buildclient -o simpcl -f simpcl.c

生成可执行程序simpcl

 

#include

#include

#include                /* TUXEDO Header File */

#include                 /* TUXEDO Header File */

 

/* This function performs the actual service requested by the client.

 * Its argument is a structure containing among other things a pointer

 * to the data buffer, and the length of the data buffer. */

 

void TOUPPER(rqst)

TPSVCINFO *rqst;

{

    int i;

 

    for( i = 0; i < rqst->len - 1; i++ )

        /* Return the transformed buffer to the requester. /

        rqst->data[ I ] = toupper( rqst->data[ i ] );

 

    tpreturn( TPSUCCESS, 0, rqst->data, 0L, 0 );

}

 

$ buildserver -o simpserv -f simpserv.c -s TOUPPER

生成可执行程序simpserv

 

*RESOURCES

IPCKEY              62345

MASTER              simple

MAXACCESSERS        5

MAXSERVERS          5

MAXSERVICES         10

MODEL               SHM

LDBAL               N

 

*MACHINES

DEFAULT:

    APPDIR="/users/test/simpdir"

    TUXCONFIG="/users/test/simpdir/tuxconfig "

    TUXDIR="/usr/tuxedo"

 

tuxmach         LMID=simple

 

*GROUPS

GROUP1

    LMID=simple

    GRPNO=1

    OPENINFO=NONE

 

*SERVERS

DEFAULT:

    CLOPT="-A"

simpserv

    SRVGRP=GROUP1

    SRVID=1

 

*SERVICES

    TOUPPER

 

设置以下环境变量:

l      TUXDIR=/usr/tuxedo

l      APPDIR=/users/test/simpdir

l      TUXCONFIG=/users/test/simpdir/tuxconfig

 

其中TUXDIR指定tuxedo的安装路径,一般在.profile中设置。

APPDIR为应用服务的存放路径,TUXCONFIG为二进制配置文件的路径和名词,一般在本应用中创建setenv文件中指定。

 

$ tmloadcf ubbsimple

生成二进制配置文件tuxconfig

 

$ tmboot

 

$ simpcl "hello,world"

返回结果:HELLO,WORLD

 

$ tmshutdown

 

普通的客户端处理流程如下所示:

1、              连接应用程序:
调用tpinit连接应用程序;

2、              分配发送包、返回包缓冲区:
调用tpalloc给发送包、返回包分配缓冲区;

3、              填写发送包数据:

4、              调用服务请求:
tpcall
调用服务请求;

5、              处理返回包数据:

6、              释放已申请的发送包、返回包缓冲区:
调用tpfree释放已申请的缓冲区;

7、              断开与应用程序的连接:
调用tpterm断开与应用程序的连接。

 

【函数原型】:

int tpinit( TPINIT tpinfo );

【功能说明】:

调用服务请求之前,首先要与应用程序建立连接。如果应用程序设置安全机制,通过该函数传递客户端标志符及认证信息,进行安全检查。

【参数】:

tpinfo      用来传递安全信息,若不需要,设为NULL

【返回值】:

-1      连接失败

else   连接成功

【使用例】:

      if ( tpinit( ( TPINIT* ) NULL ) == -1) {

             fprintf( stderr, "Tpinit failed\n" );

             exit( 1 );

      }

 

【函数原型】:

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

【功能说明】:

为发送包和返回包分配缓冲区,以传递信息。

【参数说明】:

type         缓冲区类型,Tuxedo提供STRINGCARRYFMLVIEW等多种类型。

subtype    VIEW类型包含子类型,该参数指定对应的子类型。

size          分配缓冲区的长度。

【返回值】:

NULL     分配失败

else          分配的缓冲区指针

【使用例】:

      if( ( sendbuf = (char* )tpalloc( "STRING", NULL, sendlen + 1 ) ) == NULL ) {

             fprintf( stderr, "Error allocating send buffer\n" );

             tpterm( );

             exit( 1 );

      }

 

【函数原型】:

int tpcall( char* svc, char* idata, long ilen, char** odata, long* olen, long* flags );

【功能说明】:

将请求发送给服务程序,请等待应答。

【参数说明】:

svc           调用的服务名;

idata        指向发送包数据地址的指针,如果没有发送数据,置为NULL

ilen          发送包长度,FMLVIEWSTRING类型的发送包,可忽略;

odata              指向返回包数据地址的指针;

olen         返回包长度;

flags        服务调用方式,一般情况下为0

【返回值】:

-1             服务调用失败

else          服务调用成功

【使用例】:

      ret = tpcall( "TOUPPER", sendbuf, NULL, &rcvbuf, &rcvlen, 0 );

      if( ret == -1) {

             fprintf( stderr, "Can't send request to service TOUPPER\n" );

             fprintf( stderr, "Tperrno = %d, %s\n", tperrno, tmemsgs[ tperrno ] );

             tpfree( sendbuf );

             tpfree( rcvbuf );

             tpterm( );

             exit( 1 );

      }

 

【函数原型】:

void tpfree( char *ptr );

【功能说明】:

释放tpalloc分配的缓冲区。

【参数说明】:

ptr            要释放的缓冲区地址指针。

【返回值】:

【使用例】:

tpfree( sendbuf );

 

【函数原型】:

int tpterm( void );

【功能说明】:

处理结束后,切断与应用程序的连接。

【参数说明】:

【返回值】:

-1      失败返回

else   正常返回

【使用例】:

if ( tpterm( ) == -1){

       ( void )userlog( "%s: failed to leave application\n", proc_name );

       exit( 1 );

}

 

结构

服务程序被定义成一个函数,通过一个结构指针的参数接收客户端上传数据,该结构在atmi.h中被定义为TPSVCINFO,包含以下主要成员:

char *data;                /* 上传数据 */

long len;                    /* 上传数据包长度 */

 

一般服务程序通过该参数取得上传数据,并进行处理。例如:

void TOUPPER( rqst )

TPSVCINFO *rqst;

{

      int i;

 

       for( i = 0; i < rqst->len - 1; i++ )

             rqst->data[ i ] = toupper( rqst->data[ I ] );

     

}

阅读(1066) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~