Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1791204
  • 博文数量: 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:29:14

第二章 一个简单的Tuxedo应用程序simpapp

本章介绍了BEA Tuxedo的一个简单例子,用C语言编写的simpapp,它包含了一个客户程序和一个服务器,服务器只执行一个服务:从客户程序接收小写字母,将其转换成大写后,返回给客户程序。在使用这个例子之前,需要在系统中安装C语言编译器。

准备simpapp的文件和资源

在准备simpapp例子之前,系统中必须安装了BEA Tuxedo软件,而且要设置$TUXDIR环境变量,NT平台下为%TUXDIR%,并把%TUXDIR%\bin加到PATH中,最后还要确保你的工作目录要有写权限。完成这些工作后,请按如下步骤来准备simpapp程序:

⑴.  复制simpapp所需要的所有文件,它们位于$TUXDIR/samples/atmi/simpapp目录下;

⑵.  检查并编译客户程序;

⑶.  检查并编译服务程序;

⑷.  编辑并加载配置文件;

⑸.  启动应用程序;

⑹.  执行运行时应用程序;

⑺.  监视运行时应用程序;

⑻.  关闭应用程序。

完成这个例子后,你应该理解客户程序和服务器所执行的任务,根据你的环境编写一个配置文件,通过tmadmin检查应用程序的活动。同时,你应该理解BEA Tuxedo应用程序的基本组成部分:客户程序、服务器程序、配置文件,通过BEA Tuxedo系统的哪些命令来管理你的应用程序。

1.复制simpapp例子的相关文件

⑴.创建目录:

mkdir simpdir

cd simpdir

⑵.设置并导出环境变量

TUXDIR=BEA Tuxedo系统的根目录,如UNIX系统下可以设置为:

TUXDIR="/usr/tuxedo"NT系统下可以设置为:

                            TUXDIR="G:\Program Files\BEA System\Tuxedo"

TUXCONFIG=当前工作目录加上/tuxconfig,如UNIX系统下可以设置为:

        TUXCONFIG="/usr/me/simpdir/tuxconfig"NT系统下可以设置为:

        TUXCONFIG="G:\simpdir\tuxconfig"

PATH=$PATH:$TUXDIR/bin

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TUXDIR/lib

export  TUXDIR  TUXCONFIG  PATH  LD_LIBRARY_PATH

TUXDIRPATH用于访问BEA Tuxedo系统的文件和执行命令,在Sun Solaris系统中,必须把/usr/5bin放在PATH中的第一个,在RS6000中的AIX上,将LD_LIBRARY_PATH替换成LIBPATH,在HP9000中的HP-UX上,将LD_LIBRARY_PATH替换为SHLIB_PATH

设置TUXCONFIG的目的是用于加载配置文件。

⑶.复制simpapp文件,

cp $TUXDIR/samples/atmi/simpapp/* .

⑷.查看文件

$ls

README env simpapp.nt ubbmp wsimpcl

README.as400 setenv.cmd simpcl.c ubbsimple

README.nt simpapp.mk simpserv.c ubbws

文件说明:

simpcl.c客户程序的源代码

simpserv.c服务程序的源代码

ubbsimple应用程序配置文件的纯文本形式

2.检查并编译客户程序

⑴.检查客户程序

$more simpcl.c

#include

#include "atmi.h"          /*  TUXEDO的头文件 */

 

#if defined(__STDC__) || defined(__cplusplus)

main(int argc, char *argv[])

#else

main(argc, argv)

int argc;

char *argv[];

#endif

{

         char *sendbuf, *rcvbuf;

         long sendlen, rcvlen;

         int ret;

 

         if(argc != 2) {

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

                   exit(1);

         }

         /* 作为一个客户过程连接到System/T  */

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

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

                   exit(1);

         }

        

         sendlen = strlen(argv[1]);

 

         /* 分配一个供请求响应使用的STRING 缓冲区 */

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

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

                   tpterm();

                   exit(1);

         }

 

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

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

                   tpfree(sendbuf);

                   tpterm();

                   exit(1);

         }

 

         (void) strcpy(sendbuf, argv[1]);

 

         /* Request the service TOUPPER, waiting for a reply */

         ret = tpcall("TOUPPER", (char *)sendbuf, 0,

(char **)&rcvbuf, &rcvlen, (long)0);

 

         if(ret == -1) {

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

                   (void) fprintf(stderr, "Tperrno = %d\n", tperrno);

                   tpfree(sendbuf);

                   tpfree(rcvbuf);

                   tpterm();

                   exit(1);

         }

 

         (void) fprintf(stdout, "Returned string is: %s\n", rcvbuf);

 

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

         tpfree(sendbuf);

         tpfree(rcvbuf);

         tpterm();

         return(0);

}

说明:

语句

说明

atmi.h

调用ATMI函数必须的头文件

tpinit()

客户程序调用它来加入应用程序

tpalloc()

用于分配类型缓冲区的ATMI函数,STRING是五种BEA Tuxedo缓冲区数据类型之一,sendlen+1表示缓冲区类型,因为以空字符结尾,所以长度加1

tpcall()

把消息缓冲区送到TOUPPER服务,它提供了响应缓冲区的地址,它一直等待着返回消息

Tpterm()

用于退出应用程序的ATMI函数,

tpfree()

释放分配的缓冲区,是和tpalloc()相对应的函数

⑵.编译客户程序

$buildclient -o simpcl -f simpcl.c

                   -o指明输出目标文件名,-f指出源文件名

3.检查并编译服务程序

⑴.检查服务程序

$more simpserv.c

#include

#include

#include         /* TUXEDO Header File */

#include   /* TUXEDO Header File */

 

/* 当服务器启动时,在处理请求之前,tpsvrinit被执行,这个不是必须的,对应的函数是shutdown*/

 

#if defined(__STDC__) || defined(__cplusplus)

tpsvrinit(int argc, char *argv[])

#else

tpsvrinit(argc, argv)

int argc;

char **argv;

#endif

{

         /* argc, argv没有被使用时,一些系统会发了警告 */

         argc = argc;

         argv = argv;

 

         /* userlog用于将TUXEDO消息写到日志文件中 */

         userlog("Welcome to the simple server");

         return(0);

}

 

/*  TOUPPER真正处理客户请求,它接收的参数是一个缓冲区指针 */

#ifdef __cplusplus

extern "C"

#endif

void

#if defined(__STDC__) || defined(__cplusplus)

TOUPPER(TPSVCINFO *rqst)

#else

TOUPPER(rqst)

TPSVCINFO *rqst;

#endif

{

         int i;

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

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

         /* 返回转换后的类型缓冲区 */

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

}

         说明:

语句

说明

whole file

整个服务程序不提供main函数,在build时,由BEA Tuxedo系统提供。

tpsvrinit()

在服务器初始化即处理请求之前被调用。若没有提供该函数,BEA Tuxedo系统会提供一个缺省的,它向USERLOG中写一条消息,说明服务器已经被启动。userlog(3c)是系统提供的一个写日志的方法。

TOUPPER()

simpserv提供的唯一一个服务,它接收一个TPSVCINFO结构,它包含了要被转换成大写的字符串。

for loop

BEA Tuxedo系统的循环,用于逐一转换。

tpreturn()

 

⑵.编译服务器

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

–s TOUPPER指明了在服务器启动时需要提供的服务

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