![利用消息隊(duì)列實(shí)現(xiàn)多進(jìn)程通信過程_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/17/9bf2aba8-22b1-433d-ab90-6040f68b608e/9bf2aba8-22b1-433d-ab90-6040f68b608e1.gif)
![利用消息隊(duì)列實(shí)現(xiàn)多進(jìn)程通信過程_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/17/9bf2aba8-22b1-433d-ab90-6040f68b608e/9bf2aba8-22b1-433d-ab90-6040f68b608e2.gif)
![利用消息隊(duì)列實(shí)現(xiàn)多進(jìn)程通信過程_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/17/9bf2aba8-22b1-433d-ab90-6040f68b608e/9bf2aba8-22b1-433d-ab90-6040f68b608e3.gif)
![利用消息隊(duì)列實(shí)現(xiàn)多進(jìn)程通信過程_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/17/9bf2aba8-22b1-433d-ab90-6040f68b608e/9bf2aba8-22b1-433d-ab90-6040f68b608e4.gif)
![利用消息隊(duì)列實(shí)現(xiàn)多進(jìn)程通信過程_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/17/9bf2aba8-22b1-433d-ab90-6040f68b608e/9bf2aba8-22b1-433d-ab90-6040f68b608e5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上成績(jī):課程設(shè)計(jì)報(bào)告課程名稱:Unix課程設(shè)計(jì)設(shè)計(jì)題目:利用消息隊(duì)列實(shí)現(xiàn)多進(jìn)程通信過程姓 名:專 業(yè):網(wǎng)絡(luò)工程班 級(jí):學(xué) 號(hào):計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院網(wǎng)絡(luò)系2013 年 12月 30 日專心-專注-專業(yè)一、 選題背景在UNIX程序設(shè)計(jì)中消息隊(duì)列是使用頻率最高的幾個(gè)對(duì)象之一,它常應(yīng)用于對(duì)等進(jìn)程間的通信和客戶服務(wù)器之間的通信。采用消息隊(duì)列作為貨物托運(yùn)渠道可以彌補(bǔ)以下缺陷:(1) 消息隊(duì)列是一種先進(jìn)先出的隊(duì)列型數(shù)據(jù)結(jié)構(gòu),可以保證先送的貨物先到達(dá),后送的貨物后到達(dá),避免了插隊(duì)現(xiàn)象。(2) 消息隊(duì)列將輸出的信息進(jìn)行了打包處理,這樣就可以保證以每個(gè)消息為單位進(jìn)行接收了。(3) 消息隊(duì)列
2、還可以將貨物進(jìn)行分類服務(wù),標(biāo)記各種類別的服務(wù),這樣就可以根據(jù)貨物類別分別出貨。消息隊(duì)列是IPC對(duì)象的一種與同樣提供先進(jìn)先出服務(wù)的管道相比,它有如下特點(diǎn):(1)消息隊(duì)列提供了消息的自動(dòng)拆分功能,同時(shí)不能接收兩次發(fā)送的消息。(2)消息隊(duì)列提供了不完全隨機(jī)讀取的服務(wù),引入消息類型后,一個(gè)消息隊(duì)列在邏輯上可以化身為多個(gè)不同消息類型的鏈表,用戶可以自主選擇接收某條邏輯鏈表上的消息,而不必依次接收隊(duì)列的首條消息。(3)消息隊(duì)列提供了完全異步的讀寫服務(wù)?;谝陨媳尘?,我們發(fā)現(xiàn)利用消息隊(duì)列實(shí)現(xiàn)進(jìn)程間的通信可以為我們提供方便,也會(huì)是通信效率更為提高。二、 設(shè)計(jì)思路可以采用客戶-服務(wù)器結(jié)構(gòu),其中服務(wù)器端實(shí)現(xiàn)各個(gè)用
3、戶的登錄并存儲(chǔ)相關(guān)信息,客戶端通過服務(wù)器端獲取當(dāng)前登錄用戶信息,然后各客戶進(jìn)程通過消息隊(duì)列實(shí)現(xiàn)雙向通信。編程實(shí)現(xiàn)兩個(gè)進(jìn)程間的通信,一個(gè)server(服務(wù)器)進(jìn)程,一個(gè)client(客戶)進(jìn)程。在client(客戶)進(jìn)程下選擇注冊(cè)或者登陸。若是注冊(cè),則server(服務(wù)器)進(jìn)程分給該客戶一個(gè)新的登陸賬號(hào)。多個(gè)客戶的賬號(hào)存儲(chǔ)在register.txt文件中。若是選擇登陸,登陸成功后服務(wù)器進(jìn)程會(huì)顯示登陸成功,否則顯示登陸失敗。登陸后輸入你要發(fā)送消息的對(duì)方的賬號(hào),輸入賬號(hào)后,服務(wù)器方顯示該賬號(hào)是否合理,如合理,即可實(shí)行通信。三、 主要問題的解決方法和關(guān)鍵技術(shù)實(shí)現(xiàn)密碼格式登錄與注冊(cè),通過帳號(hào)顯示用戶名,
4、顯示發(fā)送消息的日期四、 程序流程圖五、 原程序清單/client.c#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<sys/ipc.h>#include<sys/msg.h>#include<termio.h>#include<time.h>struct msgbuf long type; char buf1024;struct msgbuf0 long type; pid_t
5、pid; char username48; char password48; char number28; void func(); void regist();/注冊(cè) void passw(); void inputpassw(char *P); void enter();/登錄 void data(); void stol(char*);/加密 void ltos(char*);/解密 struct msgbuf _msgbuf ; struct msgbuf0 _msgbuf0,_msgbuf1; int msgid,index,flag ; long number; pid_t pid
6、,pid1; FILE * fpr; char username16,password16,buf64,inde4,flg4;void main()/28 pid_t pid = getpid(); if(msgid = msgget(0x4321,0666|IPC_CREAT) < 0) fprintf(stderr,"msgget() failed.n"); return ; fprintf(stderr,"注冊(cè)please input 'z',登錄 input 'd':"); scanf("%s&qu
7、ot;,buf); memset(&_msgbuf0,0,sizeof(_msgbuf0); if(buf0 = 100) enter();/登錄 else if(buf0 = 122) regist(); /注冊(cè) void func() memset(&_msgbuf,0,sizeof(_msgbuf); _msgbuf.type = atoi(_msgbuf0.username)+100; while(msgrcv(msgid,&_msgbuf,sizeof(_msgbuf.buf),_msgbuf.type,IPC_NOWAIT) != -1) fprintf(s
8、tderr,"%s receice.n",_msgbuf); memset(&_msgbuf,0,sizeof(_msgbuf); /signal(KILL,func);void regist() memset(_msgbuf0.username,0,16); memset(_msgbuf0.password,0,16); fprintf(stderr,"please input username (注冊(cè)):"); scanf("%s",_msgbuf0.username); getchar(); if(strlen(_msg
9、buf0.username) < 3|strlen(_msgbuf0.username) > 16) fprintf(stderr,"the length of username cann't less 3(注冊(cè)) and more 16.n"); regist(); _msgbuf0.pid = getpid(); _msgbuf0.type = 2;/查詢 stol(_msgbuf0.username);/加密 passw();/密碼_msgbuf0.type = 2 ; _msgbuf0.pid = getpid();stol(_msgbuf0.p
10、assword);/加密 fprintf(stderr,"do you want to get a number for chat:(y/n)"); if(getchar() = 'y') msgsnd(msgid,&_msgbuf0,128,0); memset(&_msgbuf0,0,sizeof(_msgbuf0); msgrcv(msgid,&_msgbuf0,128,getpid()+10000,0); ltos(_msgbuf0.number); fprintf(stderr,"恭喜你獲得一個(gè)聊天賬號(hào):%s.n&
11、quot;,_msgbuf0.number); fprintf(stderr,"登錄 please input 'd':"); scanf("%s",buf); if(buf0 = 100) enter();/登錄 void passw() fprintf(stderr,"please input password (注冊(cè)):"); inputpassw(_msgbuf0.password); /scanf("%s",_msgbuf0.password); while(strlen(_msgbuf0
12、.password) < 3|strlen(_msgbuf0.password) > 16) fprintf(stderr,"the length of password cann't less 3(注冊(cè)) and more 16.n"); fprintf(stderr,"please input password (注冊(cè)):"); inputpassw(_msgbuf0.password); /scanf("%s",_msgbuf0.password); fprintf(stderr,"please i
13、nput password again (注冊(cè)):"); inputpassw(password); /scanf("%s",password); if(strcmp(_msgbuf0.password,password) memset(_msgbuf0.password,0,49); memset(password,0,17); fprintf(stderr,"兩次輸入的密碼不一致,請(qǐng)從新填寫信息。n"); passw();void enter() memset(&_msgbuf0,0,sizeof(_msgbuf0); fprint
14、f(stderr,"please input number (登錄):"); scanf("%s",_msgbuf0.number); getchar();while(strlen(_msgbuf0.number) != 8)|(atoi(_msgbuf0.number) > )|(atoi(_msgbuf0.number) < ) fprintf(stderr,"please input number (登錄):"); scanf("%s",_msgbuf0.number); getchar(); f
15、printf(stderr,"please input password (登錄):"); inputpassw(_msgbuf0.password); _msgbuf0.type = 1 ; number = atoi(_msgbuf0.number) ; stol(_msgbuf0.number);/加密 stol(_msgbuf0.password);/加密 msgsnd(msgid,&_msgbuf0,128,0); memset(&_msgbuf,0,sizeof(_msgbuf); msgrcv(msgid,&_msgbuf,sizeof
16、(_msgbuf.buf),number,0); ltos(_msgbuf.buf); sscanf(_msgbuf.buf,"%01:%s",buf,username); if(!(strcmp(buf,"n") fprintf(stderr,"%s 登陸失敗.n.n",username); enter(); fprintf(stderr,"%s 登陸成功.n.n",username); if(pid1 = fork() < 0) fprintf(stderr,"fork() failed.n&q
17、uot;); return ; if(pid1 > 0) data(); if(pid1 = 0) while(1) memset(&_msgbuf,0,sizeof(_msgbuf); if(msgrcv(msgid,&_msgbuf,sizeof(_msgbuf.buf),number+,MSG_NOERROR) != -1) ltos(_msgbuf.buf);/解密 fprintf(stderr,"n %snnsend:",_msgbuf.buf); memset(&_msgbuf,0,sizeof(_msgbuf); void dat
18、a() long number1 ; char username116; struct tm when ; time_t now ; while(1) fprintf(stderr,"please input 你要發(fā)送對(duì)方的賬號(hào) :"); memset(&_msgbuf1,0,sizeof(_msgbuf1); scanf("%s",_msgbuf1.number);while(strlen(_msgbuf1.number) != 8)|(atoi(_msgbuf1.number) > )|(atoi(_msgbuf1.number) &l
19、t; )|(atoi(_msgbuf1.number) = number) fprintf(stderr,"please input number again:"); scanf("%s",_msgbuf1.number); _msgbuf1.type = 4 ; _msgbuf1.pid = getpid(); number1 = atoi(_msgbuf1.number) ; stol(_msgbuf1.number);/加密 msgsnd(msgid,&_msgbuf1,128,0); msgrcv(msgid,&_msgbuf,s
20、izeof(_msgbuf.buf),getpid(),MSG_NOERROR); ltos(_msgbuf.buf); sscanf(_msgbuf.buf,"%01:%s",buf,username1); if(!(strcmp(buf,"y") while(1) memset(&_msgbuf,0,sizeof(_msgbuf); time(&now); when = *localtime(&now); fprintf(stderr,"send %s %02d:%02d:%02d %02d,%02d,%04d:&q
21、uot;,username1,when.tm_hour,when.tm_min,when.tm_sec,when.tm_mon+1,when.tm_mday,when.tm_year+1900); scanf("%s",_msgbuf.buf); if(!strcmp(_msgbuf.buf,"switch") data(); break; if(!strcmp(_msgbuf.buf,"exit") return ; time(&now); when = *localtime(&now); sprintf(_msgb
22、uf.buf,"%s:receive-%s-%d-%02d:%02d:%02d-%02d,%02d,%04dnnn",_msgbuf.buf,username,number,when.tm_hour,when.tm_min,when.tm_sec,when.tm_mon+1,when.tm_mday,when.tm_year+1900); stol(_msgbuf.buf);/加密 _msgbuf.type = number1 + ; msgsnd(msgid,&_msgbuf,strlen(_msgbuf.buf),0);/加密void stol(char *bu
23、f) long i ; char buf11024; sscanf(buf,"%s",buf1); memset(buf,0,sizeof(buf); for(i = 0;i < strlen(buf1);i+) sprintf(buf,"%s%03d",buf,buf1i+456);/解密void ltos(char *buf) int i ,n = strlen(buf); char buf14,data1024; memset(data,0,sizeof(data); for(i = 0 ;i < n;) memset(buf1,0,s
24、izeof(buf1); sscanf(buf,"%03s%s",buf1,buf); i = i+3 ; sprintf(data,"%s%c",data,atoi(buf1)-456); sprintf(buf,"%s",data);void inputpassw(char *buf) struct termio tm_new,tm_old; int fd = 0,c = 0; memset(buf,0,sizeof(buf); ioctl(fd,TCGETA,&tm_old) ; tm_new = tm_old ; tm
25、_new.c_lflag &=(ECHO|ICANON);/ECHO 顯示輸入字符 ICANON 使用標(biāo)準(zhǔn)輸入模式 ioctl(fd,TCSETA,&tm_new) ; while(c = getchar() != 10) fprintf(stderr,"*"); sprintf(buf,"%s%c",buf,c); ioctl(fd,TCSETA,&tm_old) ; fprintf(stderr,"n");/Server.c#include<stdio.h>#include<unistd.
26、h>#include<sys/types.h>#include<sys/stat.h>#include<sys/ipc.h>#include<sys/msg.h>#include<sys/ipc.h>#include<sys/sem.h>#include<sys/shm.h>struct msgbuf long type; char buf1024;struct msgbuf0 long type; pid_t pid; char username48; char password48; char num
27、ber28; void func(); void function(); void stol(char*);/加密 void ltos(char*);/解密 int rand1();/隨機(jī)產(chǎn)生一個(gè)9位數(shù) struct msgbuf _msgbuf ; struct msgbuf0 _msgbuf0,_msgbuf1 ; struct sembuf _buf; / pthread_t pid ; FILE *fpr,*fpw ; char buf64,username16,password16,inde4,flg4,*p,number10; int msgid,semid,shmid,index
28、 = 0,flag = 0,sum; pid_t pid ,pid_c;void main() if(semid = semget(0x1234,2,0666|IPC_CREAT) < 0) fprintf(stderr,"semget() failed.n"); return ; semctl(semid,0,SETVAL,1); semctl(semid,1,SETVAL,1); _buf.sem_flg = _buf.sem_flg & IPC_NOWAIT ; if(shmid = shmget(0x123,4,0666|IPC_CREAT) <
29、 0) fprintf(stderr,"shmget() failed.n"); return ; p = shmat(shmid,0,0); (*p) = 0 ; if(msgid = msgget(0x4321,0666|IPC_CREAT) < 0) fprintf(stderr,"msgget() failed.n"); return ; func();void func()if(msgrcv(msgid,&_msgbuf0,128,-2,0) != -1) if(pid = fork() < 0) fprintf(stder
30、r,"fork() failed.n"); return ; if(pid = 0) fprintf(stderr,"解密前 receive number is %s, username is %s, password is %s.n",_msgbuf0.number,_msgbuf0.username,_msgbuf0.password); ltos(_msgbuf0.username);/解密 ltos(_msgbuf0.number);/解密 ltos(_msgbuf0.password);/解密 pid_c = _msgbuf0.pid ; if
31、(_msgbuf0.type = 1) /denglu function(); if(_msgbuf0.type = 2) /zhuce _buf.sem_num = 0 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); if(*p = 0) _buf.sem_num = 1 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); (*p)+ ; _buf.sem_num = 0 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signa
32、l(); if(fpr = fopen("./register.txt","r") = NULL) fprintf(stderr,"fopen() failed.n"); return ; memset(buf,0,sizeof(buf); see(); fclose(fpr); _buf.sem_num = 0 ;/ _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); (*p)- ; _buf.sem_num = 0 ; _buf.sem_op = 1 ; semop(semid
33、,&_buf,1);/signal(); if(*p = 0) _buf.sem_num = 1 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); _buf.sem_num = 1 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); if(fpw = fopen("./register.txt","a+") = NULL) fprintf(stderr,"fopen() failed.n"); return
34、; index+ ; memset(buf,0,sizeof(buf); sprintf(buf,"%d %s %s %s %d",index,_msgbuf0.number,_msgbuf0.username,_msgbuf0.password,flag); fputs(buf,fpw); fputs("n",fpw); fclose(fpw); _buf.sem_num = 1 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); fprintf(stderr,"user %s re
35、gister success.n",_msgbuf0.username); _msgbuf0.type = _msgbuf0.pid + 10000 ;/ stol(_msgbuf0.number); memset(&_msgbuf0.username,0,sizeof(_msgbuf0.username); memset(&_msgbuf0.password,0,sizeof(_msgbuf0.password); fprintf(stderr,"nn%d-%s",_msgbuf0.type,_msgbuf0.number); msgsnd(ms
36、gid,&_msgbuf0,128,0); exit(1); else fprintf(stderr,"msgrcv() failed.n"); return ; func(); void function() _buf.sem_num = 0 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); if(*p = 0) _buf.sem_num = 1 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); (*p)+ ; _buf.sem_num = 0
37、; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); if(fpr = fopen("./register.txt","r") = NULL) fprintf(stderr,"fopen() failed.n"); return ; memset(buf,0,sizeof(buf); while(fgets(buf,sizeof(buf),fpr) sscanf(buf,"% % % % % ",inde,number,username,password,f
38、lg); memset(buf,0,sizeof(buf); if(!strcmp(number,_msgbuf0.number) && !strcmp(password,_msgbuf0.password) memset(&_msgbuf,0,sizeof(_msgbuf); _msgbuf.type = atoi(_msgbuf0.number) ; sprintf(_msgbuf.buf,"y:%s",username); stol(_msgbuf.buf); msgsnd(msgid,&_msgbuf,sizeof(_msgbuf.b
39、uf),0); flag = 2; break ; fclose(fpr); _buf.sem_num = 0 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); (*p)- ; _buf.sem_num = 0 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); if(*p = 0) _buf.sem_num = 1 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); if(flag = 2) fprintf(std
40、err,"user %s 登錄成功.nnn",username); data(); if(flag != 2) memset(&_msgbuf,0,sizeof(_msgbuf); _msgbuf.type = atoi(_msgbuf0.number) ; strcpy(_msgbuf.buf,"n:enter-failed"); stol(_msgbuf.buf); msgsnd(msgid,&_msgbuf,sizeof(_msgbuf.buf),0); fprintf(stderr," %s 登錄failed.nnn&q
41、uot;,_msgbuf0.number); void data() while(1) memset(&_msgbuf,0,sizeof(_msgbuf); if(msgrcv(msgid,&_msgbuf1,128,4,MSG_NOERROR) != -1) ltos(_msgbuf1.number);/解密 _buf.sem_num = 0 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); if(*p = 0) _buf.sem_num = 1 ; _buf.sem_op = -1 ; semop(semid,&a
42、mp;_buf,1);/wait(); (*p)+ ; _buf.sem_num = 0 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); if(fpr = fopen("./register.txt","r") = NULL) fprintf(stderr,"fopen() failed.n"); return ; memset(buf,0,sizeof(buf); while(fgets(buf,sizeof(buf),fpr) sscanf(buf,"% %
43、 % % % ",inde,number,username,password,flg); if(!strcmp(number,_msgbuf1.number) memset(&_msgbuf,0,sizeof(buf); flag = 1; _msgbuf.type = _msgbuf1.pid; sprintf(_msgbuf.buf,"y:%s",username); stol(_msgbuf.buf); msgsnd(msgid,&_msgbuf,sizeof(_msgbuf.buf),0); fprintf(stderr,"%s exist.n",_msgbuf1.number); break ;/if /while fclose(fpr); _buf.sem_num = 0 ;/ _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); (*p)- ; _buf.sem_num = 0 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); if(*p = 0) _buf.sem_num = 1 ;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 插班生入學(xué)協(xié)議書
- 二手鍋爐購銷合同
- 玻璃購銷合同模板
- 三峽大學(xué)《數(shù)學(xué)專業(yè)能力綜合選講》2023-2024學(xué)年第二學(xué)期期末試卷
- 住房貸款借款合同
- 首都經(jīng)濟(jì)貿(mào)易大學(xué)《現(xiàn)代分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 山西工商學(xué)院《出版企業(yè)管理學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 北京石油化工學(xué)院《企業(yè)內(nèi)部控制》2023-2024學(xué)年第二學(xué)期期末試卷
- 北京師范大學(xué)-香港浸會(huì)大學(xué)聯(lián)合國際學(xué)院《游戲角色與場(chǎng)景設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 北京聯(lián)合大學(xué)《機(jī)械制圖與CAD》2023-2024學(xué)年第二學(xué)期期末試卷
- 蔬菜采購項(xiàng)目投標(biāo)書
- 肩周炎康復(fù)護(hù)理
- 2022年安徽管子文化旅游集團(tuán)有限公司招聘筆試試題及答案解析
- SAPPM設(shè)備管理解決方案
- Q-HN-1-0000.08.004《風(fēng)力發(fā)電場(chǎng)電能質(zhì)量監(jiān)督技術(shù)標(biāo)準(zhǔn)》
- 宗教與社會(huì)課件
- 3人-機(jī)-環(huán)-管理本質(zhì)安全化措施課件
- 生殖醫(yī)學(xué)中心建設(shè)驗(yàn)收標(biāo)準(zhǔn)分析-講座課件PPT
- 慶陽煤炭資源開發(fā)調(diào)研報(bào)告
- 橋博常見問題
- 貴州省電梯日常維護(hù)保養(yǎng)合同范本
評(píng)論
0/150
提交評(píng)論