Tuxedo應用指南(二)_第1頁
Tuxedo應用指南(二)_第2頁
Tuxedo應用指南(二)_第3頁
Tuxedo應用指南(二)_第4頁
Tuxedo應用指南(二)_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、 ATMI及編程模型 編程涉及到的環(huán)境 類型緩沖區(qū) 編寫客戶機程序 編寫服務器程序 編寫請求/響應程序 編寫會話程序 編寫帶全局事務的服務器 使用TMIB維護和監(jiān)控系統(tǒng)ATMI(Application to Transation Monitor Interface 應用到事務監(jiān)視器接口) 是Tuxedo為客戶實施分布式應用提供一套C函數(shù)。ClientServer1Database1Server2Database2tpinittpcalltpbegintpcommittpreturntpforwardRMTMApplication 請求/響應模型最基本的通信方式,客戶機發(fā)起請求,服務器進程處理完

2、請求后將響應返回客戶機。此時,該交互即完成。其中異步是基本的方式: tpcall = tpacall + tpgetrplyServerClienttpcallservice_fun() tpreturnServerClienttpacall做一些事情tpgetrplyservice_fun() tpreturnServer1Clienttpcallservice_fun1() tpcall tpforward 此處代碼會執(zhí)行!service_fun2() tpreturn()Server2service_fun3() tpreturn()Server3 會話模型先建立起連接(即客戶進程與服務

3、進程建立起協(xié)作關系),然后在該連接上進行多次交互。該模式是有狀態(tài)的,因為服務進程的上下文在會話結(jié)束之前一直保持。ServertpconnectClienttpdiscontpsendtprecvtpsendtprecv上下文N次交互 消息通知前面的方式中,服務器是被動的(處理過程需要由客戶機發(fā)起)。如果服務器要主動給客戶發(fā)消息,就要用到消息通知。ServerClient注冊的消息處理器tpnotify/tpbroadcast 事件代理Tuxedo有一個事件代理服務器,客戶機和服務器可以通過它訂閱或發(fā)布事件。事件代理tpsubscribe事件處理器Server/ClienttppostServe

4、r/Client/Q大型應用的一次交易處理一般會涉及與多個服務器交互(多層結(jié)構(gòu)),服務器的協(xié)作方式主要有三種: 嵌套調(diào)用在服務內(nèi)部調(diào)用另一個交易。除非必須使用,不建議采用此方式。該模式形成一個服務器調(diào)用鏈,所有鏈上的服務器在交易結(jié)束之前不能再處理其它請求。 轉(zhuǎn)發(fā)推送tpcall(client) tpforward(1.N) tpreturn(last) 異步推送tpacall_no_reply(client)tpacall_no_reply(1.N) endtpcallEAI適配層forward分派層forward交易處理層tpacalltpacalltpacallEND從總線取出請求將響應放

5、入總線 推送是無狀態(tài)的,效率高,重入時要設法恢復它的運行上下文。 嵌套會占用更多的進程,并發(fā)性會降低,但調(diào)用者的上下文不會丟失。flowS1S2Local ServerRomte Serversave ctx tpacall tpcalltpacall callbackload ctxS2Storage 如果有執(zhí)行狀態(tài)返回,-1表示失敗。 查看出錯信息在調(diào)用API時都有類似如下的出錯檢測代碼:if (tpacall(TUX_SVC, send_buf, (long)send_len, TPNOREPLY) = -1) userlog(tpacall失敗: errno=%d, msg=%s,tp

6、errno, tpstrerror(tperrno);tpfree(text);return -1; 編程相關的UBB參數(shù) 編寫會話服務器,要在Servers節(jié)中指示是個會話服務器(CONV=Y) 使用工作站客戶端要在Machines節(jié)中指定MAXWSCLINETS的數(shù)量 存在著大量與編程密切相關的UBB參數(shù)(參見用C寫ATMI應用第二章),系統(tǒng)配置與編程在此產(chǎn)生了較強的耦合。 特定用途的環(huán)境變量 使用VIEW32視圖:VIEWDIR32、VIEWFILES32 使用FML32視圖:FLDTBLDIR32、FIELDTBLS32 編譯器應采用與操作系統(tǒng)淵源最深的編譯系統(tǒng),因為buildserv

7、er對編譯器是由針對性的。 AIX 使用XLC C/C+ Windows使用Visual C+ Linux使用gcc HP-UX 使用aCC/aC+ 頭文件 atmi 重要的頭文件,含ATMI接口定義,聲明公開的函數(shù)與常量宏 fml.h/fml32.h 定義了操作FML的函數(shù)與常量 tpadmin.h 定義TMIB接口的函數(shù) userlog.h 用戶日志接口(用于生成ULOG日志文件) Tuxedo程序庫Tuxedo程序庫信息由buildserver/buildclient自動附加到編譯命令行上,用戶一般不用關心。所有庫都在$TUXDIR/lib目錄下。 libtmib.a TMIB庫,使用t

8、padmcall時要包含此庫 libtux.a Tuxedo主函數(shù)庫,大部分函數(shù)都在此庫中 libfml.a/libfml32.a 操作FML/FML32的函數(shù)庫 lengine.a 平臺上的一些公共例程,如安全、線程管理、消息轉(zhuǎn)換等注:不知道函數(shù)在什么庫中時,可用nm命令去尋找。 緩沖區(qū)的種類 分配緩沖區(qū) 釋放緩沖區(qū) 改變緩沖區(qū)的大小 數(shù)據(jù)操作(各類型緩沖區(qū)有自己的操作方法) VIEW/VIEW32 FML/FML32 XML 類型緩沖區(qū)是帶類型說明的內(nèi)存塊,它的引入給開發(fā)者增加一些額外的負擔,但這是值得的: 類型緩沖區(qū)為異質(zhì)系統(tǒng)建立了一個中間層,當與目標系統(tǒng)通信時,調(diào)用者與接收者只需考慮類

9、型緩沖區(qū)而不用考慮目標主機的數(shù)據(jù)結(jié)構(gòu)(機器字節(jié)數(shù)、對齊方式、字節(jié)順序、字符編碼) 附加的好處:類型緩沖區(qū)都是動態(tài)內(nèi)存(從堆上分配),使用類型緩沖區(qū)也便于系統(tǒng)集中管理動態(tài)內(nèi)存(分配、釋放、優(yōu)化等),減少內(nèi)存出錯的機率。 類型緩沖區(qū)之間的比較可以從如下幾個方面進行: 是否是自描述的。自描述的緩沖區(qū)在tpcall、tpreturn中可不指定它的大小。 有無子類型。 是否支持DDR。根據(jù)緩沖區(qū)中的某些數(shù)據(jù)項的值,按指定的標準將請求路由到不同的服務器組上。支持DDR的緩沖區(qū)一定是帶成員的聚集,并且可以按成員名稱訪問。 是否存在編碼、解碼。不存在時,傳輸效率高,但異質(zhì)支持差 CARRAY一個內(nèi)存塊,就如用

10、malloc分配的一樣。它不知道自己有多大,需要有其它變量指示它的大小。它效率最高,因為它不編碼/解碼。CARRAY主要用來轉(zhuǎn)輸一個內(nèi)存塊。 FML/FML32是一種自描述的緩沖區(qū),每個數(shù)據(jù)域都有標識號、長度等信息。FML只通過函數(shù)進行操作,因而有很好的靈活性(帶來類似于用對象方法代替直接操作數(shù)據(jù)域的好處)。它支持DDR,一般的DDR實現(xiàn)都是基于FML的。 STRING是C的字符串類型,以0作為結(jié)束符。但它是支持編碼與解碼的。它顯然不能支持類似UTF16這樣的寬字符集的串(這時應使用MBSTRING),如果必須使用STRING來傳遞UTF-16的話,可先轉(zhuǎn)換為UTF-8后再傳輸。 VIEW/V

11、IEW32VIEW就是C結(jié)構(gòu)同義詞,只是為了實現(xiàn)異構(gòu)系統(tǒng)之間的數(shù)據(jù)交換而需要做一些額外的工作。一些工作是開發(fā)者做的,另一些是系統(tǒng)內(nèi)部做的。結(jié)構(gòu)可以按字段訪問的,因而可以DDR。 XML與CARRAY差別不大。XML比CARRAY多一點的功能是,告訴大家“我的內(nèi)容是一個XML文檔”。XML支持DDR,但代價遠比FML與VIEW大。 MBSTRING是支持多字節(jié)字符編碼的串,這樣的串不再是與C兼容,不能用中的函數(shù)來操作它們。它的頭部包含有字符集信息。 緩沖區(qū)是動態(tài)內(nèi)存,使用前必須用tpalloc函數(shù)分配。 原型:char* tpalloc(char* type,/* 類型名:如STRING,XML

12、*/char* subtype,/* 子類型,適用FML/VIEW*/long size)/* 大小 0, =0為缺省大小 */ 返回值。成功返回緩沖區(qū)指針,失敗返回NULL(0), 雖然分配的失敗機會很少,但返回值必須測試是否為NULL! 例:char* buf = tpalloc(“STRING”,0,0); 注:Tuxedo形成較早,char*多數(shù)是指void*。 緩沖區(qū)可以更改大小,大小更改后,返回的地址可能上新的地址,以后使用新的地址,而不能再用分配前的地址。 原型:char* tprealloc(char* ptr,/* 緩沖區(qū)指針 */long size)/* 新的大小*/注意:

13、返回值不一不等于ptr!不建議使用tprealloc,好的辦法是分配新尺寸的緩沖區(qū),從原緩沖區(qū)復制數(shù)據(jù)到新緩沖區(qū),刪除原緩沖區(qū)。該函數(shù)比較兇險,使用不當有可能導致內(nèi)存泄漏。 緩沖區(qū)可以測定它的類型、子類型和大小。 原型: 原型:long tptypes(char* ptr,/* 緩沖區(qū)指針 */char* type, /* 主類型 */char* subtype)/* 子類型 */ 返回值:緩沖區(qū)的大小,失敗返回-1 注意:type的長度為8, subtype的長度為16 與malloc函數(shù)一樣,tpalloc分配的緩沖區(qū)使用之后也需要釋放。 原型:void tpfree(char* ptr/

14、* 緩沖區(qū)指針 */) 注意:tpforward,tpreturn傳入的緩沖區(qū)是在這些函數(shù)內(nèi)部釋放,因為用戶此時已失去了控制權。其它場合一律要釋放(如在tpacall/tpcall使用之后),否則將出現(xiàn)內(nèi)存泄漏。ptr=NULL時函數(shù)什么都不干。該函數(shù)只能用于釋放用tpalloc分配的內(nèi)存。 設置環(huán)境變量 VIEWDIR32 VIEW定義文件的目錄,多個UNIX用“:”,Windows用”;”分隔 VIEWFILES32 VIEW定義文件名,多個用“,”分隔。 建立VIEW定義文件 Type 類型 short, long, float,double, char, string, carray.

15、 Cname 字段名 Fbname FML字段名,當存在VIEW與FML相互轉(zhuǎn)換時設置 Count 字段出現(xiàn)的個數(shù),數(shù)組 flag 標志。一般不用 Size 大小,只在類型為string和carray時使用 Null 指示空值。缺省時,數(shù)字類型為(0/0.0),字符為0字符,字符串為空串。示例: #type cname fbname count flag size null float amount - 1 - - 0.0 編譯VIEW定義文件viewc32 -n -d viewdir viewfile-n 使用的是非FML關聯(lián)的VIEW-d 生成的.h文件與.V視圖文件目錄,缺省為當前目錄

16、使用VIEW按一般的C結(jié)構(gòu)使用即可,使用時包含viewc32生成的頭文件。 下面演示VIEW的使用 Client.cpp 使用VIEW的客戶端 Server.cpp 使用VIEW的服務端 VIEW的特點:效率高,結(jié)構(gòu)固定不可變 FML(Field Manipulation Language)是管理字段的C語言函數(shù)。相對于固定的VIEW,它的數(shù)據(jù)組織是可變的。它有FML頭信息、索引和字段數(shù)據(jù)。不用了解其內(nèi)部實現(xiàn),只需調(diào)用操作它的FML函數(shù)即可。 常用函數(shù)在fml32.h中定義,F(xiàn)ML有很多函數(shù),常用的有10個左右 設置環(huán)境變量 FLDTBLDIR32 FML字段表文件目錄 FIELDTBLS32

17、 FML字段表文件 定義字段表文件(Field Table File) *base value 字段的起始編號。1-100,6000-7000表系統(tǒng)保留 Name 字段名 Number 編號 type 類型 與VIEW相同,多了view32, fml32類型 flags 不用設置 Comments 注釋 FML定義文件例子*base 100# name number type flags commentsSUM 10 float - -AMT 11 double - - 生成頭文件(用于使用FML函數(shù))mkfldhdr32 field_table_file頭文件是字段名宏,例如:#define

18、 SUM (FIELDID32)167772312 /*number 110 type float */頭文件生成之后,我們就可以使用FML函數(shù)了。 增加FML字段int Fadd32(FBFR32* fbfr,/* 緩沖區(qū)地址 */FLDID32 fieldid,/* 字段號,見用mkfldhdr生成的頭文件 */char* value,/* 字段值 */FLDLEN32 len);/* 數(shù)組時設置,數(shù)組長度,非數(shù)組設為0*/返回值:失敗返回-1 更改FML字段值int Fchg32(FBFR32* fbfr,/* 緩沖區(qū)地址 */FLDID32 fieldid,/* 字段號 */FLDOC

19、C32 occ,/* 相同字段出現(xiàn)的次數(shù),-1作用同F(xiàn)add */char* value,/* 字段值 */FLDLEN32 len);/* 數(shù)組長度 */返回值:失敗返回-1 得到字段值int Fget32(FBFR32* fbfr,/* 緩沖區(qū)地址 */FLDID32 fieldid,/* 字段號 */int occ,/* 出現(xiàn)次數(shù),首次出現(xiàn)為 0 */char* value,/* 保存取出的值的緩沖區(qū) */FLDLEN32 *maxlen);/* 實現(xiàn)取出的字節(jié)數(shù) */ 得到字段出現(xiàn)的次數(shù)int Foccur32(FBFR32* fbfr,/* 緩沖區(qū)地址 */FLDID32 field

20、id);/* 字段號 */ 打印所有字段int Fprint32(FBFR32* fbfr);/* 緩沖區(qū)地址 */ 刪除字段int Fdelete32(FBFR32* fbfr,/* 緩沖區(qū)地址 */FLDID32 fieldid)/* 字段號 */ 返回緩沖區(qū)的大小int Fsizeof(FBFR32* fbfr)/* 緩沖區(qū)地址 */ 同時利用FML與VIEW的優(yōu)點FML擴展性好,傳輸效率高,但不如VIEW使用方便。 在VIEW定義文件中建立與FML的映射設置FBName為對應的FML字段名 使用轉(zhuǎn)換函數(shù)int Fvstof32(FBFR32* fbfr, char* struct_bu

21、f, int mode, char* view_name);參數(shù)mode 操作模式 FJOIN, FOJOIN, FCONCAT, FUPDATEint Fvftos32(FBFR32* fbfr,char* struct_buf, char* view_name); FML的字段可以是FML或VIEW這一功能非常有用,可以用FML表示非常復雜的對象。 提取字符編碼int tpgetmbenc(char* buf, char* enc_name, long flags); 設置字符編碼int tpsetmbenc(char* buf, char* enc_name, long flags);

22、設置環(huán)境變量TPMBENCint tuxsetmbenc(char* enc_name, long flags); 讀取環(huán)境變量TPMBENCint tuxgetmbenc(char* enc_name, long flags); 進行編碼轉(zhuǎn)換int tpconvmb(char* buf, int* len, char* target_enc, long flags); 加入到應用系統(tǒng) 退出應用系統(tǒng) 編譯和創(chuàng)建Tuxedo客戶(分Native/WSC) 例子演示 函數(shù)int tpinit (TPINIT *tpinfo); /* TPINIT結(jié)構(gòu),不使用附加特性,設為NULL*/TPINIT

23、名為TPINIT的類型緩沖區(qū),成員字段如下: char usrnameMAXTIDENT+2; /* 用戶名 */char cltnameMAXTIDENT+2; /* 客戶名 */char passwdMAXTIDENT+2; /* 口令 */char grpnameMAXTIDENT+2; /* 組名 */long flags;/* 標志位, 消息通知的上下文模式 */long datalen;/* data的長度 */long data;/* 應用數(shù)據(jù),此為占位符,長度可變 */ 檢查是否要求授權(是否要設置tpinit) int tpchkauth(void) 返回值:TPNOAUTH

24、 不要求授權TPSYSAUTH 系統(tǒng)級授權TPAPPAUTH 系統(tǒng)級和應用級授權 函數(shù)int tpterm(void)返回值:失敗返回-1說明:tpterm調(diào)用多次后,除第一次外,以后的調(diào)用什么都做。buildclient -w -o filename -f filenames -l filenames-w 編譯工作站客戶-f 要編譯的文件名或編譯參數(shù),目標文件先于tuxedo庫進行連接-l 類同-f,目標文件在tuxedo庫之后進連接 看文件simpcl.c 編譯 運行 main函數(shù)哪里去了? 系統(tǒng)支持的調(diào)用函數(shù) 服務例程編寫原則 定義一個服務 終止服務處理 構(gòu)建服務器程序C/C+的程序都有

25、一個main函數(shù),是程序的執(zhí)行入口。Tuxedo隱含生成main函數(shù),主函數(shù)內(nèi)部插入有非常關鍵的代碼。主函數(shù)的代碼段類似如下:int main(int argc, char* argv) /* 屏蔽能HANG的信號,設置SIGTERM連結(jié)BB, 建立隊列,發(fā)布服務 */if (tpsvrinit(usr_argc, usr_argv) = -1)return -1;while(1) msg = rcv_msg();dispatch(msg);tpsrvdone();return 0; 原型:int tpsvrinit(int argc,/* 參數(shù)個數(shù) */char* argv);/* 參數(shù)值的

26、數(shù)組 */返回值:如果返回-1服務器將不能啟動。說明:參數(shù)是指-之后的應用程序(不是服務參數(shù))argv0是否為程序名?文檔中沒有說明,做一個實例測試。服務函數(shù)一般用來初始化程序,如連結(jié)數(shù)據(jù)庫,打開日志文件,設置運行環(huán)境、創(chuàng)建服務對象等。 原型:void tpsvrdone(void);說明:應該是tpsvrinit()反向操作。前者分配資源,后者釋放資源。 服務請求返回必須以tpreturn或tpforward的方式結(jié)束。即使是響應tpacall_no_reply,也要調(diào)用tpreturn(TPSUCCESS, 0, 0, 0, 0); 服務請求返回當以tpacall(指示回復)調(diào)用其它服務時

27、,必須得到所有回復后,才能調(diào)用tpreturn/tpforward,或以tpcancel()放棄接收異步調(diào)用的回復。 一次只處理一個請求 例程在tpreturn/tpforward返回之前,沒有機會再處理其它請求。 服務函數(shù)原型:void service(TPSVCINFO* rqst)TPSVINFO表示服務請求信息,字段如下:char name32;/* 服務名稱 */long flags;/* 標志位,與前端調(diào)用有關,TPTRAN-在事務中 */char *data;/* 請求緩沖區(qū) */long len;/* 長度 */int cd;/* 會話描述符,會話服務器有效 */int app

28、key;/* 應用鍵值,缺省為-1,用于應用定義授權機制 */CLIENTID cltid; /* 客戶機標識號 */void ABAL(TPSVCINFO *transb) struct aud *transv; /* view of decoded message */transv = (struct aud *)transb-data;EXEC SQL declare acur cursor forselect SUM(BALANCE) from ACCOUNT;EXEC SQL open acur;EXEC SQL fetch acur into :bal; if (SQLCODE !

29、= SQL_OK) /* nothing found */strcpy (transv-ermsg,abal failed in sql aggregation);EXEC SQL close acur;tpreturn(TPFAIL, 0, transb-data, sizeof(struct aud), 0);EXEC SQL close acur;transv-balance = bal;tpreturn (TPSUCCESS, 0, transb-data, sizeof(struct aud), 0); 結(jié)束一個服務處理有三種方式 調(diào)用tpreturn返回響應 調(diào)用tpforward

30、將處理交給下一個服務 調(diào)用tpcancel放棄服務處理 函數(shù):void tpreturn(int rval,/* 返回值 */int rcode,/* 返回代碼 */char *data,/* 返回數(shù)據(jù) */long len,/* 數(shù)據(jù)長度,只在XML/CARRAY時設置*/long flags);/* 標志位 */返回值:為應用級設置。TPSUCCESS,TPFAIL,TPEXIT返回代碼:用戶可以通過全局變量得到tpurcode標志位:目前未使用。Tuxedo很多函數(shù)的末尾參數(shù)都是標志位,用于控制函數(shù)的行為。當接收超時時,要調(diào)用tpcancel撤銷回復鏈路int cd1 =tpacall(

31、sname, (char*)audv, sizeof(struct aud),TPNOTRAN);if (cd1 = -1) if (tpgetrply(cd1, (char*)&audv,&audrl, 0) = -1) if (tperrno = TPETIME) tpcancel(cd1);tpreturn(TPSUCCESS, 0,NULL, 0L, 0);當一個請求還需要被其它服務處理時,可以轉(zhuǎn)發(fā)請求。函數(shù):void tpforward(char *svc,/* 要轉(zhuǎn)發(fā)到的服務 */char *data,/* 請求緩沖區(qū) */ long len,/* 數(shù)據(jù)長度 =0

32、表示空長 */long flags)/* 標志,目前未使用,設置為0 */說明:執(zhí)行tpforward后,將產(chǎn)生longjmp調(diào)用,其后的代碼不會再執(zhí)行,服務進程回到起點,準備處理下一個請求。longjump與C+的析構(gòu)機制不符,不要在對象內(nèi)部執(zhí)行fpforward,否則后果不可預知。 函數(shù):int tpadvertise(char *svc,/* 要發(fā)布的服務名,不能為NULL */void *func)/* 服務函數(shù)指針,不能為NULL */int tpunadvertise(char *svc);/* 要取消發(fā)布的服務名,不能為NULL */注:服務名的長度為15個buildserver

33、 -o filename -f filenames -l filenames -s v -t rrm-o 輸出的程序文件名-f 輸入的文件,目標代碼在Tuxedo庫之前鏈結(jié)-l 輸入的文件,目標代碼在Tuxedo庫之后鏈結(jié)-s 要發(fā)布的服務,多個服務使用多個-s-t 生成線程安全代碼-r 程序要訪問的rm類型名 (名稱在RM文件中,該文件指示了使用XA要鏈入的庫文件)-v 輸出編譯細節(jié)(verbose)到標準輸出例:buildserver o ACCT f acct.o s NEW_ACCT:OPEN_ACCT s CLOSE_ACCT交易系統(tǒng)的絕大部分交易采用該模型,少量采用會話模型(如批量

34、和循環(huán)報文)使用最頻繁的幾個函數(shù):tpreturn 返回響應(只用在服務例程上)tpcall 同步調(diào)用tpacall異步調(diào)用(包括期望接收回復和不接收二種)tpforward 轉(zhuǎn)發(fā)請求(只用在服務例程上)tpgetrply 得到tpacall的回復int tpcall(char *svc,/* 要調(diào)用的服務名 */char *idata,/* 輸入緩沖區(qū)指針(請求),不能為NULL */long ilen,/* 輸入長度,自描述緩沖區(qū)可不設 */char *odata,/* 輸出緩沖區(qū)指針的地址,不能為NULL */long *olen,/* 輸出大小,不能為NULL */long flags

35、)/* 標志位 */返回值: 為-1為調(diào)用失敗標志位:TPNOTRAN 服務不參與全局事TPNOCHANGE 輸出緩沖區(qū)的類型不可更改TPNOBLOCK 非阻塞調(diào)用 int tpacall(char *svc,/* 要調(diào)用的服務名,不能為NULL */char *data, /* 請求緩沖區(qū),不能為NULL */long len, /* 數(shù)據(jù)和長度 */long flags)/* 標志位* /返回值:-1為失敗,成功返回會話描述符,該描述符由tpgetrply使用。標志位:與tpcall相同的部分TPNOREPLY 不期望接收回復,該參數(shù)非常重要,高性能的服務器往往使用該標志進行請求推送。in

36、t tpgetrply(int *cd,/* 由tpacall返回的描述符 */char *data,/* 響應數(shù)據(jù)緩沖區(qū)指針的地址 */long *len,/* 接收到的響應長度 */long flags);/* 標志位 */返回值:出錯返回-1標志位:類同tpcall(無TPNOTRAN)的部分TPGETANY 不考慮cd,獲取所有回復給調(diào)用者消息/* 由tpacall實現(xiàn)的tpcall */int my_tpcall(char* svc, char* idata, long ilen, char* odata, long* olen, long flags) int cd = tpaca

37、ll(svc, idata, ilen, flags);return (cd = -1)?-1:tpgetrply(&cd, odata, olen, flags);說明:調(diào)用者使用要求回復的tpacall是為了在請求與響應到達之間的時間段里可以做點別的工作。Void SVC(TPSVCINOF* rqst)char* rbuf = (char*)tpalloc(STRING, 0, 0);if (tpacall(PRINTER, rbuf, rlen, TPNOTRAN|TPNOREPLY)= -1)tpfree(rbuf);tpreturn(TPFAIL, 0, 0, 0, 0);

38、tpfree(rbuf);tpreturn(TPSUCCESS, 0, 0, 0, 0);int tpsprio(int prio, /* 優(yōu)先級0.100,如flags是指相對值,此處設置為0 */long flags); /* 標志 TPABSOLUTE 采用絕對值,這時prio也給個值 */返回值:失敗返回-1說明:此函數(shù)是對當前請求有影響??蓪⒁恍┮蟊M可以快速響應的交易設置為高的優(yōu)先級,下面的例子為“取款”交易的優(yōu)先級提高一級。if (tpsprio(PRIORITY, 0L) = -1) tpreturn(TPFAIL, 0,transb-data, 0L, 0);else if (tpcall(WITHDRAWAL, (char*)reqfb,0, (char*)&reqfb, (long *)&reqlen,TPSIGRSTRT) = -1) tpreturn(TPFAIL, 0,transb-data, 0L, 0); 會話通訊的特點 會話建立、應用與終止 建立會話服務程序 會話通訊事件 有狀態(tài)的會話建立后,服務進程就只為建立該會話的請求者使用,交互狀態(tài)一直有效 服務進程共享度低不適用大量的前端用戶使用,特別是有人參與會話。如果能用請求/響應實現(xiàn),就不

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論