




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 第八章:TUXEDO的通訊方式TUXEDO中的客戶端與服務(wù)端之間可以采用的通訊方式有:1. 同步調(diào)用方式2. 異步調(diào)用方式3. 管道方式4. 會話方式5. 消息方式6. 事件發(fā)布訂閱方式7. /Q方式注意:1. 服務(wù)端的SERVICE之間,可以采用管道方式,客戶端與服務(wù)端之間不能采用。2. 客戶端與服務(wù)端之間可以采用消息方式,服務(wù)端的SERVICE之間不能采用消息方式。3. 其他通訊方式在服務(wù)端的SERVICE之間,及客戶端與服務(wù)端之間都可以采用。管道方式(tpforward()在服務(wù)端編程中有說明,/Q方式在第十章中在介紹,對這兩種方式在本章種不做介紹. 8.1同步調(diào)用方式如下圖所示:在同
2、步請求/回答方式中,客戶端使用tpcall()給本地或遠程的服務(wù)器(由TUXEDO系統(tǒng)根據(jù)公告板信息確定)發(fā)送服務(wù)請求,此時客戶將傳送請求服務(wù)的名字、用于請求服務(wù)的輸入?yún)?shù)和輸出參數(shù),tpcall()發(fā)出后,客戶的數(shù)據(jù)被傳送至服務(wù)器,得到相應(yīng)的服務(wù)處理。在此方式下,服務(wù)器處理請求時,客戶端將等待,不繼續(xù)運行,直到服務(wù)器返回相應(yīng)結(jié)果。調(diào)用過程如圖:Tpinit()Tpalloc()Tpcall()Tpterm()TOUPPER(TPSVCINFO *rqst) tpreturn()例子:客戶端通過對一個文件分塊,每調(diào)用一次TPCALL()發(fā)送一塊數(shù)據(jù),把一個文件從客戶端傳送到服務(wù)端??蛻舳伺c服務(wù)
3、端采用FML32緩沖區(qū)進行通行。在異步調(diào)用方式和會話方式中也用到該例子??梢宰鲆粋€比較。在該例子中我們把塊的大小定義為1024字節(jié)。采用FML32緩沖區(qū)。FML32定義文件Myfml.h的內(nèi)容:*base100#name number type flags commentsFNAME1string-BNUM3longBID4long - -FDATA5carray- -BSIZE6long-服務(wù)端程序Call.c的內(nèi)容:#include <stdio.h>#include <ctype.h>#include <atmi.h>#include <user
4、log.h>#include "fml32.h"#include "myfml.h"CALL(TPSVCINFO *rqst)FILE *fp;long i=0;FBFR32 *rcvbuf;char fname100=""FLDLEN32 len=0;long bid=0;long bsize=1024;/*傳送的塊大小為1024字節(jié)*/char *fdata;rcvbuf=(FBFR32 *)rqst->data;len=sizeof(bid);if(Fget32(rcvbuf,BID,0,(char *)&b
5、id,&len) = -1)userlog("Fget32(BID) failure :%s",(char *)Fstrerror32(Ferror32);tpreturn(TPFAIL,0,0,0,0);len=sizeof(fname);if(Fget32(rcvbuf,FNAME,0,fname,&len) = -1)userlog("Fget32(FNAME) failure :%s",(char *)Fstrerror32(Ferror32);tpreturn(TPFAIL,0,0,0,0);strcat(fname,"
6、;.s");if (fp=fopen(fname, "rb")=NULL) fp=fopen(fname, "wb");else if(bid = 0 )fclose(fp);fp=fopen(fname, "wb");elsefclose(fp);fp = fopen(fname, "r+b");if(fp = NULL)userlog("fopen() %s failuren",fname);tpreturn(TPFAIL,0,0,0,0);fdata=(char *)malloc
7、(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);tpreturn(TPFAIL,0,0,0,0);i=bid * bsize;if(fseek(fp, i, 0)!=0)
8、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的內(nèi)容:#include <stdio.h>#include <stdarg.h>#include "atmi.h&qu
9、ot;#include "fml32.h"#include "myfml.h"FBFR32 *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)lo
10、ng rcvlen=0;long filelen=0;long i=0;int ret=0;long reallen=0;long bnum=0;long bsize=1024;/*傳送的塊大小為1024字節(jié)*/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)
11、;exit(1);if(fseek(fp, 0, SEEK_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
12、");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)printf("malloc(filebuf) failure"); exit(1);bn
13、um=(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);for(i=0;i<bnum;i+)if(fseek(fp, i*bsize, 0)!=0)log("fseek failuren");reallen=
14、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)rea
15、llen)<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=%ld,errstr=%sn",tperrno,tpstrerror(tperrno);log("finishedn");82 異步調(diào)用
16、方式如圖所示:在異步請求/回答方式中,客戶端使用tpacall()給本地或遠程的服務(wù)器(由TUXEDO系統(tǒng)根據(jù)公告板信息確定)發(fā)送服務(wù)請求,與同步方式不同的是:在此方式下,服務(wù)器處理請求時,客戶端繼續(xù)運行。當(dāng)客戶端想得到請求的處理結(jié)果時,用tpgetrply()將結(jié)果取回。調(diào)用過程如圖:Tpinit()Tpalloc()Tpacall()TOUPPER(TPSVCINFO *rqst)Tpgetrply()Tpterm()其他的處理例子:該例子實現(xiàn)與同步調(diào)用方式一樣的功能.但在該例子中采用異步通訊方式.服務(wù)端的程序與同步調(diào)用方式中的一樣,客戶端的程序Acallcli.c的內(nèi)容如下:注意:每調(diào)用
17、TPACALL()50次之后,就要調(diào)用tpgetrply()把服務(wù)端返回的結(jié)果取出,否則,返回緩沖區(qū)會滿,會出如下錯誤:atpcall() failure:tperrno=5,errstr=TPELIMIT - a system limit has been reachedAcallcli.c的內(nèi)容:#include <stdio.h>#include <stdarg.h>#include "atmi.h"#include "fml32.h"#include "myfml.h"FBFR32 *sendbuf=N
18、ULL;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 rcvlen=0;long filelen=0;long i=0;int ret=0;long reallen=0;long bnum=0;lon
19、g bsize=1024;/*傳送的塊大小為1024字節(jié)*/FLDLEN32 len=0;long j=0;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()
20、 failure:");exit(1);filelen=ftell(fp);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, (FLDLEN32)len)= -1)printf("finit32() failuren")
21、;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(FNAME) failuren&
22、quot;,Fstrerror32(Ferror32);printf("filelen = %ld, block num = %ldn",filelen,bnum);j=0;for(i=0;i<bnum;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(
23、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",Fstrerror32(Ferror32);ret = tpacall("CALL", (char *
24、)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;j<50;j+)if(tpgetrply(&cdj,(char *)&sendbuf, &rcvlen, (long)0)= -1)log("tpgetrply() failure:cd=%ld,errstr=%sn",cd,tpstrerror(tperrno);
25、j=0;log("finishedn");73 會話方式采用會話通訊方式,通訊雙方在建立連接之后,可以多次發(fā)送或接收數(shù)據(jù),TUXEDO中采用的是半雙工的通訊方式,這種方式特別適用于大批量的數(shù)據(jù)傳輸。名稱解釋:發(fā)起者(originator,initiator):發(fā)起該會話的進程,它調(diào)用tpconnect()與服務(wù)端的一個SERVICE建立連接從屬者(subordinate):tpconnect()中指定的SERVICE發(fā)送者(sender):當(dāng)前擁有發(fā)送權(quán)的進程,它只能發(fā)送數(shù)據(jù)接收者(receiver):當(dāng)前擁有發(fā)送權(quán)的進程,它只能接收數(shù)據(jù)函數(shù)說明:int tpconnect
26、 (char* name, char *data, long length, long flags)描述: 與名為name的SERVICE建立連接參數(shù):name:SERVICE的名字*data:要發(fā)送的數(shù)據(jù)length:數(shù)據(jù)的長度flags:可以為TPNOTRAN, TPNOTIME,TPNOBLOCK,TPSIGRSTRTTPSENDONLY:發(fā)送者只能發(fā)送數(shù)據(jù),被調(diào)用的SERVICE只能接收數(shù)據(jù)TPRECVONLY:發(fā)送者只能接收數(shù)據(jù),被調(diào)用的SERVICE只能發(fā)送數(shù)據(jù)返回值: 成功返回一個標識該連接的標識符,失敗為-1int tpsend(int cd, char *data, long
27、 length, long flags,long *revent)描述:用于發(fā)送數(shù)據(jù)參數(shù):cd: tpconnect()的返回值,用于標識該連接data: 要發(fā)送的數(shù)據(jù)length:要發(fā)送的數(shù)據(jù)的長度flags:(TPNOBLOCK, TPNOTIME, TPSIGRSTRTTPRECVONLY:把發(fā)送權(quán)交給接受者,在接受者那里會產(chǎn)生事件TPEV_SENDONLY。revent:當(dāng)返回值為-1時,如果tperrno= TPEEVENT,那么表明有事件發(fā)生??赡艿氖录?TPEV_DISCONIMM:當(dāng)會話的發(fā)起者調(diào)用tpdiscon(), tpreturn(), tpcommit()時,會話的
28、從屬者會收到該事件。如果有網(wǎng)絡(luò)故障等,那么會話的發(fā)起者也會收到該事件。TPEV_SVCFAIL:會話的發(fā)起者會收到該事件,表明會話的從屬者調(diào)用tpreturn(TPFAIL)或tpreturn(TPEXIT), 并且該會話的從屬者不在擁有該控制權(quán)TPEV_SVCERR:會話的發(fā)起者會收到該事件,表明會話的從屬者調(diào)用tpreturn(TPSUCCESS,.)返回,并且該會話的從屬者不在擁有該控制權(quán).返回值:失敗為-1,如果tperrno= TPEEVENT,那么導(dǎo)致該調(diào)用失敗的事件保存在revent中int tprecv(int cd, char *data, long *length, lon
29、g flags, long *revent)描述:用于接收數(shù)據(jù)data: 接收的數(shù)據(jù)放到該緩沖區(qū)中l(wèi)ength:接收大的數(shù)據(jù)的長度flags:(TPNOCHANGE, TPNOBLOCK, TPNOTIME, TPSIGRSTRT)revent:當(dāng)返回值為-1時,如果tperrno= TPEEVENT,那么表明有事件發(fā)生??赡艿氖录?TPEV_DISCONIMM:與tpsend()中的含義一樣.TPRECVONLY:該會話的發(fā)送者把發(fā)送權(quán)交給接受者,在接受者這里會產(chǎn)生事TPEV_SENDONLY。TPEV_SVCFAIL: 與tpsend()中的含義一樣.TPEV_SVCERR: 與tpse
30、nd()中的含義一樣.TPEV_SVCSUCC: 該會話的從屬者已成功完成并關(guān)閉該會話,那么會話的發(fā)起者會收到該事件.表明該會話已成功結(jié)束.返回值:失敗為-1,如果tperrno= TPEEVENT,那么導(dǎo)致該調(diào)用失敗的事件保存在revent中int tpdiscon(int cd)描述:關(guān)閉標識符為cd的會話參數(shù): tpconnect()的返回值,用于標識該連接返回值:失敗為-1 會話通訊方式的整個過程如圖所示:Tpconnect()(TPSENDONLY)只能發(fā)送數(shù)據(jù)Tpsend()(TPRECVONLY)只能接收數(shù)據(jù)Tprecv()接收數(shù)據(jù),并結(jié)束SERVICETprecv()只能接收數(shù)
31、據(jù)Tpsend()只能接收數(shù)據(jù)Tprecv()只能接收數(shù)據(jù)Tpreturn()(TPSUCCESS)例子: 該例子實現(xiàn)與同步通訊的例子一樣的功能,但采用的是會話通訊方式.服務(wù)端程序的內(nèi)容:#include <stdio.h>#include <atmi.h>#include <userlog.h>#include "fml32.h"#include "myfml.h"long bsize=1024;/*傳送的塊大小為1024字節(jié)*/FBFR32 *rcvbuf;char fname256=""cha
32、r *fdata;tpsvrinit(int argc, char *argv)if (rcvbuf=(FBFR32 *)tpalloc("FML32",NULL,(bsize+1024) = NULL) userlog("tpalloc failuren");return(-1);if (fdata=(char *)malloc(bsize+1) = NULL) userlog("malloc failuren");tpfree(char *)rcvbuf);return(-1);return(0);void tpsvrdone()
33、tpfree(char *)rcvbuf);free(char *)fdata);CONN(TPSVCINFO *rqst)FILE *fp;FLDLEN32 len=0;long bid=0;long len1=0;long revent=0;char tmpbuf1256;while(1) if(tprecv(rqst->cd,(char *)&rcvbuf,&len1,0,&revent)=-1) if(tperrno=TPEEVENT)&&(revent=TPEV_SENDONLY) fclose(fp);break;else userlo
34、g("tprecv failure:%s,event=%ldn",tpstrerror(tperrno),revent);tpreturn(TPFAIL,0,0,0L,0);len=sizeof(bid);if(Fget32(rcvbuf,BID,0,(char *)&bid,&len) = -1) userlog("Fget(BID) failure :%s",(char *)Fstrerror32(Ferror32);tpreturn(TPFAIL,0,0,0,0); if (bid = 0) len=sizeof(fname);if
35、(Fget32(rcvbuf,FNAME,0,fname,&len) = -1) userlog("Fget(FNAME) failure:%s",(char *)Fstrerror32(Ferror32);tpreturn(TPFAIL,0,0,0,0);strcat(fname,".s");if(fp=fopen(fname, "wb")= NULL) userlog("fopen(%s)failuren", fname);tpreturn(TPFAIL,0,0,0,0);len=bsize;if(Fg
36、et32(rcvbuf,FDATA,0,fdata,(FLDLEN32 *)&len) = -1) userlog("Fget(FDATA) failure %s",(char *)Fstrerror32(Ferror32);tpreturn(TPFAIL,0,0,0,0);if (fwrite(fdata,1,len,fp) != len) userlog("fwrite(%s) failuren", fname);tpreturn(TPFAIL,0,0,0,0);tpreturn(TPSUCCESS,0,0,0L,0);客戶端程序的內(nèi)容:#i
37、nclude <stdio.h>#include <stdarg.h>#include "atmi.h"#include "fml32.h"#include "myfml.h"static FBFR32 *sendbuf=NULL;static char *filebuf;static FILE *fp;log(const char *fmt, .)va_list ap;va_start(ap, fmt);vfprintf(stdout, fmt, ap);fflush(stdout);va_end(ap);f
38、close(fp);tpfree(char *)sendbuf);free(filebuf);tpterm();exit(1);int main(int argc, char *argv)long cd=0;long revent=0;long rcvlen=0;long filelen=0;long reallen=0;long bnum=0;FLDLEN32 len=0;int bsize = 1024; /*傳送的塊大小為1024字節(jié)*/long i = 0;if(argc != 2)printf("Usage: %s filenamen",argv0);exit(1
39、);if (fp = fopen(argv1, "rb" )= NULL)printf("open file:%s failuren",argv1);exit(1);if (fseek(fp, 0, SEEK_END)!=0)printf("fseek() failure:");exit(1);filelen=ftell(fp);rewind(fp); if(sendbuf = (FBFR32 *)tpalloc("FML32", NULL, bsize+1024) = (FBFR32 *)NULL) printf
40、("Error allocating send buffern");exit(1);if (tpinit(NULL)= -1) printf("tpinit() failure:%sn",tpstrerror(tperrno);exit(1);if (cd = tpconnect("CONN",NULL,0,TPSENDONLY)=-1)printf("tpconnect: %sn",tpstrerror(tperrno);exit(1); if(filebuf=(char *)malloc(bsize+1)= N
41、ULL) printf("malloc(filebuf) failure");exit(1);bnum=(filelen -1)/bsize + 1;if(Fchg32( sendbuf, FNAME, 0, argv1, (FLDLEN32)len )<0)printf("Fchg32(FNAME) failuren",Fstrerror32(Ferror32);exit(1); for(i=0;i<bnum;i+) reallen=fread(filebuf, 1, bsize, fp);if(reallen!=bsize &&a
42、mp; feof(fp)=0 )log("fread(%s) failuren",argv1);if(Fchg32(sendbuf, BID, 0, (char *)&i, 0)<0)log("Fchg32(FBID) failure:%sn",Fstrerror32(Ferror32); if(Fchg32( sendbuf, FDATA, 0, filebuf, (FLDLEN32)reallen)<0) log("Fchg32(FDATA) failure:%sn",Fstrerror32(Ferror32)
43、;revent = 0; if(tpsend(cd,(char *)sendbuf,0,TPNOTIME,&revent)=-1) if(tperrno=TPEEVENT)printf("tpsend():failule,revent=%ld,strerr=%sn", revent,tpstrerror(tperrno);else log("tpsend():failule,revent=%ld,strerr=%sn", revent,tpstrerror(tperrno);/*發(fā)送最后一塊時,把發(fā)送權(quán)交給服務(wù)端*/revent = 0;if(i
44、 = bnum)if (tpsend(cd,NULL,0,TPRECVONLY,&revent)=-1)log("tpsend3():failule,revent=%ld,strerr=%sn",revent,tpstrerror(tperrno); /*當(dāng)SERVER中tpreturn(TPSUCCESS,.)時revent = TPEV_SVCSUCC, 當(dāng)SERVER中tpreturn(TPFAIL,.)時revent = TPEV_SVCFAIL*/if (tprecv(cd,(char *)&sendbuf,&rcvlen,0,&r
45、event)=-1)if(revent != TPEV_SVCSUCC)log("tprecv():failule,revent=%ld,strerr=%sn",revent,tpstrerror(tperrno);log("finished");74 廣播方式客戶端與服務(wù)端之間可以采用廣播方式(UNSOLICITED NOTIFICATION)進行通訊,一個服務(wù)端進程或客戶端進程可以給一個或多個客戶端進程發(fā)送消息. 收到該消息的客戶端進程可調(diào)用一個預(yù)先定義好的函數(shù)對該消息進行處理.整個過程很象UNIX中的信號處理.有兩種使用方式:一對一(點對點): 一
46、個服務(wù)端進程或客戶端進程給某個客戶端進程發(fā)消息一對多(廣播): 一個服務(wù)端進程或客戶端進程給符合某個條件的一組客戶端發(fā)消息注意: 消息的接受者只能是客戶端,不能是服務(wù)端。消息發(fā)送進程消息接收進程 Tpnotify()服務(wù)端進程或客戶端進程 客戶端進程 (1)點對點通訊方式消息接收進程 消息發(fā)送進程Tpbroadcast()消息接收進程服務(wù)端進程或客戶端進程 消息接收進程 客戶端進程 (2)廣播通訊方式消息的通知方式有3種:IGNORE: 該TUXEDO應(yīng)用系統(tǒng)中的客戶端不接收任何消息SIGNAL: 用SIGUSR1,SIGUSR2信號通知客戶端有消息到來,如果在非UNIX平臺上設(shè)置采用該方式,
47、那么會被自動轉(zhuǎn)化為DIPIN方式。DIPIN: 當(dāng)客戶端調(diào)用ATMI函數(shù)時,順便檢查看是否有消息,如果有調(diào)用消息處理函數(shù)進行處理。消息的通知方式在UBBCONFIG文件的RESOURCES中設(shè)置,默認為DIPIN,如:下面的設(shè)置采用SIGNAL通知方式NOTIFY SIGNAL也可以在tpinit()函數(shù)的tpinfo結(jié)構(gòu)體的flags字段中設(shè)置:tpinfo->flags=TPU_DIP; /*采用DIPIN通知方式*/tpinfo->flags=TPU_IGN; /*不接收任何的消息*/tpinfo->flags=TPU_SIG; /*采用SIGNAL通知方式*/注意:在
48、tpinfo->flags的設(shè)置會覆蓋在UBBCONFIG中的設(shè)置與消息通訊方式有關(guān)的ATMI:int tpnotify (CLIENTID *clientid, char *data, long len,long flags)描述: 一個CLIENT或SERVER調(diào)用該函數(shù)給某一個CLIENT發(fā)消息參數(shù):clientid: TPSVCINFO結(jié)構(gòu)體種中的clientid字段,可從SERVICE的TPSVCINFO結(jié)構(gòu)體中得到,也可通過MIB調(diào)用得到.data:該消息所包含得數(shù)據(jù).要用TPALLOC()函數(shù)分配得緩沖區(qū)來接收.len :該數(shù)據(jù)得長度,只有類型為CARRAY時,才要指定.f
49、lags: 可設(shè)為TPNOBLOCK, TPNOTIME,TPSIGRSTRT, TPACK TPNOBLOCK, TPNOTIME,TPSIGRSTRT的含義與TPCALL()中的一樣 TPACK:如果設(shè)置了,會返回詳細的出錯消息.返回值: 失敗為-1int tpbroadcast (char *lmid, char *usrname,char *cltname, char *data, long len, long flags)描述:個CLIENT或SERVER調(diào)用該函數(shù)給某一個CLIENT或多個CLIENT發(fā)消息參數(shù):lmid :給該臺機器上的所有CLIENT發(fā)消息usrname:給名為
50、usrname的CLIENT發(fā)消息cltname:給組名cltname的一組CLIENT發(fā)消息data: 該消息所包含得數(shù)據(jù).要用TPALLOC()函數(shù)分配得緩沖區(qū)來接收.len:該數(shù)據(jù)得長度,只有類型為CARRAY時,才要指定.flags: 可以設(shè)置為TPNOBLOCK, TPNOTIME, TPSIGRSTRT.返回值: 失敗為-1說明: lmid,usrname,cltname用于確定要發(fā)送的范圍,如果某個值為NULL,則表示給所有.如:tpbroadcast(NULL, NULL,NULL,.)表示給所有的客戶端發(fā)消息tpbroadcast(SIMPLE, NULL,NULL,.):表
51、示給LMID=SIMPLE的機器上的所有客戶端發(fā)送消息.int tpchkunsol()描述: 如果消息的通知方式為DIP_IN,那么可用該函數(shù)檢查消息,如果為IGNORE,SIGNAL,那么該函數(shù)將立即返回.如果有未被處理的消息,該函數(shù)將調(diào)用消息處理函數(shù)進行處理,直到所有收到的消息都處理完,該函數(shù)才會返回,參數(shù):返回值: 成功返回本次調(diào)用處理的消息個數(shù),失敗為-1void (*tpsetunsol(void (_TMDLLENTRY *)(*disp) (char *data, long len,long flags) ()描述:用于設(shè)置消息處理函數(shù),調(diào)用消息處理函數(shù)disp對消息進行處理.
52、參數(shù):disp:消息處理函數(shù)的名稱data: 該消息所包含得數(shù)據(jù).要用TPALLOC()函數(shù)分配得緩沖區(qū)來接收.len: 該數(shù)據(jù)得長度,只有類型為CARRAY時,才要指定.flags: 現(xiàn)在沒用,設(shè)為0.返回值: 成功為0,失敗為-1例子:在該例子中,客戶端程序Broadcast.c可以用于給所有的客戶端或某些客戶端發(fā)消息,如當(dāng)TUXEDO應(yīng)用服務(wù)器要重啟動時,可以用該程序給所有的CLIENT發(fā)一條消息: THE TUXEDO SERVER WILL SHUTDOWN IN 3 MINUTES,PLEASE EXIT. 那么所有沒有屏蔽消息通訊方式客戶端馬上會收到該消息。沒有屏蔽消息通訊方式使指UBBCONFIG中NOTIFY 沒有設(shè)置為IGNORE,并且在調(diào)用tpinit()時沒有設(shè)置tpinfo->flags=TPU_IGN??蛻舳顺绦駼roadcast.c的內(nèi)容:#include <stdio.h>#include "atmi.h"/* TUXEDO Header File */main(int argc, char *argv)char *sendbuf;long sendlen;i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度拓展訓(xùn)練場地與高校合作教育項目協(xié)議
- 二零二五年度物流運輸企業(yè)員工入職保密協(xié)議及供應(yīng)鏈保護
- 2025年度高端定制酒定制生產(chǎn)合同
- 二零二五年度足療中心員工勞動合同范本
- 2025年度終止勞動合同協(xié)議書:SS企業(yè)員工TT合同終止及離職手續(xù)辦理協(xié)議
- 二零二五年度醫(yī)療援助項目醫(yī)生聘用協(xié)議
- 二零二五年度口腔診所負責(zé)人侵權(quán)責(zé)任免除與賠償處理合同
- 二零二五年度上市公司股份回購?fù)斯蓞f(xié)議
- 2025年度高科技園區(qū)土地租賃服務(wù)協(xié)議
- 二零二五年度房屋租賃合同租賃物能源消耗管理補充協(xié)議
- 機關(guān)檔案管理工作培訓(xùn)PPT課件
- 大學(xué)生安全教育課件(ppt共41張)
- 初中物理人教版八年級下冊 第1節(jié)牛頓第一定律 課件
- 網(wǎng)站培訓(xùn)內(nèi)容trswcm65表單選件用戶手冊
- 監(jiān)理大綱(范本)
- 空調(diào)系統(tǒng)維保記錄表格模板
- 打印版-圓與二次函數(shù)綜合題精練(帶答案)
- 工程結(jié)算書標準
- 氧氣管道吹掃方案(共7頁)
- JJG-943-2011-總懸浮顆粒物采樣器
- 2018年湖北省襄陽市中考物理試卷
評論
0/150
提交評論