ImageVerifierCode 换一换
格式:DOCX , 页数:54 ,大小:102.55KB ,
资源ID:11108548      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11108548.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第八章TUXEDO的通讯方式.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第八章TUXEDO的通讯方式.docx

1、第八章TUXEDO的通讯方式 第八章:TUXEDO的通讯方式TUXEDO中的客户端与服务端之间可以采用的通讯方式有:1. 同步调用方式2. 异步调用方式3. 管道方式4. 会话方式5. 消息方式6. 事件发布订阅方式7. /Q方式注意:1. 服务端的SERVICE之间,可以采用管道方式,客户端与服务端之间不能采用。2. 客户端与服务端之间可以采用消息方式,服务端的SERVICE之间不能采用消息方式。3. 其他通讯方式在服务端的SERVICE之间,及客户端与服务端之间都可以采用。管道方式(tpforward()在服务端编程中有说明,/Q方式在第十章中在介绍,对这两种方式在本章种不做介绍.8.1同

2、步调用方式如下图所示:在同步请求/回答方式中,客户端使用tpcall()给本地或远程的服务器(由TUXEDO系统根据公告板信息确定)发送服务请求,此时客户将传送请求服务的名字、用于请求服务的输入参数和输出参数,tpcall()发出后,客户的数据被传送至服务器,得到相应的服务处理。在此方式下,服务器处理请求时,客户端将等待,不继续运行,直到服务器返回相应结果。调用过程如图:例子:客户端通过对一个文件分块,每调用一次TPCALL()发送一块数据,把一个文件从客户端传送到服务端。客户端与服务端采用FML32缓冲区进行通信。在异步调用方式和会话方式中也用到该例子。可以做一个比较。在该例子中我们把块的大

3、小定义为1024字节。采用FML32缓冲区。FML32定义文件Myfml.h的内容:*base 100#name number type flags commentsFNAME 1 string - -BNUM 3 longBID 4 long - -FDATA 5 carray - -BSIZE 6 long - -服务端程序Call.c的内容:#include #include #include #include #include fml32.h#include myfml.hCALL(TPSVCINFO *rqst) FILE *fp; long i=0; FBFR32 *rcvbuf;

4、 char fname100=; FLDLEN32 len=0; long bid=0; long bsize=1024;/*传送的块大小为1024字节*/ char *fdata; rcvbuf=(FBFR32 *)rqst-data; len=sizeof(bid); if(Fget32(rcvbuf,BID,0,(char *)&bid,&len) = -1) userlog(Fget32(BID) failure :%s,(char *)Fstrerror32(Ferror32); tpreturn(TPFAIL,0,0,0,0); len=sizeof(fname); if(Fget

5、32(rcvbuf,FNAME,0,fname,&len) = -1) userlog(Fget32(FNAME) failure :%s,(char *)Fstrerror32(Ferror32); tpreturn(TPFAIL,0,0,0,0); strcat(fname,.s); if (fp=fopen(fname, rb)=NULL) fp=fopen(fname, wb); else if(bid = 0 ) fclose(fp); fp=fopen(fname, wb); else fclose(fp); fp = fopen(fname, r+b); if(fp = NULL

6、) userlog(fopen() %s failuren,fname); tpreturn(TPFAIL,0,0,0,0); fdata=(char *)malloc(bsize+1); if(fdata = NULL) userlog(malloc(fdata) failure); tpreturn(TPFAIL,0,0,0,0); len=bsize; if(Fget32(rcvbuf,FDATA,0,fdata,(FLDLEN32 *)&len) = -1) userlog(Fget32(FDATA) failure :%s,(char *)Fstrerror32(Ferror32);

7、 tpreturn(TPFAIL,0,0,0,0); i=bid * bsize; if(fseek(fp, i, 0)!=0) userlog(fseek() failuren); tpreturn(TPFAIL,0,0,0,0); i = fwrite(fdata,1,len,fp); if(i != len) userlog(fwrite()failn); tpreturn(TPFAIL,0,0,0,0); fclose(fp); tpreturn(TPSUCCESS, 0, NULL, 0L, 0);客户端程序callcli.c的内容:#include #include #includ

8、e atmi.h #include fml32.h#include myfml.hFBFR32 *sendbuf=NULL;char *filebuf;FILE *fp;log(const char *fmt, .) va_list ap; va_start(ap, fmt); vfprintf(stdout, fmt, ap); fflush(stdout); va_end(ap); fclose(fp); tpfree(char *)sendbuf); free(filebuf); tpterm(); exit(1);main(int argc, char *argv) long rcvl

9、en=0; long filelen=0; long i=0; int ret=0; long reallen=0; long bnum=0; long bsize=1024; /*传送的块大小为1024字节*/ FLDLEN32 len=0; if(argc != 2) (void) fprintf(stderr, Usage: %s filenamen,argv0); exit(1); fp = fopen( argv1, rb ); if(fp = NULL) printf(open file:%s failuren,argv1); exit(1); if(fseek(fp, 0, SE

10、EK_END)!=0) perror(fseek() failure:); exit(1); filelen=ftell(fp); if(filelen= -1) perror(ftell() failure:); exit(1); rewind(fp); if(sendbuf = (FBFR32 *)tpalloc(FML32, NULL, bsize+1024) = (FBFR32 *)NULL) printf(Error allocating send buffern); exit(1); len = Fsizeof32(sendbuf); if(Finit32(sendbuf, (FL

11、DLEN32)len)= -1) printf(finit32() failuren); exit(1); if (tpinit(NULL) = -1) printf(tpinit() failure); exit(1); filebuf=(char *)malloc(bsize); if(filebuf = NULL) printf(malloc(filebuf) failure); exit(1); bnum=(filelen -1)/bsize + 1; if(Fchg32( sendbuf, FNAME, 0, argv1, (FLDLEN32)len )0) log(Fchg32(F

12、NAME) failuren,Fstrerror32(Ferror32); printf(filelen = %ld, block num = %ldn,filelen,bnum); for(i=0;ibnum;i+) if(fseek(fp, i*bsize, 0)!=0) log(fseek failuren); reallen=fread(filebuf, 1, bsize, fp); if(reallen!=bsize & feof(fp)=0 ) log(fread() failuren); if(Fchg32(sendbuf, BID, 0, (char *)&i, 0)0) lo

13、g(Fchg32(BID) failure:%sn,Fstrerror32(Ferror32); printf(bid=%ldn,i); if(Fchg32( sendbuf, FDATA, 0, filebuf, (FLDLEN32)reallen)0) log(Fchg32(FDATA) failure:%sn,Fstrerror32(Ferror32); ret = tpcall(CALL, (char *)sendbuf, 0, (char *)&sendbuf, &rcvlen, (long)0); if(ret = -1) log(tpcall() failure:tperrno=

14、%ld,errstr=%sn,tperrno,tpstrerror(tperrno); log(finishedn);8.2 异步调用方式如图所示:在异步请求/回答方式中,客户端使用tpacall()给本地或远程的服务器(由TUXEDO系统根据公告板信息确定)发送服务请求,与同步方式不同的是:在此方式下,服务器处理请求时,客户端继续运行。当客户端想得到请求的处理结果时,用tpgetrply()将结果取回。调用过程如图:例子:该例子实现与同步调用方式一样的功能.但在该例子中采用异步通讯方式.服务端的程序与同步调用方式中的一样,客户端的程序Acallcli.c的内容如下:注意:每调用TPACALL

15、()50次之后,就要调用tpgetrply()把服务端返回的结果取出,否则,返回缓冲区会满,会出如下错误:atpcall() failure:tperrno=5,errstr=TPELIMIT - a system limit has been reachedAcallcli.c的内容:#include #include #include atmi.h #include fml32.h#include myfml.hFBFR32 *sendbuf=NULL;char *filebuf;FILE *fp;log(const char *fmt, .) va_list ap; va_start(a

16、p, fmt); vfprintf(stdout, fmt, ap); fflush(stdout); va_end(ap); fclose(fp); tpfree(char *)sendbuf); free(filebuf); tpterm(); exit(1);main(int argc, char *argv) long rcvlen=0; long filelen=0; long i=0; int ret=0; long reallen=0; long bnum=0; long bsize=1024;/*传送的块大小为1024字节*/ FLDLEN32 len=0; long j=0;

17、 int cd50; if(argc != 2) (void) fprintf(stderr, Usage: %s filenamen,argv0); exit(1); fp = fopen( argv1, rb ); if(fp = NULL) printf(open file:%s failuren,argv1); exit(1); if(fseek(fp, 0, SEEK_END)!=0) perror(fseek() failure:); exit(1); filelen=ftell(fp); rewind(fp); if(sendbuf = (FBFR32 *)tpalloc(FML

18、32, NULL, bsize+1024) = (FBFR32 *)NULL) printf(Error allocating send buffern); exit(1); len = Fsizeof32(sendbuf); if(Finit32(sendbuf, (FLDLEN32)len)= -1) printf(finit32() failuren); exit(1); if (tpinit(NULL) = -1) printf(tpinit() failure); exit(1); filebuf=(char *)malloc(bsize); if(filebuf = NULL) p

19、rintf(malloc(filebuf) failure); exit(1); bnum=(filelen -1)/bsize + 1; if(Fchg32( sendbuf, FNAME, 0, argv1, (FLDLEN32)len )0) log(Fchg32(FNAME) failuren,Fstrerror32(Ferror32); printf(filelen = %ld, block num = %ldn,filelen,bnum); j=0; for(i=0;ibnum;i+) if(fseek(fp, i*bsize, 0)!=0) log(fseek failuren)

20、; reallen=fread(filebuf, 1, bsize, fp); if(reallen!=bsize & feof(fp)=0 ) log(fread() failuren); if(Fchg32(sendbuf, BID, 0, (char *)&i, 0)0) log(Fchg32(BID) failure:%sn,Fstrerror32(Ferror32); printf(bid=%ldn,i); if(Fchg32( sendbuf, FDATA, 0, filebuf, (FLDLEN32)reallen)0) log(Fchg32(FDATA) failure:%sn

21、,Fstrerror32(Ferror32); ret = tpacall(CALL, (char *)sendbuf, 0, 0); if(ret = -1) log(atpcall() failure:tperrno=%ld,errstr=%sn,tperrno,tpstrerror(tperrno); cdj=ret; j+; if(j%50=0) for(j=0;j50;j+) if(tpgetrply(&cdj,(char *)&sendbuf, &rcvlen, (long)0)= -1) log(tpgetrply() failure:cd=%ld,errstr=%sn,cd,t

22、pstrerror(tperrno); j=0; log(finishedn);8.3 会话方式采用会话通讯方式,通讯双方在建立连接之后,可以多次发送或接收数据,TUXEDO中采用的是半双工的通讯方式,这种方式特别适用于大批量的数据传输。名称解释:发起者(originator,initiator):发起该会话的进程,它调用tpconnect()与服务端的一个SERVICE建立连接从属者(subordinate):tpconnect()中指定的SERVICE发送者(sender):当前拥有发送权的进程,它只能发送数据接收者(receiver):当前拥有发送权的进程,它只能接收数据函数说明:int

23、 tpconnect (char* name, char *data, long length, long flags)描述: 与名为name的SERVICE建立连接参数:name:SERVICE的名字*data:要发送的数据length:数据的长度flags:可以为TPNOTRAN, TPNOTIME,TPNOBLOCK,TPSIGRSTRTTPSENDONLY:发送者只能发送数据,被调用的SERVICE只能接收数据TPRECVONLY:发送者只能接收数据,被调用的SERVICE只能发送数据返回值: 成功返回一个标识该连接的标识符,失败为-1int tpsend(int cd, char *

24、data, long length, long flags,long *revent)描述:用于发送数据参数:cd: tpconnect()的返回值,用于标识该连接data: 要发送的数据length:要发送的数据的长度flags:(TPNOBLOCK, TPNOTIME, TPSIGRSTRTTPRECVONLY:把发送权交给接受者,在接受者那里会产生事件TPEV_SENDONLY。revent:当返回值为-1时,如果tperrno= TPEEVENT,那么表明有事件发生。可能的事件有:TPEV_DISCONIMM:当会话的发起者调用tpdiscon(), tpreturn(), tpcom

25、mit()时,会话的从属者会收到该事件。如果有网络故障等,那么会话的发起者也会收到该事件。TPEV_SVCFAIL:会话的发起者会收到该事件,表明会话的从属者调用tpreturn(TPFAIL)或tpreturn(TPEXIT), 并且该会话的从属者不在拥有该控制权TPEV_SVCERR:会话的发起者会收到该事件,表明会话的从属者调用tpreturn(TPSUCCESS,.)返回,并且该会话的从属者不在拥有该控制权.返回值:失败为-1,如果tperrno= TPEEVENT,那么导致该调用失败的事件保存在revent中int tprecv(int cd, char *data, long *l

26、ength, long flags, long *revent)描述:用于接收数据data: 接收的数据放到该缓冲区中length:接收大的数据的长度flags:(TPNOCHANGE, TPNOBLOCK, TPNOTIME, TPSIGRSTRT)revent:当返回值为-1时,如果tperrno= TPEEVENT,那么表明有事件发生。可能的事件有:TPEV_DISCONIMM:与tpsend()中的含义一样.TPRECVONLY:该会话的发送者把发送权交给接受者,在接受者这里会产生事TPEV_SENDONLY。TPEV_SVCFAIL: 与tpsend()中的含义一样.TPEV_SVC

27、ERR: 与tpsend()中的含义一样.TPEV_SVCSUCC: 该会话的从属者已成功完成并关闭该会话,那么会话的发起者会收到该事件.表明该会话已成功结束.返回值:失败为-1,如果tperrno= TPEEVENT,那么导致该调用失败的事件保存在revent中int tpdiscon(int cd)描述:关闭标识符为cd的会话参数: tpconnect()的返回值,用于标识该连接返回值:失败为-1 会话通讯方式的整个过程如图所示:例子: 该例子实现与同步通讯的例子一样的功能,但采用的是会话通讯方式.服务端程序的内容:#include #include #include #include fml32.h#include myfml.hlong bsize=1024;/*传送的块大小为1024字节*/FBFR32 *rcvbuf;char fname256=;char *fdata;tpsvrinit(int argc, char *argv) if (rcvbuf=(FBFR32 *)tpalloc(FML32,NULL,(bsize+1024) = NULL) userlog(tpalloc fai

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1