




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Linux 環(huán)境進(jìn)程間通信(六):套接字2008-04-10 13:16在本專題的前面幾個(gè)部分,如消息隊(duì)列、信號(hào)燈、共享內(nèi)存等,都是基于Sys V的IPC機(jī)制進(jìn)行討論的,它們的應(yīng)用局限在單一計(jì)算機(jī)內(nèi)的進(jìn)程間通信;基于BSD套接口不僅可以實(shí)現(xiàn)單機(jī)內(nèi)的進(jìn)程間通信,還可以實(shí)現(xiàn)不同計(jì)算機(jī)進(jìn)程之間 的通信。本文將主要介紹BSD套接口(sockets),以及基于套接口的重要而基本的API。一個(gè)套接口可以看作是進(jìn)程間 通信的端點(diǎn)(endpoint),每個(gè)套接口的名字都是唯一的(唯一的含義是不言而喻的),其他進(jìn)程可以發(fā)現(xiàn)、連接并且與之通信。通信域用來說明套接口通 信的協(xié)議,不同的通信域有不同的通信協(xié)議以及套接
2、口的地址結(jié)構(gòu)等等,因此,創(chuàng)建一個(gè)套接口時(shí),要指明它的通信域。比較常見的是unix域套接口(采用套接 口機(jī)制實(shí)現(xiàn)單機(jī)內(nèi)的進(jìn)程間通信)及網(wǎng)際通信域。1、背景知識(shí)linux目前的網(wǎng)絡(luò)內(nèi)核代碼主要基于伯克利的BSD的unix實(shí)現(xiàn),整個(gè)結(jié)構(gòu)采用的是一種面向?qū)ο蟮姆謱訖C(jī)制。層與層之間有嚴(yán)格的接口定義。這里我們引用1中的一個(gè)圖表來描述linux支持的一些通信協(xié)議:我們這里只關(guān)心IPS,即因特網(wǎng)協(xié)議族,也就是通常所說的TCP/IP網(wǎng)絡(luò)。我們這里假設(shè)讀者具有網(wǎng)絡(luò)方面的一些背景知識(shí),如了解網(wǎng)絡(luò)的分層結(jié)構(gòu),通常所說的7層結(jié)構(gòu);了解IP地址以及路由的一些基本知識(shí)。目 前l(fā)inux網(wǎng)絡(luò)API是基于BSD套接口的(系統(tǒng)V
3、提供基于流I/O子系統(tǒng)的用戶接口,但是linux內(nèi)核目前不支持流I/O子系統(tǒng))。套接口可以說是 網(wǎng)絡(luò)編程中一個(gè)非常重要的概念,linux以文件的形式實(shí)現(xiàn)套接口,與套接口相應(yīng)的文件屬于sockfs特殊文件系統(tǒng),創(chuàng)建一個(gè)套接口就是在sockfs 中創(chuàng)建一個(gè)特殊文件,并建立起為實(shí)現(xiàn)套接口功能的相關(guān)數(shù)據(jù)結(jié)構(gòu)。換句話說,對(duì)每一個(gè)新創(chuàng)建的BSD套接口,linux內(nèi)核都將在sockfs特殊文件系統(tǒng) 中創(chuàng)建一個(gè)新的inode。描述套接口的數(shù)據(jù)結(jié)構(gòu)是socket,將在后面給出。2、重要數(shù)據(jù)結(jié)構(gòu)下面是在網(wǎng)絡(luò)編程中比較重要的幾個(gè)數(shù)據(jù)結(jié)構(gòu),讀者可以在后面介紹編程API部分再回過頭來了解它們。(1)表示套接口的數(shù)據(jù)結(jié)構(gòu)
4、struct socket套接口是由socket數(shù)據(jù)結(jié)構(gòu)代表的,形式如下:struct socketsocket_state state; /* 指明套接口的連接狀態(tài),一個(gè)套接口的連接狀態(tài)可以有以下幾種套接口是空閑的,還沒有進(jìn)行相應(yīng)的端口及地址的綁定;還沒有連接;正在連接中;已經(jīng)連接;正在解除連接。 */ unsigned long flags; struct proto_ops ops; /* 指明可對(duì)套接口進(jìn)行的各種操作 */ struct inode inode; /* 指向sockfs文件系統(tǒng)中的相應(yīng)inode */ struct fasync_struct *fasync_list;
5、 /* Asynchronous wake up list */ struct file *file; /* 指向sockfs文件系統(tǒng)中的相應(yīng)文件 */struct sock sk; /* 任何協(xié)議族都有其特定的套接口特性,該域就指向特定協(xié)議族的套接口對(duì)象。 */ wait_queue_head_t wait; short type; unsigned char passcred;(2)描述套接口通用地址的數(shù)據(jù)結(jié)構(gòu)struct sockaddr由于歷史的緣故,在bind、connect等系統(tǒng)調(diào)用中,特定于協(xié)議的套接口地址結(jié)構(gòu)指針都要強(qiáng)制轉(zhuǎn)換成該通用的套接口地址結(jié)構(gòu)指針。結(jié)構(gòu)形式如下:struc
6、t sockaddr sa_family_t sa_family; /* address family, AF_xxx */ char sa_data14; /* 14 bytes of protocol address */;(3)描述因特網(wǎng)地址結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)struct sockaddr_in(這里局限于IP4):struct sockaddr_in _SOCKADDR_COMMON (sin_); /* 描述協(xié)議族 */ in_port_t sin_port; /* 端口號(hào) */ struct in_addr sin_addr; /* 因特網(wǎng)地址 */ /* Pad to size of
7、 struct sockaddr'. */ unsigned char sin_zerosizeof (struct sockaddr) - _SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr); ;一般來說,讀者最關(guān)心的是前三個(gè)域,即通信協(xié)議、端口號(hào)及地址。3、套接口編程的幾個(gè)重要步驟:(1)創(chuàng)建套接口,由系統(tǒng)調(diào)用socket實(shí)現(xiàn):int socket( int domain, int type, int ptotocol);參數(shù)domain指明通信域,如PF_UNIX (unix域),PF_INET
8、(IPv4),PF_INET6(IPv6)等;type指明通信類型,如SOCK_STREAM(面向連接方式)、 SOCK_DGRAM(非面向連接方式)等。一般來說,參數(shù)protocol可設(shè)置為0,除非用在原始套接口上(原始套接口有一些特殊功能,后面還將介 紹)。注:socket()系統(tǒng)調(diào)用為套接口在sockfs文件系統(tǒng)中分配一個(gè)新的文 件和dentry對(duì)象,并通過文件描述符把它們與調(diào)用進(jìn)程聯(lián)系起來。進(jìn)程可以像訪問一個(gè)已經(jīng)打開的文件一樣訪問套接口在sockfs中的對(duì)應(yīng)文件。但進(jìn)程 絕不能調(diào)用open()來訪問該文件(sockfs文件系統(tǒng)沒有可視安裝點(diǎn),其中的文件永遠(yuǎn)不會(huì)出現(xiàn)在系統(tǒng)目錄樹上),當(dāng)套
9、接口被關(guān)閉時(shí),內(nèi)核會(huì)自動(dòng)刪除 sockfs中的inodes。(2)綁定地址根據(jù)傳輸層協(xié)議(TCP、UDP)的不同,客戶機(jī)及服務(wù)器的處理方式也有很大不同。但是,不管通信雙方使用何種傳輸協(xié)議,都需要一種標(biāo)識(shí)自己的機(jī)制。通信雙方一般由兩個(gè)方面標(biāo)識(shí):地址和端口號(hào)(通常,一個(gè)IP地址和一個(gè)端口號(hào)常常被稱為一個(gè)套接口)。根據(jù)地址可以尋址到主機(jī),根據(jù)端口號(hào)則可以尋址到主機(jī)提供特定服務(wù)的進(jìn)程,實(shí)際上,一個(gè)特定的端口號(hào)代表了一個(gè)提供特定服務(wù)的進(jìn)程。對(duì) 于使用TCP傳輸協(xié)議通信方式來說,通信雙方需要給自己綁定一個(gè)唯一標(biāo)識(shí)自己的套接口,以便建立連接;對(duì)于使用UDP傳輸協(xié)議,只需要服務(wù)器綁定一個(gè)標(biāo)識(shí) 自己的套接口就可
10、以了,用戶則不需要綁定(在需要時(shí),如調(diào)用connect時(shí)注1,內(nèi)核會(huì)自動(dòng)分配一個(gè)本地地址和本地端口號(hào))。綁定操作由系統(tǒng)調(diào)用 bind()完成:int bind( int sockfd, const struct sockaddr * my_addr, socklen_t my_addr_len)第二個(gè)參數(shù)對(duì)于Ipv4來說,實(shí)際上需要填充的結(jié)構(gòu) 是struct sockaddr_in,前面已經(jīng)介紹了該結(jié)構(gòu)。這里只想強(qiáng)調(diào)該結(jié)構(gòu)的第一個(gè)域,它表明該套接口使用的通信協(xié)議,如AF_INET。聯(lián)系socket系統(tǒng) 調(diào)用的第一個(gè)參數(shù),讀者可能會(huì)想到PF_INET與AF_INET究竟有什么不同?實(shí)際上,原來的
11、想法是每個(gè)通信域(如PF_INET)可能對(duì)應(yīng)多個(gè)協(xié)議 (如AF_INET),而事實(shí)上支持多個(gè)協(xié)議的通信域一直沒有實(shí)現(xiàn)。因此,在linux內(nèi)核中,AF_*與PF_*被定義為同一個(gè)常數(shù),因此,在 編程時(shí)可以不加區(qū)分地使用他們。注1:在采用非面向連接通信方式時(shí),也會(huì)用到 connect()調(diào)用,不過與在面向連接中的connect()調(diào)用有本質(zhì)的區(qū)別:在非面向連接通信中,connect調(diào)用只是先設(shè)置一下對(duì)方的地址, 內(nèi)核為本地套接口記下對(duì)方的地址,然后采用send()來發(fā)送數(shù)據(jù),這樣避免每次發(fā)送時(shí)都要提供相同的目的地址。其中的connect()調(diào)用不涉及握手 過程;而在面向連接的通信方式中,conne
12、ct()要完成一個(gè)嚴(yán)格的握手過程。(3)請(qǐng)求建立連接(由TCP客戶發(fā)起)對(duì)于采用面向連接的傳輸協(xié)議TCP實(shí)現(xiàn)通信來說,一個(gè)比較重要的步驟就是通信雙方建立連接(如果采用udp傳輸協(xié)議則不需要),由系統(tǒng)調(diào)用connect()完成:int connect( int sockfd, const struct sockaddr * servaddr, socklen_t addrlen)第一個(gè)參數(shù)為本地調(diào)用socket后返回的描述符,第二個(gè)參數(shù)為服務(wù)器的地址結(jié)構(gòu)指針。connect()向指定的套接口請(qǐng)求建立連接。注:與connect()相對(duì)應(yīng),在服務(wù)器端,通過系統(tǒng)調(diào)用listen(),指定服務(wù)器端的套接
13、口為監(jiān)聽套接口,監(jiān)聽每一個(gè)向服務(wù)器套接口發(fā)出的連接請(qǐng)求,并通過握手機(jī)制建立連接。內(nèi)核為listen()維護(hù)兩個(gè)隊(duì)列:已完成連接隊(duì)列和未完成連接隊(duì)列。(4)接受連接請(qǐng)求(由TCP服務(wù)器端發(fā)起)服 務(wù)器端通過監(jiān)聽套接口,為所有連接請(qǐng)求建立了兩個(gè)隊(duì)列:已完成連接隊(duì)列和未完成連接隊(duì)列(每個(gè)監(jiān)聽套接口都對(duì)應(yīng)這樣兩個(gè)隊(duì)列,當(dāng)然,一般服務(wù)器只有一個(gè)監(jiān) 聽套接口)。通過accept()調(diào)用,服務(wù)器將在監(jiān)聽套接口的已連接隊(duì)列頭中,返回用于代表當(dāng)前連接的套接口描述字。int accept( int sockfd, struct sockaddr * cliaddr, socklen_t * addrlen)第一個(gè)
14、參數(shù)指明哪個(gè)監(jiān)聽套接口,一般是由 listen()系統(tǒng)調(diào)用指定的(由于每個(gè)監(jiān)聽套接口都對(duì)應(yīng)已連接和未連接兩個(gè)隊(duì)列,因此它的內(nèi)部機(jī)制實(shí)質(zhì)是通過sockfd指定在哪個(gè)已連接隊(duì)列頭中返 回一個(gè)用于當(dāng)前客戶的連接,如果相應(yīng)的已連接隊(duì)列為空,accept進(jìn)入睡眠)。第二個(gè)參數(shù)指明客戶的地址結(jié)構(gòu),如果對(duì)客戶的身份不感興趣,可指定其為 空。注:對(duì)于采用TCP傳輸協(xié)議進(jìn)行通信的服務(wù)器和客戶機(jī)來說,一定要經(jīng)過客戶請(qǐng)求建立連接,服務(wù)器接受連接請(qǐng)求這一過程;而對(duì)采用UDP傳輸協(xié)議的通信雙方則不需要這一步驟。(5)通信客戶機(jī)可以通過套接口接收服務(wù)器傳過來的數(shù)據(jù),也可以通過套接口向服務(wù)器發(fā)送數(shù)據(jù)。前面所有的準(zhǔn)備工作(創(chuàng)
15、建套接口、綁定等操作)都是為這一步驟準(zhǔn)備的。常用的從套接口中接收數(shù)據(jù)的調(diào)用有:recv、recvfrom、recvmsg等,常用的向套接口中發(fā)送數(shù)據(jù)的調(diào)用有send、sendto、sendmsg等。int recv(int s, void * buf, size_t len, int flags)int recvfrom(int s, void * buf, size_t len, int flags, struct sockaddr * from, socklen_t * fromlen)int recvmsg(int s, struct msghdr * msg, int flags)in
16、t send(int s,const void * msg, size_t len, int flags)int sendto(int s, const void * msg, size_t len, int flags const struct sockaddr * to, socklen_t tolen)int sendmsg(int s, const struct msghdr * msg, int flags)這 里不再對(duì)這些調(diào)用作具體的說明,只想強(qiáng)調(diào)一下,recvfrom()以及recvmsg()可用于面向連接的套接口,也可用于面向非連接的套接口;而 recv()一般用于面向連接的套
17、接口。另外,在調(diào)用了connect()之后,就應(yīng)給調(diào)用send()而不是sendto()了,因?yàn)檎{(diào)用了 connect之后,目標(biāo)就已經(jīng)確定了。前面講到,socket()系統(tǒng)調(diào)用返回套接口描述字,實(shí)際上它是一個(gè)文件描述 符。所以,可以對(duì)套接口進(jìn)行通常的讀寫操作,即使用read()及write()方法。在實(shí)際應(yīng)用中,由于面向連接的通信(采用TCP傳輸協(xié)議)是可靠 的,同時(shí)又保證字節(jié)流原有的順序,所以更適合用read及write方法。而非面向連接的通信(采用UDP傳輸協(xié)議)是不可靠的,字節(jié)流也不一定保持原有 的順序,所以一般不宜用read及write方法。(6)通信的最后一步是關(guān)閉套接口由close
18、()來完成此項(xiàng)功能,它唯一的參數(shù)是套接口描述字,不再贅述。4、典型調(diào)用代碼:到處可以發(fā)現(xiàn)基于套接口的客戶機(jī)及服務(wù)器程序,這里不再給出完整的范例代碼,只是給出它們的典型調(diào)用代碼,并給出簡要說明。(1)典型的TCP服務(wù)器代碼:. .int listen_fd, connect_fd;struct sockaddr_in serv_addr, client_addr;. .listen_fd = socket ( PF_INET, SOCK_STREAM, 0 );/* 創(chuàng)建網(wǎng)際Ipv4域的(由PF_INET指定)面向連接的(由SOCK_STREAM指定,如果創(chuàng)建非面向連接的套接口則指定為SOCK_
19、DGRAM)的套接口。第三個(gè)參數(shù)0表示由內(nèi)核確定缺省的傳輸協(xié)議,對(duì)于本例,由于創(chuàng)建的是可靠的面向連接的基于流的套接口,內(nèi)核將選擇TCP作為本套接口的傳輸協(xié)議) */bzero( &serv_addr, sizeof(serv_addr) );serv_addr.sin_family = AF_INET ; /* 指明通信協(xié)議族 */serv_addr.sin_port = htons( 49152 ) ; /* 分配端口號(hào) */inet_pton(AF_INET, " 1", &serv_addr.sin_sddr) ;/* 分配地址,
20、把點(diǎn)分十進(jìn)制IPv4地址轉(zhuǎn)化為32位二進(jìn)制Ipv4地址。 */bind( listen_fd, (struct sockaddr*) serv_addr, sizeof ( struct sockaddr_in ) ; /* 實(shí)現(xiàn)綁定操作 */listen( listen_fd, max_num) ; /* 套接口進(jìn)入偵聽狀態(tài),max_num規(guī)定了內(nèi)核為此套接口排隊(duì)的最大連接個(gè)數(shù) */for( ; ; ) . .connect_fd = accept( listen_fd, (struct sockaddr*)client_addr, &len ) ; /* 獲得連接fd. */. .
21、 /* 發(fā)送和接收數(shù)據(jù) */注:端口號(hào)的分 配是有一些慣例的,不同的端口號(hào)對(duì)應(yīng)不同的服務(wù)或進(jìn)程。比如一般都把端口號(hào)21分配給FTP服務(wù)器的TCP/IP實(shí)現(xiàn)。端口號(hào)一般分為3段,0-1023 (受限的眾所周知的端口,由分配數(shù)值的權(quán)威機(jī)構(gòu)IANA管理),1024-49151(可以從IANA那里申請(qǐng)注冊(cè)的端口),49152-65535(臨 時(shí)端口,這就是為什么代碼中的端口號(hào)為49152)。對(duì)于多字節(jié)整數(shù)在內(nèi)存中有兩種存儲(chǔ)方式:一種是低字節(jié)在前,高字節(jié)在后,這樣的存儲(chǔ)順序被稱為低端字節(jié)序 (little-endian);高字節(jié)在前,低字節(jié)在后的存儲(chǔ)順序則被稱為高端字節(jié)序(big-endian)。網(wǎng)絡(luò)協(xié)
22、議在處理多字節(jié)整數(shù)時(shí),采用的是 高端字節(jié)序,而不同的主機(jī)可能采用不同的字節(jié)序。因此在編程時(shí)一定要考慮主機(jī)字節(jié)序與網(wǎng)絡(luò)字節(jié)序間的相互轉(zhuǎn)換。這就是程序中使用htons函數(shù)的原因,它 返回網(wǎng)絡(luò)字節(jié)序的整數(shù)。(2)典型的TCP客戶代碼:. .int socket_fd;struct sockaddr_in serv_addr ;. .socket_fd = socket ( PF_INET, SOCK_STREAM, 0 );bzero( &serv_addr, sizeof(serv_addr) );serv_addr.sin_family = AF_INET ; /* 指明通信協(xié)議族 */
23、serv_addr.sin_port = htons( 49152 ) ; /* 分配端口號(hào) */inet_pton(AF_INET, " 1", &serv_addr.sin_sddr) ;/* 分配地址,把點(diǎn)分十進(jìn)制IPv4地址轉(zhuǎn)化為32位二進(jìn)制Ipv4地址。 */connect( socket_fd, (struct sockaddr*)serv_addr, sizeof( serv_addr ) ) ; /* 向服務(wù)器發(fā)起連接請(qǐng)求 */. . /* 發(fā)送和接收數(shù)據(jù) */. .對(duì)比兩段代碼可以看出,許多調(diào)用是服務(wù)器或客戶機(jī)所特有的。另外,
24、對(duì)于非面向連接的傳輸協(xié)議,代碼還有簡單些,沒有連接的發(fā)起請(qǐng)求和接收請(qǐng)求部分。5、網(wǎng)絡(luò)編程中的其他重要概念下面列出了網(wǎng)絡(luò)編程中的其他重要概念,基本上都是給出這些概念能夠?qū)崿F(xiàn)的功能,讀者在編程過程中如果需要這些功能,可查閱相關(guān)概念。(1)、I/O復(fù)用的概念I(lǐng)/O 復(fù)用提供一種能力,這種能力使得當(dāng)一個(gè)I/O條件滿足時(shí),進(jìn)程能夠及時(shí)得到這個(gè)信息。I/O復(fù)用一般應(yīng)用在進(jìn)程需要處理多個(gè)描述字的場合。它的一個(gè)優(yōu)勢在 于,進(jìn)程不是阻塞在真正的I/O調(diào)用上,而是阻塞在select()調(diào)用上,select()可以同時(shí)處理多個(gè)描述字,如果它所處理的所有描述字的I/O 都沒有處于準(zhǔn)備好的狀態(tài),那么將阻塞;如果有一個(gè)或多個(gè)描述字I/O處于準(zhǔn)備好狀態(tài),則select()不阻塞,同時(shí)會(huì)根據(jù)準(zhǔn)備好的特定描述字采取相應(yīng)的 I/O操作。(2)、Unix通信域前 面主要介紹的是PF_INET通信域,實(shí)現(xiàn)網(wǎng)際間的進(jìn)程間通信。基于Unix通信域(調(diào)用socket時(shí)指定通信域?yàn)镻F_LOCAL即可)的套接口可以 實(shí)現(xiàn)單機(jī)之間的進(jìn)程間通信。采用Unix通信域套接口有幾個(gè)好處:Unix通信域套接口通常是TCP套接口速度的兩倍;另一個(gè)好處
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 未來移動(dòng)設(shè)備用戶體驗(yàn)的挑戰(zhàn)與機(jī)遇
- 舞蹈教練培訓(xùn)課件
- 用戶體驗(yàn)為核心的移動(dòng)營銷方案
- 電子競技對(duì)年輕消費(fèi)者行為影響研究
- 貼面的護(hù)理配合
- 知識(shí)傳播與社會(huì)倡導(dǎo)-以教育防范老性年癡呆之病
- 知識(shí)產(chǎn)法與消費(fèi)者權(quán)益保護(hù)
- 科技公司品牌建設(shè)的矩陣策略
- 知識(shí)產(chǎn)權(quán)法律與商業(yè)秘密保護(hù)探討
- 科技引領(lǐng)的跨境電商物流創(chuàng)新
- 2024年社會(huì)工作者《社會(huì)工作實(shí)務(wù)(中級(jí))》考試真題必考題
- 德育教育研究課題申報(bào)書
- 2024年岳陽職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫匯編
- (高清版)JTG 3810-2017 公路工程建設(shè)項(xiàng)目造價(jià)文件管理導(dǎo)則
- 《煤礦重大事故隱患判定標(biāo)準(zhǔn)》試題及答案
- 《ISO31000:2024風(fēng)險(xiǎn)管理指南》指導(dǎo)手冊(cè)(雷澤佳譯2024-04)
- 學(xué)前兒童表演游戲的組織與指導(dǎo)(學(xué)前兒童游戲課件)
- 建筑用真空陶瓷微珠絕熱系統(tǒng)應(yīng)用技術(shù)規(guī)程
- 2024年甘肅省公務(wù)員公共基礎(chǔ)知識(shí)重點(diǎn)考試題庫(含答案)
- (高清版)DZT 0214-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 銅、鉛、鋅、銀、鎳、鉬
- 《拒絕校園欺凌 防霸凌主題班會(huì)》課件
評(píng)論
0/150
提交評(píng)論