Duangw

Client端ATMI

索引:

  1. tpchkauth
  2. tpinit
  3. tperm
  4. tpacall
  5. tpgetrply
  6. tpcancel
  7. tpcall
  8. tpgprio
  9. tpsprio

ATMI:Application-to-Transaction Monitor Interface。

1.tpchkauth

int tpchkauth();

在调用tpinit()之前检查是否需要认证和认证的级别。

返回值:

当返回值为TPSYSAUTH和TPAPPAUTH时,我们必须使用tpalloc()分配一个TPINIT结构,在该结构中填入认证数据,然后用该结构作为参数调用tpinit()。

失败原因主要有:

 

2.tpinit

在使用tuxedo其他服务之前,必须调用tpinit加入到应用中。

int tpinit(TPINIT *tpinfo);

参数说明:

tpinfo:指向TPINIT类型的指针。

TPINIT类型在atmi.h中有定义,如以下几个域:

    char usrname [32]; (32 characters significant)
    char cltname [32]; (32 characters significant)
    char passwd [32]; (8 characters significant)
    char grpname [32]; (32 characters significant)
    long flags;
    long datalen;
    long data;

usrname:用户名或login名;

cltname:应用定义;

passwd:应用密码;

grpname:在事务中使用,必须在配置文件定义的组列表中;

flags:定义请求/通知类型和系统存取方法,其中TPU_SIG、TPU_DIP和TPU_IGN不能同时指定;TPSA_FASTPATH和TPSA_PROTECTED不能同时指定。有如下的值:

datalen:应用特殊数据的长度;

data:应用特殊数据;

域flags的值覆盖系统的缺省定义,前提是在配置文件中没有指定NO_OVERRIDE。

如果参数使用(TPINIT*)NULL,则client使用系统缺省的通知设置和系统存取设置,若需要认证,则出错返回TPEPERM。

tpinit()调用失败返回-1,失败原因有:

示例:

TPINIT *tpinfo;
char password[9];
/* prompt user for password */
if ((tpinfo = (TPINIT *)tpalloc(“TPINIT”, NULL,
                    TPINITNEED(0))) == NULL) {
    (void)userlog(“unable to allocate TPINIT buffer”);
    exit(1);
}
(void)strcpy(tpinfo->passwd, password);
(void)strcpy(tpinfo->usrname, “Smith”);
(void)strcpy(tpinfo->cltname, “Teller”);
tpinfo->flags = (TPU_DIP|TPSA_PROTECTED);
if (tpinit(tpinfo) == -1) {
    (void)userlog(“failed to join application”);
    tpfree((char*)tpinfo);
    exit(1);
}

 

3.tperm

使用tuxedo服务完毕,调用tpterm()离开应用。

int tpterm();

函数出错返回-1。

错误原因有:

 

4.tpacall

发送异步请求。

int tpacall(char *service, char *bufptr, long length,
long flags);

参数说明:

service:请求的service名(最大15个字符,以null结尾);

bufptr:请求发送的数据;

length:发送数据长度(只有CARRAY类型用,其他设为0);

flags:发送模式,有如下的值:

成功返回一个非负的描述符,该描述符可用于后续的tpgetrply调用,出错返回-1。

错误原因有:

 

5.tpgetrply

接收异步回应数据。

int tpgetrply(int *handle, char **bufpp, long *length,
long flags);

参数说明:

handle:tpacall返回的描述符;

bufpp:接收buffer的地址的地址,原buffer会自动调整;

length:接收的buffer的长度的地址;

flags:接收选项。有如下值:

成功返回0,失败返回-1。

出错原因:

 

6.tpcancel

取消由tpacall发送的请求的响应,在没有事务未完时。不能取消一个已经处理的请求。

int tpcancel(int handle);

参数说明:

handle:tpacall返回的描述符;

出错返回-1。错误原因有:

 

7.tpcall

同步发送请求并接收回应数据。

int tpcall(char *service, char *sbufp, long slength, \
	char **rbufpp, long *rlength, long flags);

参数说明:

service:请求的service名;

bufp:发送buffer的地址;

slength:发送数据长度(只CARRAY使用,其他为0);

rbufpp:响应buffer的地址的地址,可以与发送buffer为同一块区域;

rlength:响应buffer的长度的地址(不能为NULL);

flags:标志。有如下值(含义见tpacall和tpgetrply):

返回-1表示出错,其他返回值都表示成功。

错误原因与tpacall和tpgetrply相同,除了描述符错。

 

8.tpgprio

获得上一次请求或接收的消息的优先级。

int tpgprio();

成功返回的范围是1-100,值越大优先级越高。失败返回-1。

使用举例:

struct {
    int hdl; /* handle*/
    int pr; /* priority*/
} pa[SIZE];

for (i=0; i < requests; i++) {
    /* Determine service and data for request */
    pa [i].hdl = tpacall(Svc, buf, len, flags);
    /* Save priority used to send request */
    pa[i].pr = tpgprio();
}
/* Use qsort(3) routine to sort handles in priority order */
qsort((char*) pa, requests, sizeof(pa[0]), cmpfcn);
for (i=0; i< requests; i++) {
    tpgetrply(&pa[i].hdl, &rbufp, &rlen, rflags);
}

 

9.tpsprio

设置下一个要发送的消息的优先级。

int tpsprio (int prio, long flags);

参数说明:

prio:要设置的优先级;

flags:标志。有如下值:

优先级的范围是1-100,超过次限制的值被改为相应的最大(小)值。

失败返回-1。错误原因有TPEINVAL、TPEPROTO、TPESYSTEM、和TPEOS。