




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第第7 7章章 嵌入式嵌入式LinuxLinux網(wǎng)絡(luò)網(wǎng)絡(luò)應(yīng)用開發(fā)應(yīng)用開發(fā)教材:嵌入式系統(tǒng)設(shè)計與應(yīng)用教材:嵌入式系統(tǒng)設(shè)計與應(yīng)用作者:張思民作者:張思民出版:清華大學(xué)出版社出版:清華大學(xué)出版社第第7章章 嵌入式嵌入式Linux網(wǎng)絡(luò)應(yīng)用開發(fā)網(wǎng)絡(luò)應(yīng)用開發(fā) 7.1網(wǎng)絡(luò)編程的基礎(chǔ)知識網(wǎng)絡(luò)編程的基礎(chǔ)知識 7.1.1IP地址和端口號地址和端口號 7.1.2套接字套接字 7.2Socket網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程 7.2.1Socket網(wǎng)絡(luò)函數(shù)網(wǎng)絡(luò)函數(shù) 7.2.2socket網(wǎng)絡(luò)編程示例網(wǎng)絡(luò)編程示例 7.3嵌入式系統(tǒng)的嵌入式系統(tǒng)的Web服務(wù)器程序設(shè)計服務(wù)器程序設(shè)計 7.3.1Web服務(wù)器服務(wù)器 7.3.2Web服務(wù)器的
2、程序設(shè)計服務(wù)器的程序設(shè)計 7.4開發(fā)新的開發(fā)新的TCP通信協(xié)議通信協(xié)議 7.1網(wǎng)絡(luò)編程基礎(chǔ)知識網(wǎng)絡(luò)編程基礎(chǔ)知識7.1.1IP地址和端口號地址和端口號 1、 客戶端程序和服務(wù)端程序客戶端程序和服務(wù)端程序 網(wǎng)絡(luò)程序和單機程序的最大區(qū)別在于,網(wǎng)網(wǎng)絡(luò)程序和單機程序的最大區(qū)別在于,網(wǎng)絡(luò)程序是由兩個部分組成的絡(luò)程序是由兩個部分組成的客戶端程序客戶端程序和服務(wù)端程序。和服務(wù)端程序。 在網(wǎng)絡(luò)中,安裝并運行服務(wù)端程序的計算在網(wǎng)絡(luò)中,安裝并運行服務(wù)端程序的計算機稱為服務(wù)器,而運行客戶端程序的計算機稱為服務(wù)器,而運行客戶端程序的計算機稱為客戶機。機稱為客戶機。 7.1.1IP地址和端口號地址和端口號 1、 客戶端程
3、序和服務(wù)端程序客戶端程序和服務(wù)端程序 網(wǎng)絡(luò)通信時,先啟動服務(wù)端程序,等待客網(wǎng)絡(luò)通信時,先啟動服務(wù)端程序,等待客戶端發(fā)起連接。一旦有客戶端發(fā)來了連接戶端發(fā)起連接。一旦有客戶端發(fā)來了連接請求,服務(wù)端隨之響應(yīng),從而建立起一條請求,服務(wù)端隨之響應(yīng),從而建立起一條數(shù)據(jù)通信信道。連接過程如圖所示。數(shù)據(jù)通信信道。連接過程如圖所示。 .連接請求連接請求響應(yīng)響應(yīng)7.1.1IP地址和端口號地址和端口號 2、IP地址地址 網(wǎng)絡(luò)中連接了很多計算機,假設(shè)計算機網(wǎng)絡(luò)中連接了很多計算機,假設(shè)計算機A向計算向計算機機B發(fā)送信息,若網(wǎng)絡(luò)中還有第三臺計算機發(fā)送信息,若網(wǎng)絡(luò)中還有第三臺計算機C,那,那么主機么主機 A怎么知道信息被
4、正確傳送到主機怎么知道信息被正確傳送到主機B而不而不是被傳送到主機是被傳送到主機C中了呢?如圖所示。中了呢?如圖所示。7.1.1IP地址和端口號地址和端口號 2、IP地址地址 在網(wǎng)絡(luò)上的每臺計算機都必須有一個唯一在網(wǎng)絡(luò)上的每臺計算機都必須有一個唯一的的IP地址作為標識,網(wǎng)絡(luò)中的計算機則通地址作為標識,網(wǎng)絡(luò)中的計算機則通過過IP地址找到要傳送數(shù)據(jù)的另一臺主機。地址找到要傳送數(shù)據(jù)的另一臺主機。 IP地址通常寫作一組由地址通常寫作一組由“.”號分隔的十進制號分隔的十進制數(shù),如:數(shù),如: 3、端口、端口 由于一臺計算機上可同時運行多個網(wǎng)絡(luò)程由于一臺計算機上可同時運行多個網(wǎng)絡(luò)程序,序,
5、IP地址只能保證把數(shù)據(jù)信息送到該計地址只能保證把數(shù)據(jù)信息送到該計算機,但無法知道要把這些數(shù)據(jù)交給該主算機,但無法知道要把這些數(shù)據(jù)交給該主機上的哪個網(wǎng)絡(luò)程序機上的哪個網(wǎng)絡(luò)程序 。 用用“端口號端口號” 標識正在計算機上運行的進標識正在計算機上運行的進程(程序)。程(程序)。 端口號是一個整數(shù),其取值范圍為端口號是一個整數(shù),其取值范圍為065535之間。之間。3、端口、端口 每個被發(fā)送的網(wǎng)絡(luò)數(shù)據(jù)包也都包含有每個被發(fā)送的網(wǎng)絡(luò)數(shù)據(jù)包也都包含有“端端口號口號”,用于將該數(shù)據(jù)幀交給具有相同端,用于將該數(shù)據(jù)幀交給具有相同端口號的應(yīng)用程序來處理??谔柕膽?yīng)用程序來處理。 4、TCP與與UDP協(xié)議協(xié)議 “傳輸控制
6、協(xié)議傳輸控制協(xié)議”(Transmission Control Protocol,簡稱,簡稱TCP)。)。 TCP是面向連接的通信協(xié)議,是面向連接的通信協(xié)議,TCP提供兩提供兩臺計算機之間的可靠無差錯的數(shù)據(jù)傳輸。臺計算機之間的可靠無差錯的數(shù)據(jù)傳輸。應(yīng)用程序利用應(yīng)用程序利用TCP進行通信時,信息源與進行通信時,信息源與信息目標之間會建立一個虛連接。這個連信息目標之間會建立一個虛連接。這個連接一旦建立成功,兩臺計算機之間就可以接一旦建立成功,兩臺計算機之間就可以把數(shù)據(jù)當作一個雙向字節(jié)流進行交換。把數(shù)據(jù)當作一個雙向字節(jié)流進行交換。4、TCP與與UDP協(xié)議協(xié)議 “用戶數(shù)據(jù)報協(xié)議用戶數(shù)據(jù)報協(xié)議”(User
7、 Datagram Protocol,簡稱:,簡稱:UDP)。)。 UDP是無連接通信協(xié)議,是無連接通信協(xié)議,UDP不保證可靠不保證可靠數(shù)據(jù)的傳輸。簡單地說,如果一個主機向數(shù)據(jù)的傳輸。簡單地說,如果一個主機向另外另外臺主機發(fā)送數(shù)據(jù),這一數(shù)據(jù)就會立臺主機發(fā)送數(shù)據(jù),這一數(shù)據(jù)就會立即發(fā)出,而不管另外一臺主機是否巳準備即發(fā)出,而不管另外一臺主機是否巳準備接收數(shù)據(jù)。接收數(shù)據(jù)。 7.1.2套接字套接字1、什么是套接字、什么是套接字 在在TCP/IP通信協(xié)通信協(xié)議中,套接字議中,套接字(Socket)就是)就是IP地址與端口號地址與端口號的組合。的組合。 如圖所示,如圖所示,IP地地址址193.14.26.
8、7與與端口號端口號13組成一組成一個套接字。個套接字。 2、套接字類型、套接字類型 (1)字節(jié)流套接字,基于)字節(jié)流套接字,基于TCP協(xié)議的連接協(xié)議的連接和傳輸方式,又稱為和傳輸方式,又稱為TCP套接字。套接字。 (2)數(shù)據(jù)報套接字,基于)數(shù)據(jù)報套接字,基于UDP協(xié)議的連接協(xié)議的連接和傳輸方式,又稱為和傳輸方式,又稱為UDP套接字。套接字。 (3)原始套接字,原始套接字允許對底層)原始套接字,原始套接字允許對底層協(xié)議如協(xié)議如IP或或ICMP進行直接訪問,提供進行直接訪問,提供TCP套接字和套接字和UDP套接字所不提供的功能,主套接字所不提供的功能,主要用于對一些協(xié)議的開發(fā),如構(gòu)造自己的要用于對
9、一些協(xié)議的開發(fā),如構(gòu)造自己的TCP或或UDP分組等。分組等。 7.2.1Socket網(wǎng)絡(luò)函數(shù)網(wǎng)絡(luò)函數(shù) 1、socket函數(shù)函數(shù) 調(diào)用調(diào)用socket函數(shù)獲得一個套接字描述符。函數(shù)獲得一個套接字描述符。 函數(shù)原型為:函數(shù)原型為: int socket(int family,int type,int protocol); 函數(shù)返回值:成功則返回套接字描述符,函數(shù)返回值:成功則返回套接字描述符,這是一個非負整數(shù),若出錯則返回這是一個非負整數(shù),若出錯則返回-1。 協(xié)議簇協(xié)議簇套接字套接字類型類型是否原始是否原始套接字套接字2、bind函數(shù)函數(shù) 該函數(shù)為套接字描述符分配一個本地該函數(shù)為套接字描述符分配一
10、個本地IP地地址和一個端口號,將址和一個端口號,將IP地址和端口號與套地址和端口號與套接字描述符綁定在一起。接字描述符綁定在一起。 函數(shù)原型為:函數(shù)原型為: int bind(int sockfd,struct sockaddr *myaddr,int addrlen); 函數(shù)返回值:若調(diào)用成功則返回函數(shù)返回值:若調(diào)用成功則返回0,若出錯,若出錯則返回則返回-1。 套接字套接字結(jié)構(gòu)體結(jié)構(gòu)體指針指針結(jié)構(gòu)體結(jié)構(gòu)體長度長度3、地址結(jié)構(gòu)、地址結(jié)構(gòu) 在網(wǎng)絡(luò)編程中有二個很重要的數(shù)據(jù)類型,在網(wǎng)絡(luò)編程中有二個很重要的數(shù)據(jù)類型,它們是地址結(jié)構(gòu)它們是地址結(jié)構(gòu)struct sockaddr和和struct sock
11、addr_in,這兩個數(shù)據(jù)類型都是用來存,這兩個數(shù)據(jù)類型都是用來存放放socket信息的。信息的。 Struct sockaddr的結(jié)構(gòu)的結(jié)構(gòu) struct sockaddr unsignedshort sa_family; /* 通信協(xié)議類型族通信協(xié)議類型族, AF_xxx */ charsa_data14; /* 14字節(jié)協(xié)議地址,包含該字節(jié)協(xié)議地址,包含該socket的的IP地址和端口號地址和端口號 */ ; structsockaddr_in數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu): structsockaddr_in shortint sin_family; /* 通信協(xié)議類型族通信協(xié)議類型族 */ un
12、signedshortint sin_port; /* 端口號端口號 */ structin_addrsin_addr; /* IP地址地址 */ unsignedcharsin_zero8; /* 填充填充0以保持與以保持與sockaddr結(jié)構(gòu)的長度相同結(jié)構(gòu)的長度相同*/ ; 4、connect函數(shù)函數(shù) 該函數(shù)用于在客戶端通過該函數(shù)用于在客戶端通過socket套接字建套接字建立網(wǎng)絡(luò)連接。立網(wǎng)絡(luò)連接。 函數(shù)原型為:函數(shù)原型為: int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen); 函數(shù)返回值:若連
13、接成功則返回函數(shù)返回值:若連接成功則返回0,若連接,若連接失敗則返回失敗則返回-1。 5、listen函數(shù)函數(shù) listen函數(shù)應(yīng)用于函數(shù)應(yīng)用于TCP連接的服務(wù)程序,它連接的服務(wù)程序,它的作用是通過的作用是通過socket套接字等待來自客戶套接字等待來自客戶端的連接請求。端的連接請求。 函數(shù)原型為:函數(shù)原型為: int listen(int sockfd, int backlog); 函數(shù)返回值:若連接成功則返回函數(shù)返回值:若連接成功則返回0,若連接,若連接失敗則返回失敗則返回-1。 6、accept函數(shù)函數(shù) accept調(diào)用后,服務(wù)器程序會一直處于阻調(diào)用后,服務(wù)器程序會一直處于阻塞狀態(tài),等待
14、來自客戶端的連接請求。塞狀態(tài),等待來自客戶端的連接請求。 int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen); 函數(shù)返回值:若接收到客戶端的連接請求,函數(shù)返回值:若接收到客戶端的連接請求,則返回非負的套接字描述符,若失敗,則則返回非負的套接字描述符,若失敗,則返回返回-1。 7、send()和()和 recv()函數(shù)()函數(shù) 這兩個函數(shù)分別用于發(fā)送和接收數(shù)據(jù)。這兩個函數(shù)分別用于發(fā)送和接收數(shù)據(jù)。 int send(int sockfd, const void *msg, int len, int flags); i
15、nt recv(int sockfd, void *buf, int len, unsigned int flags); 函數(shù)返回值:函數(shù)返回值: send函數(shù)返回發(fā)送的字節(jié)數(shù),函數(shù)返回發(fā)送的字節(jié)數(shù),rec v函數(shù)返函數(shù)返回接收數(shù)據(jù)的字節(jié)數(shù)。若出錯則返回回接收數(shù)據(jù)的字節(jié)數(shù)。若出錯則返回-1。 8、sendto()和()和recvfrom()函數(shù)()函數(shù) 這兩個函數(shù)的作用與這兩個函數(shù)的作用與send()和()和 recv()()函數(shù)類似,也是用于發(fā)送和接收數(shù)據(jù)。函數(shù)類似,也是用于發(fā)送和接收數(shù)據(jù)。 send()和()和 recv()函數(shù)用于()函數(shù)用于TCP協(xié)議協(xié)議 sendto()和()和 re
16、cvfrom()函數(shù)用于()函數(shù)用于UDP協(xié)議協(xié)議7.2.2socket網(wǎng)絡(luò)編程示例網(wǎng)絡(luò)編程示例 1、程序流程、程序流程利用利用Socket方式進行數(shù)據(jù)通信與傳輸,有如下步驟:方式進行數(shù)據(jù)通信與傳輸,有如下步驟:(1)創(chuàng)建服務(wù)端)創(chuàng)建服務(wù)端socket,綁定建立連接的端口。,綁定建立連接的端口。(2)服務(wù)端程序在一個端口處于阻塞狀態(tài),等待客戶機的)服務(wù)端程序在一個端口處于阻塞狀態(tài),等待客戶機的連接。連接。(3)創(chuàng)建客戶端)創(chuàng)建客戶端socket對象,綁定主機名稱或?qū)ο?,綁定主機名稱或IP地址,指地址,指定連接端口號。定連接端口號。(4)客戶機)客戶機Socket發(fā)起連接請求。發(fā)起連接請求。(5
17、)建立連接。)建立連接。(6)利用)利用send/sendto和和recv/recvfrom進行數(shù)據(jù)傳輸。進行數(shù)據(jù)傳輸。(7)關(guān)閉)關(guān)閉socket。 2、服務(wù)端程序、服務(wù)端程序server.c (1)首先,需要創(chuàng)建一個用于通訊的)首先,需要創(chuàng)建一個用于通訊的TCP協(xié)議的協(xié)議的socked套接字描述符。套接字描述符。 sockfd = socket(AF_INET,SOCK_STREAM,0) ; printf(socket Success!, sockfd = %d n,sockfd); (2)然后,在服務(wù)器端初始化)然后,在服務(wù)器端初始化sockaddr結(jié)構(gòu)體,設(shè)定套接字端口號:結(jié)構(gòu)體,設(shè)
18、定套接字端口號: my_addr.sin_family = AF_INET ; my_addr.sin_port = htons(4321) ; my_addr.sin_addr.s_addr = INADDR_ANY ; bzero(&(my_addr.sin_zero),8) ; (3)將定義的)將定義的sockaddr結(jié)構(gòu)體與結(jié)構(gòu)體與socked套接字描述符進行綁定。套接字描述符進行綁定。 bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr) ; (4)調(diào)用)調(diào)用listen函數(shù)使函數(shù)使sock
19、ed套接字成為套接字成為一個監(jiān)聽套接字。它與下一步驟的一個監(jiān)聽套接字。它與下一步驟的accept函數(shù)共同完成對套接字端口的監(jiān)聽。函數(shù)共同完成對套接字端口的監(jiān)聽。 listen(sockfd, 10) ; (5)調(diào)用)調(diào)用accept函數(shù)監(jiān)聽套接字端口,等函數(shù)監(jiān)聽套接字端口,等待客戶端的連接。一旦建立連接,將產(chǎn)生待客戶端的連接。一旦建立連接,將產(chǎn)生一個全新的套接字。一個全新的套接字。 new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size) ; (6)處理客戶端的會話請求。將接收到的)處理客戶端的會話請求
20、。將接收到的數(shù)據(jù)存放到字符型數(shù)組數(shù)據(jù)存放到字符型數(shù)組buff中。中。 /讀取客戶端發(fā)來的信息讀取客戶端發(fā)來的信息 numbytes = recv(new_fd, buff, strlen(buff), 0) ; /向客戶端發(fā)送信息向客戶端發(fā)送信息 send(sockfd, Hello! I am Server., 19, 0) ; (7)終止連接。通信結(jié)束則斷開連接。)終止連接。通信結(jié)束則斷開連接。 close(sockfd);3、客戶端程序、客戶端程序client.c (1)和服務(wù)器的步驟一樣)和服務(wù)器的步驟一樣,首先需要創(chuàng)建一首先需要創(chuàng)建一個個socked套接字描述符。套接字描述符。 so
21、ckfd = socket(AF_INET,SOCK_STREAM,0) (2)然后,在客戶端初始化)然后,在客戶端初始化sockaddr結(jié)結(jié)構(gòu)體,并調(diào)用函數(shù)構(gòu)體,并調(diào)用函數(shù)gethostbyname( )獲取獲取從命令行輸入的服務(wù)器從命令行輸入的服務(wù)器IP地址,設(shè)定與服地址,設(shè)定與服務(wù)器程序相同的端口號(比如,服務(wù)器的務(wù)器程序相同的端口號(比如,服務(wù)器的端口號是端口號是4321,則這里也必須設(shè)為,則這里也必須設(shè)為4321) (3) 調(diào)用調(diào)用connect函數(shù)來連接服務(wù)器。函數(shù)來連接服務(wù)器。 connect(sockfd,(struct sockaddr *)&their_addr,s
22、izeof(struct sockaddr); (4) 發(fā)送或者接收數(shù)據(jù),一般使用發(fā)送或者接收數(shù)據(jù),一般使用send和和recv函數(shù)調(diào)用來實現(xiàn)(與服務(wù)器程序相函數(shù)調(diào)用來實現(xiàn)(與服務(wù)器程序相同)。同)。 (5) 終止連接(與服務(wù)器程序相同)。終止連接(與服務(wù)器程序相同)。 7.3嵌入式系統(tǒng)的嵌入式系統(tǒng)的Web服務(wù)器程序設(shè)計服務(wù)器程序設(shè)計 7.3.1Web服務(wù)器服務(wù)器 1、HTTP協(xié)議協(xié)議 2、Web服務(wù)器的工作原理服務(wù)器的工作原理7.3.2Web服務(wù)器的程序設(shè)計服務(wù)器的程序設(shè)計1、建立、建立Web服務(wù)器的主要步驟服務(wù)器的主要步驟 (1)建立客戶端與服務(wù)器端的)建立客戶端與服務(wù)器端的socket套
23、接字通信套接字通信 服務(wù)器端建立基于服務(wù)器端建立基于TCP服務(wù)的服務(wù)的socket套接字通信,一般需套接字通信,一般需要經(jīng)過要經(jīng)過3個過程:個過程: 創(chuàng)建一個創(chuàng)建一個socket套接字描述符:套接字描述符: sockfd = socket(AF_INET, SOCK_STREAM, 0); 給給socket綁定一個地址和端口號:綁定一個地址和端口號: bind(sockfd, (struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr); 監(jiān)聽套接字端口,等待連接請求,一旦有接入,則創(chuàng)建一監(jiān)聽套接字端口,等待連接請求,一旦有接入
24、,則創(chuàng)建一個新套接字描述符個新套接字描述符fd: listen(sockfd, 8*3); fd = accept(sockfd, (void *)&ec, &len); (2)客戶端連接處理)客戶端連接處理 調(diào)用函數(shù)調(diào)用函數(shù)HandleConnect( )處理客戶端的處理客戶端的連接請求。在這個函數(shù)中,我們用連接請求。在這個函數(shù)中,我們用fdopen( )函數(shù)將套接字描述符函數(shù)將套接字描述符fd轉(zhuǎn)為文件轉(zhuǎn)為文件指針,再用指針,再用fgets( )函數(shù)將其內(nèi)容存放到緩函數(shù)將其內(nèi)容存放到緩沖區(qū)中,以便對其請求進行分析處理。沖區(qū)中,以便對其請求進行分析處理。 (3)分析和處理客戶請求)分析和處理客戶請求 在函數(shù)在函數(shù)ParseReq(
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZHCA 025-2023 化妝品抗氧化人體測試方法
- 沈陽生姜種植與市場推廣2025年度聯(lián)合發(fā)展合同
- 2025年度自愿離婚協(xié)議書:子女撫養(yǎng)權(quán)及監(jiān)護責任協(xié)議
- 二零二五年度創(chuàng)新型企業(yè)員工股權(quán)激勵合同
- 2025年度金融服務(wù)違約賠償協(xié)議范本
- 2025年度美容院美容師職業(yè)保險與福利合作協(xié)議
- 二零二五年度國際物流公司總經(jīng)理聘用協(xié)議
- 二零二五年度專業(yè)冷庫租賃與溫控技術(shù)支持協(xié)議
- 二零二五年度物流行業(yè)勞動合同法更新及風險防范合同
- 二零二五年度心理咨詢服務(wù)連鎖機構(gòu)心理咨詢師聘用合同
- 部編版《語文》(八年級-下冊)第一單元教材分析與教學(xué)建議
- 現(xiàn)代企業(yè)服務(wù)營銷的創(chuàng)新與實踐
- 光伏工程施工組織設(shè)計
- 臨床藥理學(xué)(完整課件)
- 城市雕塑藝術(shù)工程量清單計價定額2020版
- 2016年七里塘電站1號機組C級檢修方案
- 公司股權(quán)激勵方案(絕對干貨)PPT幻燈片課件(46頁PPT)
- T∕CGMA 033002-2020 壓縮空氣站節(jié)能設(shè)計指南
- (完整word版)SAS-Base認證考試(70真題+答案詳解)
- 體育測量與評價_05身體素質(zhì)的測量與評價
- 東華協(xié)同辦公系統(tǒng)簡介
評論
0/150
提交評論