《TUXEDO 系統經典——經乾》 9.6 TUXEDO/Q實現可靠資料轉送 原始碼

來源:互聯網
上載者:User

《TUXEDO 系統經典——經乾》 9.6 TUXEDO/Q實現可靠資料轉送 原始碼,代碼已在linux環境下驗證運行通過,由於國內涉及到tuxedo中介軟體的文章不多,此文僅用於熱愛tuxedo和即將要學習tuxedo的同仁交流學習。

用戶端程式

f_send.c

#include<stdlib.h>#include<stdio.h>#include<string.h>#include<sys/stat.h>#include<sys/types.h>#include<fcntl.h>#include<unistd.h>#include"atmi.h"#include"userlog.h"#include"fml32.h"#include"ftpfml.h"#define HEADER_LEN 32#define F_BLOCKSIZE 128#define F_SOURCE_DIR "/ngbss/tuxapp/src/chapter09/"char *data_buf;FBFR32 *desc_buf;int send_file(char *f_name);int main(int argc,char *argv[]){if(argc!=2){printf("Useage:commond filename\n");return -1;}if(tpinit((TPINIT*)NULL)==-1){fprintf(stderr,"tpinit failed!\n");return -1;}if((data_buf=tpalloc("CARRAY",NULL,F_BLOCKSIZE+HEADER_LEN))==NULL){fprintf(stderr,"Allocate CARRAY buffer failed!\n");tpterm();return -1;}if((desc_buf=(FBFR32*)tpalloc("FML32",NULL,1024))==NULL){fprintf(stderr,"Allocate FML32 buffer failed!\n");tpfree(data_buf);tpterm();return -1;}//傳送檔案send_file(argv[1]);return 0;}int send_file(char *f_name){int fd,n_byte;char sitename[16],head_c[32]="\0";long startcid,head_l;long blockcnt,rcv_len;struct stat f_stat;char c_buf[F_BLOCKSIZE];TPQCTL qctl;qctl.flags=TPQDELIVERYQOS;qctl.delivery_qos=TPQQOSNONPERSISTENT;//qctl.flags = TPQREPLYQ;//(void) strcpy(qctl.replyqueue, "REPLYQ");if((fd=open(f_name,O_BINARY|O_RDONLY))<0){printf("Open file:%s error!\n",f_name);return -1;}//計算檔案分區數fstat(fd,&f_stat);blockcnt=f_stat.st_size/F_BLOCKSIZE;if(f_stat.st_size%F_BLOCKSIZE!=0) blockcnt++;sprintf(data_buf,"%d",blockcnt);if(tpcall("COMMON_OP",data_buf,strlen(data_buf)+1,&data_buf,&rcv_len,0)==-1){userlog("common_op failed,%s!\n",tpstrerror(tperrno));close(fd);return -1;}sscanf(data_buf,"%s %d",sitename,&startcid);Fchg32(desc_buf,FILENAME,0,f_name,0);Fchg32(desc_buf,SITENAME,0,sitename,0);Fchg32(desc_buf,BLOCKCNT,0,(char*)&blockcnt,0);Fchg32(desc_buf,STARTCID,0,(char*)&startcid,0);printf("INFO:\tfilename:%s\tblockcnt:%d\n",f_name,blockcnt);//memset(data_buf,' ',HEADER_LEN+F_BLOCKSIZE);while((n_byte=read(fd,c_buf,F_BLOCKSIZE))>0){printf("n_byte=%d\n",n_byte);//確定訊息頭sprintf(head_c,"%s %d",sitename,startcid);head_l=strlen(head_c);memcpy(data_buf,head_c,head_l);//複製內容memcpy(data_buf+HEADER_LEN,c_buf,n_byte);printf("%s",data_buf+HEADER_LEN);printf("HEADER_LEN+n_byte=%d\n",HEADER_LEN+n_byte);//放入發送隊列if(tpenqueue("QSPACE","SENDQ",&qctl,data_buf,HEADER_LEN+n_byte,0)==-1){fprintf(stderr,"Enqueue SENDQ failed,%s\nDiagnostic:%d\n",tpstrerror(tperrno),qctl.diagnostic);break;}startcid++;}close(fd);//發送通知訊息//printf("send end message\n");if(tpenqueue("QSPACE","SENDQ",&qctl,(char*)desc_buf,0,0)==-1){fprintf(stderr,"SNEDQ is full,%s\nDiagnostic:%d\n",tpstrerror(tperrno),qctl.diagnostic);tpfree(data_buf);tpfree((char*)desc_buf);tpterm();return -1;}return 0;}

伺服器端程式:

common_op.c

#include<Uunix.h>#include<string.h>#include"atmi.h"#include"userlog.h"long currid=0;char sitename[16];void COMMON_OP(TPSVCINFO *rqst){strcpy(sitename,"site1");sprintf(rqst->data,"%s %d",sitename,currid);userlog("common_op:%s\n",rqst->data);tpreturn(TPSUCCESS,0,rqst->data,strlen(rqst->data)+1,0);}

b_recv.c

#include<string.h>#include<stdlib.h>#include"atmi.h"#include"userlog.h"void SENDQ(TPSVCINFO *rqst){userlog("Enter SENDQ--\n");TPQCTL qctl;char type[20],subtype[20],f_name[20];long head_l,blockcnt;FBFR32 *rbuf=(FBFR32*)rqst->data;tptypes(rqst->data,type,subtype);if(strcmp(type,"FML32")==0){     //收到通知訊息userlog("Received FileArrived--\n");tppost("FileArrived",rqst->data,0,TPSIGRSTRT);tpreturn(TPSUCCESS,0,NULL,0,0);}else{ userlog("Tpenqueuing -- \n");qctl.flags=TPQCORRID;memset(qctl.corrid,0,sizeof(qctl.corrid));strcpy(qctl.corrid,rqst->data);//strncpyuserlog("qctl.corrid:%s\n",qctl.corrid);qctl.flags|=TPQDELIVERYQOS;qctl.delivery_qos=TPQQOSNONPERSISTENT;userlog("rqst->len=%d\t strlen(rqst->data)=%d\n",rqst->len,strlen(rqst->data));if(tpenqueue("QSPACE","RECVQ",&qctl,rqst->data,rqst->len,0)==-1){userlog("tpenqueue RECVQ failed,%s\n",tpstrerror(tperrno));tpreturn(TPFAIL,0,NULL,0,0);}}tpreturn(TPSUCCESS,0,NULL,0,0);}

f_recv.c

#include<stdlib.h>#include<string.h>#include"atmi.h"#include"userlog.h"#include"ftpfml.h"#include<fcntl.h>#define HEADER_LEN 32  //==tpqctl.corrid[32]#define F_STEP 128#define F_RECV_PATH "/ngbss/tuxapp/src/chapter09/Recv"long sub_handle;char *tux_buf;int tpsvrinit(int argc,char *argv[]){if(tx_open()==-1){userlog("tpsvrinit: failed to open database");return -1;}TPEVCTL ectl;ectl.flags=TPEVSERVICE;strcpy(ectl.name1,"F_RECV");if((sub_handle=tpsubscribe("FileArrived",NULL,&ectl,TPSIGRSTRT))==-1){userlog("tpsubscribe() failed,%s\n",tpstrerror(tperrno));return -1;}if((tux_buf=tpalloc("CARRAY",NULL,HEADER_LEN+F_STEP))==NULL){userlog("Can`t allocate buffer CARRAY,%s\n",tpstrerror(tperrno));return -1;}return 0;}void F_RECV(TPSVCINFO *rqst){int fd,n_byte;long fn_len,sn_len,blockcnt,startcid,buflen;char c_buf[F_STEP],f_name[20],ff_name[80],s_name[20];TPQCTL qctl;FBFR32 *rbuf=(FBFR32*)rqst->data;qctl.flags=TPQWAIT|TPQGETBYCORRID;qctl.flags|=TPQREPLYQOS;qctl.reply_qos=TPQQOSNONPERSISTENT;fn_len=sizeof(f_name);sn_len=sizeof(s_name);Fget32(rbuf,FILENAME,0,f_name,&fn_len);Fget32(rbuf,SITENAME,0,s_name,&sn_len);Fget32(rbuf,BLOCKCNT,0,(char*)&blockcnt,0);Fget32(rbuf,STARTCID,0,(char*)&startcid,0);sprintf(ff_name,"%s%s",F_RECV_PATH,f_name);userlog("FileName:%s\n",ff_name);if((fd=open(ff_name,O_BINARY|O_RDWR|O_CREAT))<0){userlog("Open file error,%s\n",tpstrerror(tperrno));tpreturn(TPFAIL,0,NULL,0,0);}memset(qctl.corrid,0,sizeof(qctl.corrid));while(blockcnt-- > 0){sprintf(qctl.corrid,"%s %d",s_name,startcid++);userlog("F_RECV:\t qctl.corrid:%s\n",qctl.corrid);userlog("Begining dequeue....\n");if(tpdequeue("QSPACE","RECVQ",&qctl,(char**)&tux_buf,&buflen,0)==-1){userlog("tpdequeue failed,%s\n",tpstrerror(tperrno));break;}//userlog("tux_buf:%s",tux_buf+HEADER_LEN);userlog("buflen=%d\t buflen-HEADER_LEN=%d\n",buflen,buflen-HEADER_LEN);if((n_byte=write(fd,tux_buf+HEADER_LEN,buflen-HEADER_LEN))<0){close(fd);userlog("write to file :%s error!\n",ff_name);tpreturn(TPFAIL,0,NULL,0,0);}}close(fd);tpreturn(TPSUCCESS,0,NULL,0,0);}void tpsvrdone(){tpunsubscribe(sub_handle,0);tpfree(tux_buf);}

訊息佇列建立指令碼:

crdl /ngbss/tuxapp/etc/QUE 0 3000qspacecreate -n 1000 QSPACE 67775 2000 6 4 9 1000 errque y 16qopen QSPACEqcreate SENDQ fifo none 2 30 80% 0% echo "STRING is nearly full"qcreate RECVQ fifo none 2 30 80% 0% echo "RPLYQ is nearly full"qcreate errque fifo none 2 30 80% 0% echo "errque is nearly full"quit

 

ubb主要配置:

*GROUPSCHP9GRPLMID=site1GRPNO=309TMSNAME=TMS_QMTMSCOUNT=2OPENINFO="TUXEDO/QM:/ngbss/tuxapp/etc/QUE:QSPACE"CHP9GRP_1LMID=site1GRPNO=310TMSNAME=TMSTMSCOUNT=2*SERVERS#add for chapter09commonopserverSRVGRP=CHP9GRP_1SRVID=4046brecvserverSRVGRP=CHP9GRP_1SRVID=4048frecvserverSRVGRP=CHP9GRP_1SRVID=4050TMUSREVTSRVGRP=CHP9GRP_1  SRVID=4044CLOPT="-A -- -p 10"TMQUEUESRVGRP=CHP9GRP SRVID=4040 CLOPT="-s QSPACE:TMQUEUE -- -t 60"TMQFORWARDSRVGRP=CHP9GRP SRVID=4042 CLOPT="-- -q SENDQ"

運行結果:

./f_send file.data

[tuxapp@REDHAT5_FG chapter09]$ ./f_send file.dataINFO:   filename:file.data      blockcnt:4n_byte=128ddddddddddddddddddddddddddddddddttttttttttttttttttttttttttttttttffffffffffffffffffffffffffffffffdddddddddddddddddddddddddddddHEADER_LEN+n_byte=160n_byte=128dddttttttttttttttttttttttttttttttttffffffffffffffffffffffffffffffffddddddddddddddddddddddddddddddddtttttttttttttttttttttttttHEADER_LEN+n_byte=160n_byte=128tttttttffffffffffffffffffffffffffffffffddddddddddddddddddddddddddddddddttttttttttttttttttttttttttttttttfffffffffffffffffffffHEADER_LEN+n_byte=160n_byte=111fffffffffffddddddddddddddddddddddddddddddddttttttttttttttttttttttttttttttttfffffffffffffffffffffffffffffffffffffffffffffffffHEADER_LEN+n_byte=143

服務端ulog.xxx

185356.REDHAT5_FG!commonopserver.3785.3086702800.0: common_op:site1 0185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x85:        Enter SENDQ--185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x85:        Tpenqueuing -- 185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x85:        qctl.corrid:site1 0185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x85:        rqst->len=160    strlen(rqst->data)=7185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x86:        Enter SENDQ--185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x86:        Tpenqueuing -- 185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x86:        qctl.corrid:site1 1185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x86:        rqst->len=160    strlen(rqst->data)=7185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x87:        Enter SENDQ--185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x87:        Tpenqueuing -- 185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x87:        qctl.corrid:site1 2185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x87:        rqst->len=160    strlen(rqst->data)=7185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x88:        Enter SENDQ--185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x88:        Tpenqueuing -- 185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x88:        qctl.corrid:site1 3185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x88:        rqst->len=143    strlen(rqst->data)=7185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x89:        Enter SENDQ--185419.REDHAT5_FG!brecvserver.3786.3086985424.0: gtrid x0 x51b2801b x89:        Received FileArrived--185419.REDHAT5_FG!frecvserver.3799.3086547152.0: FileName:/ngbss/tuxapp/src/chapter09/Recvfile.data185419.REDHAT5_FG!frecvserver.3799.3086547152.0: F_RECV:         qctl.corrid:site1 0185419.REDHAT5_FG!frecvserver.3799.3086547152.0: Begining dequeue....185419.REDHAT5_FG!frecvserver.3799.3086547152.0: buflen=160      buflen-HEADER_LEN=128185419.REDHAT5_FG!frecvserver.3799.3086547152.0: F_RECV:         qctl.corrid:site1 1185419.REDHAT5_FG!frecvserver.3799.3086547152.0: Begining dequeue....185419.REDHAT5_FG!frecvserver.3799.3086547152.0: buflen=160      buflen-HEADER_LEN=128185419.REDHAT5_FG!frecvserver.3799.3086547152.0: F_RECV:         qctl.corrid:site1 2185419.REDHAT5_FG!frecvserver.3799.3086547152.0: Begining dequeue....185419.REDHAT5_FG!frecvserver.3799.3086547152.0: buflen=160      buflen-HEADER_LEN=128185419.REDHAT5_FG!frecvserver.3799.3086547152.0: F_RECV:         qctl.corrid:site1 3185419.REDHAT5_FG!frecvserver.3799.3086547152.0: Begining dequeue....185419.REDHAT5_FG!frecvserver.3799.3086547152.0: buflen=143      buflen-HEADER_LEN=111

用戶端和伺服器端檔案內容完全一致

 

註:本文系本人學習整理,只用於學習交流,轉載註明出處,謝謝!

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.