Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > server端ATMI
【标  题】:server端ATMI
【关键字】:server,ATMI
【来  源】:http://www.cublog.cn/u/21558/showart.php?id=148917

server端ATMI

Your Ad Here

server端ATMI


索引:

1.TPSVCINFO
2.buffer管理
3.server的client角色
4.tpadvertise
5.tpunadvertise
6.tpreturn
7.tpforward
8.tpsvrinit/tpsvrdone


在server端tuxedo本身提供了一个标准的main()函数,它负责完成一些必要的工作。server端编程只需要编写service处理函数,进行service的请求处理和回应处理。所以,在server端不需要调用tpinit()和tpterm()。

1.TPSVCINFO

每个service函数都有统一的形式:
void tpservice (TPSVCINFO *svcinfo);

只有一个参数,该参数是指向TPSVCINFO结构的指针(atmi.h)。该结构定义如下:
struct tpsvcinfo {
    char name[32]; /*service名(最大15个字符)*/
    long flags; /* client调用时指定的flags */
    char *data; /* 接收的数据地址 */
    long len; /* 数据长度 */
    int cd; /* 会话方式下的连接描述符 */
    long appkey; /* 应用认证的key */
    CLIENTID cltid; /* client ID */
};


2.buffer管理

在service函数里,一样可以调用tpalloc()、tpfree()、tprealloc()处理自定义的buffer。

通过TPSVCINFO参数传递的buffer是使用tpalloc()分配的,所以可以对它使用tprealloc()。

要注意的是在service函数里自己调用tpalloc()分配的空间在退出要释放,除非该空间作为tpreturn()或tpforward()的参数。如果分配的空间不释放,最终会耗尽该server的内存资源。

对于TPSVCINFO传递的buffer不用手动释放。

使用举例:
void
BAL (TPSVCINFO* input)
{
    char* f, f1, f2;
    f=input->data;
    f1=tpalloc (“STRING”, NULL, 80);
    f2=tpalloc (“STRING”, NULL, 120);
    . . .
    tpfree ((char *) f2);
    tpreturn (TPSUCCESS, 0, f1, 0, 0);
}
可以使用tptypes()查看buffer的类型。如:
void ABAL(TPSVCINFO *transb)
{
    char type[20], subtype[20];
    long len;
    len = tptypes(transb->data, type, subtype);
    if (len == 0) {
        /*error*/
        userlog(“NULL message sent...\n”);
        ...
    }
    if (strcmp(type, “FML”) == 0) {
        /* convert FML to aud VIEW; */
    } else if (strcmp(type, “VIEW”) == 0) {
        if (strcmp(subtype, “aud”) != 0) {
            /*error*/
            userlog(“Wrong VIEW subtype...”);
            ...
        }
    } else {
        /*error*/
        userlog(“Invalid buffer type ...”);
        ...
    }
}


3.server的client角色

tuxedo的机制允许一个server程序作为client,调用tpcall()去请求别的service服务。这样做可以避免代码的冗余,但效率上会有牺牲。

这样做时有一些情况要注意:

  • 如果一个server要把负责返回接收到的buffer,则不要使用这个buffer作为参数来请求别的service服务。可以分配辅助性的buffer来处理,这样做可以避免在tpcall()过程中改变了输入buffer的内容和类型。
  • 一个server不能请求一个只被它本身发布的service。这样做会导致死锁。例外是请求时指定TPNOREPLY标志。

4.tpadvertise

service可以在启动时发布,也可使用tmadmin或使用tpadvertise动态发布。

int tpadvertise (char *svcname, void (*func)(TPSVCINFO *));

参数说明:
svcname:要发布的service名;
func:该service对应的处理函数指针;

如果该service用func已经发布,则函数立即成功返回。如果调用server是MSSQ集的一员,则该MQSQ中的所有server都发布这个service。失败时返回-1。

出错原因:

  • 该service已经用别的函数发布了;
  • 超过了最大允许发布的service数量(MAXSERVICES);
  • 参数错误(有为NULL的);
  • 协议错;
  • 操作系统错等。

5.tpunadvertise

一个server取消发布一个它已经发布的service。

int tpunadvertise (char *svcname);

参数说明:
svcname:操作的service名;

如果调用server是MSSQ集的一员,则该MQSQ中的所有server都取消发布这个service。失败时返回-1。

失败原因:

  • service没有发布;
  • 参数错误;
  • 协议错等。

6.tpreturn

普通的C函数返回时使用return语句。但在tuxedo程序里,不能使用return,必须使用tpreturn()终止当前处理并发送回应给请求端;或者使用tpforward()把请求传递给别的service处理。

void tpreturn(int rval, int rcode, char *data,long len, long flags);

参数说明:
rval:返回值,决定该service请求是否成功。如三个可选值:

  • TPSUCCESS:成功。tpcall和tpgetrply将返回一个非负值;如果是会话service,则产生TPEV_SVCSUCC事件;
  • TPFAIL:失败。tpcall和tpgetrply将返回-1;tperrno设置为TPESVCFAIL,如果是会话service,则产生TPEV_SVCFAIL事件;
  • TPEXIT:除了TPFAIL的功能外,该server随后将终止,如果配置了重启动,则该server将重新启动。
rcode:应用定义的返回码。service将向client返回该数字,tuxedo本身不对其做任何解释,接收端通过全局变量tpurcode得到该值,在成功或失败时该值都会返回;
data:返回给client端的数据buffer;
len:返回数据的长度(只CARRAY类型有用);
flags:标志,当前没用。

7.tpforward

调用tpforward的server不向client返回数据,而是把更新过的buffer传递给另一个service做更多的处理,由它处理返回client数据等后续的工作。本身则返回到标准的main流程中。

void tpforward(char *service, char *data, long len, long flags);

参数说明:
service:后续的service的名称;
data:指向传递的buffer的指针;
len:buffer的长度(只CARRAY有用);
flags:当前没有使用;

该函数不能用在会话service中。


8.tpsvrinit/tpsvrdone

在一个server的实例启动时会调用tpsvrinit(),在结束时会调用tpsvrdown()。如果应用没有定义这两个函数,则使用tuxedo提供的缺省函数。

int tpsvrinit(int argc, char **argv);

参数说明:形式类似与main函数的参数,函数里可以使用getopt和全局变量optind进行处理,配置文件中的CLOPT命令行选项也传递到该函数。

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

void tpsvrdone();

最近确定引入subversion作为版本控制工具:【上一篇】
ASCII 代码表:【下一篇】
【相关文章】
  • c socket server
  • SQLSERVER压缩日志及数据库文件大小
  • 压缩SQLServer数据库日志的一个存储过程
  • PostgreSQL 与 SQL Server 的数据类型映射
  • 如何将postgresql数据库移植到oracle或sql server2000
  • sqlserver数据库中统计email类型的sql语句
  • 未完成--web server
  • 远程登陆SQL Server 2000
  • 通过 SQL Server 2005 索引视图提高性能
  • sqlserver数据库死锁阻塞检查
  • 【随机文章】
  • CComPtr和CComQIPtr的区别
  • PM本来想偷下懒的
  • 局域网不能访问对方计算机de相关问题解决办法
  • QIconView类clicked()信号问题的解决
  • 变速精灵XP1.01算法分析
  • 几个常见的LINUX下的ORACLE错误解决方法
  • windows快捷方式打开问题
  • Red Hat Linux 133 实验(KevinZ) [转]
  • 全球手机辐射量排行 MOTO“高高在上”
  • java 100例之类的调用
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.