版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
網(wǎng)絡操作系統(tǒng)第五章網(wǎng)絡操作系統(tǒng)
的接口學習目標通過本章的學習,希望您能夠了解:應用程序接口的編程使用方法套接字在網(wǎng)絡通信中的應用本章內(nèi)容1.應用程序接口的概念2.UNIX套接字及其應用3.WinSock及其應用課程議題1.應用程序接口的概念一、應用程序接口的概念應用程序接口是一組定義、程序及協(xié)議的集合,通過API接口可以實現(xiàn)計算機軟件之間的相互通信。目的是提供應用程序與開發(fā)人員基于某軟件或硬件的以訪問一組例程的能力,而又無需訪問源碼,或理解內(nèi)部工作機制的細節(jié)。操作系統(tǒng)的用戶接口包括命令輸入和系統(tǒng)調(diào)用,應用程序接口是完成某一個功能的多個系統(tǒng)調(diào)用和命令的組合,其功能是完成某一特定的操作。優(yōu)點:簡化編程、提高效率WindowsAPIWindowsAPI是一套用來控制Windows的各個部件的外觀和行為的一套預先定義的Windows函數(shù).用戶的每個動作都會引發(fā)一個或幾個函數(shù)的運行以告訴Windows發(fā)生了什么.API函數(shù)包含在Windows系統(tǒng)目錄下的動態(tài)連接庫文件中。更易理解地說:Windows這個多作業(yè)系統(tǒng)除了協(xié)調(diào)應用程式的執(zhí)行、分配內(nèi)存、管理系統(tǒng)資源…
之外,她同時也是一個很大的服務中心,調(diào)用這個服務中心的各種服務(每一種服務就是一個函數(shù)),可以幫應用程式達到開啟視窗、描繪圖形、使用周邊設備…等目的,由于這些函數(shù)服務的對象是應用程式,所以便稱之為ApplicationProgrammingInterface,簡稱API函數(shù)。WIN32API也就是MicrosoftWindows32位平臺的應用程序編程接口。在這些工具中提供了大量的類庫和各種控件,它們替代了API的神秘功能,事實上這些類庫和控件都是構架在WIN32API函數(shù)基礎之上的,是封裝了的API函數(shù)的集合。它們把常用的API函數(shù)的組合在一起成為一個控件或類庫,并賦予其方便的使用方法,所以極大的加速了WINDOWS應用程序開發(fā)的過程。有了這些控件和類庫,程序員便可以把主要精力放在程序整體功能的設計上,而不必過于關注技術細節(jié)。應用程序接口(API)API也是一種中間件,為各種不同的平臺提供數(shù)據(jù)共享。API分類:1)遠程過程調(diào)用:通過作用在共享數(shù)據(jù)緩存器上的過程實現(xiàn)程序間的通信。2)標準查詢語言(SQL):是標準的訪問數(shù)據(jù)庫的查詢語言,通過通用數(shù)據(jù)庫實現(xiàn)應用程序間的數(shù)據(jù)共享。3)文件傳輸:通過發(fā)送格式化的文件實現(xiàn)應用程序間的數(shù)據(jù)共享4)信息交付:指松耦合或緊耦合應用程序間的小型格式化信息,通過程序間的直接通信實現(xiàn)數(shù)據(jù)共享。開放API接口分類某些公司會將API作為其公共開放系統(tǒng),公司制訂自己的系統(tǒng)接口標準,當需要執(zhí)行系統(tǒng)整合、自定義和程序應用等操作時,公司所有成員都可以通過該接口標準調(diào)用源代碼,該接口標準稱為開放式API。三種占主導地位的開放式API:1)
AT&T的UNIXSystemV,提供TLI/XTI接口。2)伯克利的軟件分布系統(tǒng)(BSD),提供Socket接口。3)
Microsoft的Windows系列,提供WinSock接口。一、TLI/XTI函數(shù)TLI即傳輸層接口,提供了OSI傳輸層和會話層之間的API。XTI即開放式傳送接口,它由TLI接口演變而來。TLI/XTI是一組函數(shù)的集合,為用戶提供傳輸層接口,包括建立通信、管理連接以及傳送數(shù)據(jù)、應用程序利用這些函數(shù)實現(xiàn)網(wǎng)絡應用??刂频讓拥木W(wǎng)絡活動。1.TLI/XTI結構TLI/XTI把相互通信的兩個進程稱為端點。提供網(wǎng)絡應用底層端點到端點的通信,為用戶應用進程提供了直接傳輸?shù)慕涌?。TLI/XTI提供了直接傳輸?shù)慕涌?,所以將?shù)據(jù)封裝和協(xié)議指定留給了用戶,具有更多的靈活性,當然也失去了部分的通用性。用戶進程端點傳輸層用戶進程端點傳輸層2.TLI/XTI實例見課本P142頁程序?qū)嵗?、TLI/XTI的服務模式面向連接的服務模式和面向非連接的服務模式。客戶端服務端客戶端服務端SYNSYN,ackackSYNRSTT_openT_bindT_listenT_openT_bindT_connect課程議題2.UNIX套接字及其應用一、套接字TCP/IP參考模型就是廣為人知的Socket接口。套接字,也就是Socket接口,簡單地說就是通信雙方的一種約定,利用套接字中的相關函數(shù)來完成通信過程。Socket協(xié)議的形象描述socket非常類似于電話插座。以一個國家級電話網(wǎng)為例。在電話系統(tǒng)中,一般用戶只能感受到本地電話機和對方電話號碼的存在,建立通話的過程,話音傳輸?shù)倪^程以及整個電話系統(tǒng)的技術細節(jié)對他都是透明的,這也與socket機制非常相似。socket利用網(wǎng)間網(wǎng)通信設施實現(xiàn)進程通信,但它對通信設施的細節(jié)毫不關心,只要通信設施能提供足夠的通信能力,它就滿足了。通信原理Socket可以看成在兩個程序間進行通信連接中的一個端點。一個程序?qū)⒁欢涡畔懭隨ocket中,該Socket將這段信息發(fā)送給另外一個Socket,使這段信息能傳送到其它程序中。ProgrammeAProgrammeAHostAHostB套接字TCP/IP網(wǎng)絡網(wǎng)絡接口卡socketsocket實質(zhì)上提供了進程通信的端點。進程通信之前,雙方首先必須各自創(chuàng)建一個端點,否則是沒有辦法建立聯(lián)系并相互通信的。正如打電話之前,雙方必須各自擁有一臺電話機一樣。在網(wǎng)間網(wǎng)內(nèi)部,每一個socket用一個半相關描述:(協(xié)議,本地地址,本地端口)
用IP地址尋找目的地,IP地址是32位,通常用點分十進制方式表示。IPv6共128位。端口:16位,范圍0-65535,低于256的端口號為保留給標準應用程序。主要用于區(qū)分那個進程所用傳輸?shù)臄?shù)據(jù)。套接字分類套接字是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡通信的基本單元??梢詫⑻捉幼挚醋鍪遣煌鳈C間的進程進行雙向通信的端點,它構成了單個主機內(nèi)及整個網(wǎng)絡間的編程界面。按通信性質(zhì)分為:流套接字和數(shù)據(jù)報套接字。套接字之間的連接過程分為三步驟互聯(lián)網(wǎng)通信,至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket,一個運行于服務端,稱為ServerSocket。根據(jù)連接啟動的方式以及本地套接字連接的目標,分為三步:1服務監(jiān)聽2客戶端請求3連接確認2套接字的應用通信過程見課本P149頁。利用套接字進行網(wǎng)絡通信一般要用到一下幾個函數(shù):
1創(chuàng)建套接字函數(shù)socket;
2綁定本地名稱函數(shù)bind;
3建立連接函數(shù)connect;
4偵聽函數(shù)listen;
5接受數(shù)據(jù)函數(shù)accept;
6關閉套接字函數(shù)close。練習1.TLI/XTI是一組函數(shù)的集合,為用戶提供()A.網(wǎng)絡層接口 B.應用層接口C.運輸層接口 D.物理層接口2.IPV4的IP地址為()A.16位 B.32位C.64位 D.128位3.利用套接字進行網(wǎng)絡通信時,創(chuàng)建套接字的函數(shù)是()A.bind B.connectC.1isten D.socket練習1.TLI/XTI提供兩種服務模式,即面向連接的服務模式和______的服務模式。2.TLI/XTI把相互通信的兩個進程稱為()
A.端口B.節(jié)點C.接口D.端點3.支持TCP/IP協(xié)議的網(wǎng)絡通信的基本操作單元是()
A.套接字B.端口C.端口號D.功能調(diào)用利用套接字進行網(wǎng)絡通信時,建立連接的函數(shù)是()
A.socket
B.bind
C.connect
D.accept支持雙向的數(shù)據(jù)流,但并不保證是可靠、有序、無重復的是()
A.流套接字B.數(shù)據(jù)報套接字
C.客戶端套接字D.服務器端套接字通常所說的套接字(socket)一般指UNIX環(huán)境下流行的_______________編程接口。課程議題3.WinSock及其應用一、winsock概述在Windows環(huán)境下利用套接字在TCP/IP上的編程接口就叫做WindowsSockets,即WinSock。通常所說的套接字,是指UNIX環(huán)境下的TCP/IP編程接口。WinSock規(guī)范是以U.CBerkeley大學的BSDUNIX中流行的Socket接口為范例定義了一套MicrosoftWindows下網(wǎng)絡編程接口,它不僅包含了人們所熟悉的BerkeleySocket風格的庫函數(shù),也包含了一組針對Windows的擴展庫函數(shù),以使程序員能充分的利用Windows消息驅(qū)動機制進行編程。WinSock支持單一的通信域,即Internet域。各種進程使用這個域用Internet協(xié)議進行通信。分為兩種套接字:流套接字:提供了雙向的、有序的、無重復并且無記錄邊界的數(shù)據(jù)流服務。數(shù)據(jù)報套接字:支持雙向的數(shù)據(jù)流,但并不保證可靠、有序、無重復。但是保留了記錄邊界,采用包交換網(wǎng)絡相似的模型來實現(xiàn)數(shù)據(jù)邊界的記錄。二、使用WinSock實現(xiàn)網(wǎng)絡通信客戶/服務器模型(c/s模型)網(wǎng)絡應用系統(tǒng)通常是一個客戶/服務器模型,要進行網(wǎng)絡通信,首先我們要理解什么是c/s模型。c/s模型由兩部分構成:客戶端和服務器端。
服務器工作的大致過程服務器工作的大致過程是:建立一個服務器,開啟服務器使服務器處于監(jiān)聽狀態(tài),它檢查是否有客戶請求它的服務;如果有客戶進行請求且條件合格則接受此客戶的服務請求,即建立與客戶端的連接,此后雙方便可以傳送數(shù)據(jù)。并且服務器能同時對多個客戶端提供服務??蛻舳斯ぷ鞯拇笾逻^程客戶端工作的大致過程:客戶端向服務器提出服務請求,請求連接到服務器,如果服務器接受了它的請求,則雙方可以通信。一般情況下,由客戶主動發(fā)起連接請求,而發(fā)起結束通信請求方則不一定。一個TCP連接的套接口對是一個定義該連接的兩個端點的四元組:
<本地IP地址,本地TCP端口號,遠程IP地址,遠程TCP端口號〉。套接口對唯一標識一個互聯(lián)網(wǎng)上的TCP連接。
標識每個端點的兩個值<IP地址,端口號>就稱為一個套接口。
若果使用無連接的通信只需要建立一個半關聯(lián),在發(fā)送和接收時指明另一半的參數(shù)就可以了。所以說無連接的通信是將數(shù)據(jù)發(fā)送到另一臺主機的指定端口。此外,不論是有連接還是無連接的通信都不需要兩端端口相同。二、WinSock的使用及重要函數(shù)講解:1Winsock的啟動和終止
應用程序在使用Windows
Sockets
DLL之前必須先調(diào)用函數(shù)WSAStartup()。上面的流程中我們并沒有列出該函數(shù),事實上由于winsock由DLL形式提供,為了完成一系列的初始化操作,每一個使用winsock的應用程序都必須進行WSAStartup()函數(shù)調(diào)用,并且只有在成功的完成調(diào)用之后才能使用scoket。
WSAStartup()函數(shù)
函數(shù)的原形如下:
int
PASCAL
FAR
WSAStartup(WORD
wVersionRequired,
LPWSADATA
lpWSAData);
wVersionRequired表示欲使用的winsock
API的版本,這是一個WORD類型的整數(shù),它的高位字節(jié)是次版本號,低位字節(jié)是主版本號;lpWSAData是指向WSADATA結構的指針,用于返回Windows
Sockets
DLL的一些技術細節(jié)。如果初始化成功則函數(shù)返回0,否則返回各種錯誤代碼。2建立通信連接socket()函數(shù):創(chuàng)建套接字
任何用戶要進行通信都要調(diào)用socket()函數(shù)指定通信協(xié)議的類型,創(chuàng)建套接字。
函數(shù)的原形:int
socket(int
family,int
type,int
protocol);
參數(shù)參數(shù)family指明協(xié)議族,也就是利用它來分辨地址的類型,一般為AF_INET表示在Internet上的socket;type指明套接口類型,也即是通信的類型可以為SOCK_STREAM或SOCK_DGRAM;protocol參數(shù)說明該套接字使用的協(xié)議族中的特定協(xié)議,如果調(diào)用者不希望特別指定使用的協(xié)議,則置為0,使用默認的連接模式。
若函數(shù)調(diào)用成功,則返回一個套接口描述字,簡稱套接字(sockfd);若調(diào)用失敗,則返回INVALID_SOCKET。
一個套接字用socket()創(chuàng)建后,它其實還沒有與任何特定的本地或目的地址相關聯(lián)。在很多情況下,應用程序并不關心他們使用的本地地址,這時可以不調(diào)用此函數(shù),而由協(xié)議軟件為他們選擇一個。如果要使用指定的端口,則創(chuàng)建了一個套接口之后,服務器必須調(diào)用bind()函數(shù)給套接口分配一個本地協(xié)議地址,捆綁端口。
函數(shù)原形:int
bind(int
sockfd,const
struct
sockaddr
*myaddr,socklen_t
addrlen);
參數(shù)sockfd是綁定的套接字描述符,是由socket返回的;myaddr是與套接字綁定的一個本地地址結構,其長度可變,結構隨協(xié)議族的不同而不同;addrlen是myaddr的長度。
返回0表示函數(shù)調(diào)用成功,返回-1(SOCKET_ERROR)表示出錯。
bind()函數(shù):指定本地地址connect()函數(shù):將套接字連接到目的地址
初始創(chuàng)建的套接字并未與任何外地目的地址關聯(lián),客戶端調(diào)用connect()為套接字綁定一個永久的目的地址,將它置于已經(jīng)連接的狀態(tài)。對數(shù)據(jù)流方式的套接字,必須在傳輸數(shù)據(jù)前,調(diào)用connect()構造一個與目的地的TCP連接,并不能構造連接時返回一個差錯代碼。如果是數(shù)據(jù)報方式則不是必須在傳輸數(shù)據(jù)之前調(diào)用connect。
函數(shù)原形:
int
connect(int
s,const
struct
sockaddr
*servaddr,socklen_t
addrlen);
s是本地套接字描述符;servaddr是指向?qū)Ψ教捉幼值刂方Y構的指針,這里的套接口地址是服務器的套接口地址,包括服務器的IP地址和端口號,指明了要連接到的服務器;addrlen是對方套接字地址結構的長度。
返回0表示調(diào)用成功,返回-1表示出錯。
listen()函數(shù):設置等待連接狀態(tài)對于一個服務器的程序,當申請到套接字,并調(diào)用bind()與本地地址綁定后,就應該等待某個客戶機的請求連接。函數(shù)listen()就是把套接字置為這種狀態(tài),它僅被服務器調(diào)用,它使服務器的套接口成為一個監(jiān)聽套接口。事實上當用socket()函數(shù)建立一個套接口時,它是一個主動套接口,也就是說它應該調(diào)用connect()函數(shù)向服務器發(fā)起連接的套接口,函數(shù)Listen()將此套接口轉(zhuǎn)變?yōu)楸粍犹捉涌冢顾邮芸蛻粝蛩l(fā)出的連接請求。
函數(shù)原形:
int
listen(int
sockfd,int
backlog);
參數(shù)sockfd是套接字描述符;backlog是指明等待連接的隊列的最大長度,可以取1-5。
返回0表示調(diào)用成功,返回-1表示出錯。
accept()函數(shù):接收連接請求服務器進程使用系統(tǒng)調(diào)用socket,bind和listen創(chuàng)建一個套接字,將它綁定到知名的端口,并指定連接請求的隊列長度,進入監(jiān)聽狀態(tài),當有連接請求到達時,服務器調(diào)用accept()接收連接請求,它返回一個新建立的連接。
函數(shù)原形:int
accept(int
sockfd,struct
sockaddr
*
cliaddr,socklen_t
*addrlen);
參數(shù)sockfd是套接字描述符;指針cliaddr用于返回請求連接的客戶方套接字地址;指針addrlen用于返回該地址結構的長度。
如果沒有發(fā)生錯誤,則返回新的套接字,否則返回INVALID_SOCKET。
值得注意的一點是,當accept()執(zhí)行成功,它的返回值是內(nèi)核自動生成的一個全新的描述字,它與客戶進行數(shù)據(jù)通信,我們稱之為會話套接口。accept()參數(shù)中的scokfd是監(jiān)聽套接口,accept()返回的套接口是一個已經(jīng)連接到某個客戶套接字的已連接套接口(會話套接口)。我們一定要區(qū)分這兩種套接口。一個服務器只生成一個監(jiān)聽套接口且一直存在,直到服務器關閉。內(nèi)核則是為每個被接受的客戶創(chuàng)建一個已連接套接口,服務器完成客戶的服務時,關閉與之通信的已連接套接口。3發(fā)送和接收數(shù)據(jù)當服務器端和客戶端建立連接以后,就可以在兩臺機器之間傳送數(shù)據(jù),也即是用winsock
API函數(shù)在兩臺連接成功的機器之間進行通信。下面我們介紹幾個傳送數(shù)據(jù)的函數(shù),無論是客戶端,還是服務器端都可以使用這些函數(shù):
在數(shù)據(jù)流方式中,一個連接建立以后,或者在數(shù)據(jù)報方式下,調(diào)用了connect()進行了套接字與目的地址的綁定后,就可以調(diào)用send()和recv()進行數(shù)據(jù)傳輸。send():使用連接好的
Socket
發(fā)送數(shù)據(jù)
格式:
int
send(
SOCKET
s,
const
char
FAR
*buf,
int
len,
int
flags
);
參數(shù)
s是Socket
的識別碼;buf指向發(fā)送緩沖區(qū)的首址;len是緩沖區(qū)的長度;
flags指定傳輸控制的方式,一般設為0。
傳回值:
成功
-
送出的數(shù)據(jù)的長度
失敗
-
SOCKET_ERROR
(呼叫
WSAGetLastError()
可得知原因)
此函數(shù)適用于連接的
Datagram
或
Stream
Socket
來傳送資料。
對
Datagram
Socket
而言,是
datagram
的大小超過限制,則將不會送出任何資料,并會傳回錯誤值。
recv():自
Socket
接收數(shù)據(jù)
格式:
int
recv(
SOCKET
s,
char
FAR
*buf,
int
len,
int
flags
);
參數(shù)s是Socket
的識別碼;指針buf指向接收緩沖區(qū)的首址;len是buf
的長度
;flags指定傳輸控制的方式,一般設為0。
傳回值:
成功
-
接收到的數(shù)據(jù)長度
(若對方
Socket
已關閉,則為
0)
失敗
-
SOCKET_ERROR
(呼叫
WSAGetLastError()
可得知原因)
此函數(shù)適用于連接式的
Datagram
Socket
或
Stream
Socket。對
Stream
Socket而言,我們可以接收到目前有效的
數(shù)據(jù),但其數(shù)量不超過
len
的大小。對
Datagram
Socket
言,只取出第一個
datagram;若是該
datagram
大于使用者提供的儲存空間,那么只有該空間大小的資料被取出,多余的資料將丟失,且回復錯誤信息。
如果我們以數(shù)據(jù)報的方式通信,由于事先不用建立連接,所以可以跳過connect()而直接用recvfrom()和sendto()兩個函數(shù)進行通信:
recvfrom():讀取一個
Datagram,并儲存數(shù)據(jù)來源的地址。
格式:
int
recvfrom(
SOCKET
s,char
FAR
*buf,int
len,int
flags,
struct
socketaddr
FAR
*from,int
FAR*fromlen
);
參數(shù)s,buf,len,flags與send()中的相同;指針from返回數(shù)據(jù)發(fā)送者的地址;fromlen是from
的大小。
傳回值:
成功
-
接收到的數(shù)據(jù)長度
(若對方
Socket
已關閉,則為
0);失敗
-
SOCKET_ERROR
(呼叫
WSAGetLastError()
可得知原因)。對
Stream
Socket而言,其作用與
recv()
相同,參數(shù)
from
及
fromlen
將不被用到。sendto():將數(shù)據(jù)送到指定的目的地。
格式:
int
sendto(
SOCKET
s,const
char
FAR
*buf,int
len,int
flags,const
struct
sockaddr
FAR
*to,int
tolen
);
參數(shù)s,buf,len,flags與send()中的相同;指針to指向數(shù)據(jù)發(fā)送的目的地址;tolen是to的大小。
傳回值:
成功
-
送出的資料長度
失敗
-
SOCKET_ERROR
(呼叫
WSAGetLastError()
可得知原因)
。
此函數(shù)適用于
Datagram
或
Stream
Socket
來傳送數(shù)據(jù)到指定的位址。對Datagram
Socket
言,若是
d
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建省晉江市安溪一中、養(yǎng)正中學、惠安一中、泉州實驗中學2025屆高一數(shù)學第一學期期末質(zhì)量檢測模擬試題含解析
- 2025屆四川省內(nèi)江市球溪中學生物高三第一學期期末質(zhì)量檢測模擬試題含解析
- 北京海淀區(qū)北方交通大學附屬中學2025屆生物高二上期末復習檢測試題含解析
- 吉林省長春市外國語學校2025屆數(shù)學高三上期末經(jīng)典試題含解析
- 湖北沙市中學2025屆高一數(shù)學第一學期期末復習檢測模擬試題含解析
- 2025屆安徽省合肥十一中高一上數(shù)學期末監(jiān)測試題含解析
- 2025屆河北唐山市樂亭第一中學語文高三第一學期期末綜合測試模擬試題含解析
- 黑龍江省大慶市十中2025屆生物高一第一學期期末學業(yè)水平測試試題含解析
- 陜西省西安音樂學院附屬中等音樂學校2025屆高二上數(shù)學期末檢測試題含解析
- 2025屆黑龍江齊齊哈爾市龍江縣第二中學英語高三第一學期期末檢測模擬試題含解析
- DL∕T 1919-2018 發(fā)電企業(yè)應急能力建設評估規(guī)范
- 小學作文稿紙語文作文作業(yè)格子模板(可打印編輯)
- 氫氧化鈉(CAS:1310-73-2)安全技術說明書
- 四川省物業(yè)管理承接查驗辦法
- SQL-Server基礎培訓PPT優(yōu)秀課件
- 乳腺癌英文相關
- 團隊管理經(jīng)典案例分析
- 李燕璇植樹問題卡通版5
- 手井施工檢驗批質(zhì)量驗收記錄[共2頁]
- (完整版)油罐換底工程施工方案
- 書法實習報告(共6篇)
評論
0/150
提交評論