分类:
2009-08-22 13:19:37
#include
#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
#include
/* 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,
}
$ 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提供STRING、CARRY、FML、VIEW等多种类型。
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: 发送包长度,FML、VIEW、STRING类型的发送包,可忽略;
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 ] );
…
}