版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第第5章章 MFC WinSock類的編程類的編程 為簡化套接字網(wǎng)絡(luò)編程,更方便地利用Windows的消息驅(qū)動機(jī)制,微軟的基礎(chǔ)類庫(Microsoft Foundation Class Libary,簡稱MFC),提供了兩個套接字類,在不同的層次上對Windows Socket API函數(shù)進(jìn)行了封裝,為編寫Windows Socket網(wǎng)絡(luò)通信程序,提供了兩種編程模式。 CAsyncSocket類,在很低的層次上對Windows Sockets API進(jìn)行了封裝。 它的成員函數(shù)和Windows Sockets API的函數(shù)調(diào)用直接對應(yīng)。一個CAsyncSocket對象代表了一個Windows套接
2、字。它是網(wǎng)絡(luò)通信的端點。除了把套接字封裝成C+的面向?qū)ο蟮男问焦┏绦騿T使用以外,這個類唯一所增加的抽象就是將那些與套接字相關(guān)的Windows消息變?yōu)镃AsyncSocket類的回調(diào)函數(shù)。 CSocket類,從CAsyncSocket類派生,是對Windows Sockets API的高級封裝。CSocket類繼承了CAsyncSocket類的許多成員函數(shù),用法一致。CSocket類的高級表現(xiàn)在三個方面:(1)CSocket結(jié)合archive類來使用套接字。(2)CSocket管理了通信的許多方面,如字節(jié)順序問題和字符串轉(zhuǎn)換問題。 (3)CSocket類為Windows消息的后臺處理提供了阻塞的
3、工作模式。 這兩個類提供了事件處理函數(shù),編程者通過對事件處理函數(shù)進(jìn)行重載,可方便地對套接字發(fā)送數(shù)據(jù)、接收數(shù)據(jù)等事件進(jìn)行處理。同時,可以結(jié)合MFC的其它類來使用這兩個套接字類,并利用MFC的各種可視化向?qū)В瑥亩蟠蠛喕司幊獭?在MFC中,有一個名為afxSock.h的包含文件,在這個文件中定義了CAsyncSocket,CSocket,和CSocketFile這三個套接字類。 5.1 CasyncSocket類類CAsyncSocket類從Cobject類派生而來,如圖5.1所示: 圖5.1 CAsyncSocket類的派生關(guān)系 5.1.1 使用使用CAsyncSocket類的一般步驟類的一般
4、步驟網(wǎng)絡(luò)應(yīng)用程序一般采用客戶/服務(wù)器模式,它們使用使用CAsyncSocket類編程的步驟有所不同,參看表5.1。 序號服務(wù)器(Server)客戶機(jī)(Client)1/構(gòu)造一個套接字ACsyncSocket sockSrvr;/構(gòu)造一個套接字ACsyncSocket sockClient;2/創(chuàng)建Socket句柄到指定端口sockSrvr.Create(nPort);/創(chuàng)建Socket句柄,參數(shù)默認(rèn)sockClient.Create();3/啟動監(jiān)聽,準(zhǔn)備接受請假sockSrvr.Listen();4/請求連接到服務(wù)器sockClient.Connect()5.1.2 創(chuàng)建創(chuàng)建CasyncSo
5、cket類對象類對象 本書將CAsyncSocket類對象稱為異步套接字對象。創(chuàng)建異步套接字對象一般分為兩個步驟,首先構(gòu)造一個CAsyncSocket對象,再創(chuàng)建該對象的底層的SOCKET句柄。1創(chuàng)建空的異步套接字對象創(chuàng)建空的異步套接字對象 通過調(diào)用CAsyncSocket類的構(gòu)造函數(shù),創(chuàng)建一個新的空CAsyncSocket類套接字對象,構(gòu)造函數(shù)不帶參數(shù)。然后必須調(diào)用它的Create成員函數(shù),來創(chuàng)建底層的套接字?jǐn)?shù)據(jù)結(jié)構(gòu),并綁定它的地址。 有兩種使用方法,會在不同的位置創(chuàng)建。(1)如:CAsyncSocket aa; aa.Create(。);(2)如: CAsyncSocket* Pa; Pa
6、 = new CAsyncSocket; Pa-Create(。); 2創(chuàng)建異步套接字對象的底層套接字句柄創(chuàng)建異步套接字對象的底層套接字句柄通過調(diào)用CAsyncSocket類的Create()成員函數(shù),創(chuàng)建該對象的底層套接字句柄,決定套接字對象的具體特性。調(diào)用格式為:BOOL Create( UINT nSocketPort=0, Int nSocketType = SOCK_STREAM, Long Ievent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT |FD_CONNECT | FD_CLOSE, LPCTSTR lpszSocketAddres
7、s = NULL ); 舉例:創(chuàng)建一個使用27端口的流式異步套接字對象。CAsyncSocket* pSocket = new CAsyncSocket;int nPort = 27;pSocket-Create( nPort, SOCK_STREAM ); 5.1.3 關(guān)于關(guān)于CAsyncSocket類可以接受并處理的類可以接受并處理的消息事件消息事件1六種套接字相關(guān)的事件與通知消息六種套接字相關(guān)的事件與通知消息參數(shù)Ievent可以選用的六個符號常量是在winsock.h文件中定義的。#define FD_READ 0 x01#define FD_WRITE 0 x02#define FD_
8、OOB 0 x04#define FD_ACCEPT 0 x08#define FD_CONNECT 0 x10#define FD_CLOSE 0 x20 他們代表MFC套接字對象可以接受并處理的六種網(wǎng)絡(luò)事件,當(dāng)事件發(fā)生時,套接字對象會收到相應(yīng)的通知消息,并自動執(zhí)行套接字對象響應(yīng)的事件處理函數(shù)。(1)FD_READ事件通知:通知有數(shù)據(jù)可讀。(2)FD_WRITE事件通知:通知可以寫數(shù)據(jù)。(3)FD_ACCEPT事件通知:通知監(jiān)聽套接字有連接請求可以接受。(4)FD_CONNECT事件通知:通知請求連接的套接字,連接的要求已被處理。(5)FD_CLOSE事件通知:通知套接字已關(guān)閉。(6)FD_
9、OOB事件通知:通知將有帶外數(shù)據(jù)到達(dá)。 2MFC框架對于六個網(wǎng)絡(luò)事件的處理框架對于六個網(wǎng)絡(luò)事件的處理當(dāng)上述的網(wǎng)絡(luò)事件發(fā)生時,MFC框架作何處理呢?按照Windows的消息驅(qū)動機(jī)制,MFC框架應(yīng)當(dāng)把消息發(fā)送給相應(yīng)的套接字對象,并調(diào)用作為該對象成員函數(shù)的事件處理函數(shù)。事件與處理函數(shù)是一一映射的。 在afxSock.h文件中的CAsyncSocket類的聲明中,定義了與這六個網(wǎng)絡(luò)事件對應(yīng)的事件處理函數(shù)。virtual void OnReceive(int nErrorCode); 對應(yīng) FD_READ事件virtual void OnSend(int nErrorCode); 對應(yīng) FD_WRITE
10、事件virtual void OnAccept(int nErrorCode); 對應(yīng) FD_ACCEPT事件virtual void OnConnect(int nErrorCode); 對應(yīng) FD_CONNECT事件virtual void OnClose(int nErrorCode); 對應(yīng) FD_CLOSE事件virtual void OnOutOfBandData(int nErrorCode); 對應(yīng) FD_OOB事件 當(dāng)某個網(wǎng)絡(luò)事件發(fā)生時,MFC框架會自動調(diào)用套接字對象的對應(yīng)的事件處理函數(shù)。這就相當(dāng)給了套接字對象一個通知,告訴它某個重要的事件已經(jīng)發(fā)生。所以也稱之為套接字類的通知
11、函數(shù)(notification functions)或回調(diào)函數(shù)(callback functions)。 3重載套接字對象的回調(diào)函數(shù)重載套接字對象的回調(diào)函數(shù)如果你從CAsyncSocket類派生了自己的套接字類,你必須重載你的應(yīng)用程序所感興趣的那些網(wǎng)絡(luò)事件所對應(yīng)的通知函數(shù)。MFC框架自動調(diào)用通知函數(shù),使得你可以在套接字被通知的時候來優(yōu)化套接字的行為。 5.1.4 客戶端套接字對象請求連接到服務(wù)器客戶端套接字對象請求連接到服務(wù)器端套接字對象端套接字對象 在服務(wù)器端套接字對象已經(jīng)進(jìn)入監(jiān)聽狀態(tài)之后,客戶應(yīng)用程序可以調(diào)用CAsyncSocket類的Connect()成員函數(shù),向服務(wù)器發(fā)出一個連接請求
12、格式一: BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort );格式二: BOOL Connect( const SOCKADDR* lpSockAddr, int nSockAddrLen ); 如果調(diào)用成功或者發(fā)生了WSAEWOULDBLOCK錯誤,當(dāng)調(diào)用結(jié)束返回時,都會發(fā)生FD_CONNECT事件,MFC框架會自動調(diào)用客戶端套接字的OnConnect()事件處理函數(shù),并將錯誤代碼作為參數(shù)傳送給它。它的原型調(diào)用格式如下: virtual void OnConnect( int nErrorCode ); 5.1.5 服務(wù)器接受客戶機(jī)
13、的連接請求服務(wù)器接受客戶機(jī)的連接請求在服務(wù)器端,使用CAsyncSocket流式套接字對象,一般按照以下步驟來接收客戶端套接字對象的連接請求。(1)服務(wù)器應(yīng)用程序必須首先創(chuàng)建一個CAsyncSocket流式套接字對象,并調(diào)用它的Create成員函數(shù)創(chuàng)建底層套接字句柄。這個套接字對象專門用來監(jiān)聽來自客戶機(jī)的連接請求,所以稱它為監(jiān)聽套接字對象。 (2)調(diào)用監(jiān)聽套接字對象的Listen成員函數(shù),使監(jiān)聽套接字對象開始監(jiān)聽來自客戶端的連接請求。此函數(shù)的調(diào)用格式是: BOOL Listen( int nConnectionBacklog = 5); 當(dāng)Listen函數(shù)確認(rèn)并接納了一個來自客戶端的連接請求后
14、,會觸發(fā)FD_ACCEPT事件,監(jiān)聽套接字會收到通知,表示監(jiān)聽套接子已經(jīng)接納了一個客戶的連接請求,MFC框架會自動調(diào)用監(jiān)聽套接字的OnAccept事件處理函數(shù),它的原型調(diào)用格式如下: virtual void OnAccept( int nErrorCode );編程者一般應(yīng)重載此函數(shù),在其中調(diào)用監(jiān)聽套接字對象的Accept函數(shù),來接收客戶端的連接請求。 (3)創(chuàng)建一個新的空的套接字對象,不需要使用它的Create函數(shù)來創(chuàng)建底層套接字句柄。這個套接字專門用來與客戶端連接,并進(jìn)行數(shù)據(jù)的傳輸。一般稱它為連接套接字,并作為參數(shù)傳遞給下一步的Accept成員函數(shù)。 (4)調(diào)用監(jiān)聽套接字對象的Accep
15、t成員函數(shù),調(diào)用格式為:virtual BOOL Accept( CAsyncSocket& rConnSocket,SOCKADDR* lpSockAddr = NULL,int* lpSockAddrLen = NULL );5.1.6 發(fā)送與接收流式數(shù)據(jù)。發(fā)送與接收流式數(shù)據(jù)。當(dāng)服務(wù)器和客戶機(jī)建立了連接以后,就可以在服務(wù)器端的連接套接字對象和客戶端的套接字對象之間傳輸數(shù)據(jù)了。對于流式套接字對象,使用CAsyncSocket類的Send成員函數(shù)向流式套接字發(fā)送數(shù)據(jù),使用Receive成員函數(shù)從流式套接字接收數(shù)據(jù)。 1用用Send成員函數(shù)發(fā)送數(shù)據(jù)成員函數(shù)發(fā)送數(shù)據(jù)格式:virtual i
16、nt Send( const void* lpBuf, int nBufLen, int nFlags = 0); 對于一個CAsyncSocket套接字對象,當(dāng)它的發(fā)送緩沖區(qū)騰空時,會激發(fā)FD_WRITE事件,套接字會得到通知,MFC框架會自動調(diào)用這個套接字對象的OnSend事件處理函數(shù)。一般編程者會重載這個函數(shù),在其中調(diào)用Send成員函數(shù)來發(fā)送數(shù)據(jù)。 2用用Receive成員函數(shù)接收數(shù)據(jù)成員函數(shù)接收數(shù)據(jù)格式: Virtual int Receive( Void* lpBuf, int nBufLen, Int nFlags = 0); 對于一個CAsyncSocket套接字對象,當(dāng)有數(shù)據(jù)到
17、達(dá)它的接收隊列時,會激發(fā)FD_READ事件,套接字會得到已經(jīng)有數(shù)據(jù)到達(dá)的通知,MFC框架會自動調(diào)用這個套接字對象的OnReceive事件處理函數(shù)。一般編程者會重載這個函數(shù),在其中調(diào)用Receive成員函數(shù)來接收數(shù)據(jù)。在應(yīng)用程序?qū)?shù)據(jù)取走之前,套接字接收的數(shù)據(jù)將一直保留在套接字的緩沖區(qū)中。 5.1.7 關(guān)閉套接字關(guān)閉套接字1使用使用CAsyncSocket類的類的Close成員函數(shù)成員函數(shù)格式:virtual void Close( );2使用使用CAsyncSocket類的類的ShutDown()成成員函數(shù)員函數(shù) 使用CAsyncSocket類的ShutDown()成員函數(shù),可以選擇關(guān)閉套接字
18、的方式。將套接字置為不能發(fā)送數(shù)據(jù),或不能接收數(shù)據(jù),或二者均不能的狀態(tài)。格式:BOOL ShutDown( int nHow = sends ); 5.1.8 錯誤處理錯誤處理 一般說來,調(diào)用CAsyncSocket對象的成員函數(shù)后,返回一個邏輯型的值,如果成員函數(shù)執(zhí)行成功,返回TRUE;如果失敗,返回FALSE。究竟是什么原因造成錯誤呢?這時,可以進(jìn)一步調(diào)用CAsyncSocket對象的GetLastError()成員函數(shù),來獲取更詳細(xì)的錯誤代碼,并進(jìn)行相應(yīng)的處理。格式: static int GetLastError( );返回值是一個錯誤碼,針對剛剛執(zhí)行的CAsyncSocket成員函數(shù)。
19、 5.1.9 其它的成員函數(shù)其它的成員函數(shù)1關(guān)于套接字屬性的函數(shù)關(guān)于套接字屬性的函數(shù)要 設(shè) 置 底 層 套 接 字 對 象 的 屬 性 , 可 以 調(diào) 用SetSocketOpt()成員函數(shù);要獲取套接字的設(shè)置信息,可調(diào)用GetSocketOpt()成員函數(shù);要控制套接字的工作模式,可調(diào)用IOCtl()成員函數(shù),選擇合適的參數(shù),可以將套接字設(shè)置在阻塞模式(Blocking mode)下工作。 2發(fā)送和接收數(shù)據(jù)發(fā)送和接收數(shù)據(jù)如果創(chuàng)建的是數(shù)據(jù)報類型的套接字,用SendTo()成員函數(shù)來向指定的地址發(fā)送數(shù)據(jù),事先不需要建立發(fā)送端和接收端之間的連接,用ReceiveFrom()成員函數(shù)可以從某個指定的
20、網(wǎng)絡(luò)地址接收數(shù)據(jù)。 發(fā)送數(shù)據(jù)SendTo的調(diào)用格式,有兩種重載的形式,區(qū)別在于參數(shù)不同:int SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0 );int SendTo( const void* lpBuf, int nBufLen, const SOCKADDR* lpSockAddr, int nSockAddrLen, int nFlags = 0 );接收數(shù)據(jù)ReceiveFrom的調(diào)用格式,也有兩種重載的形式,區(qū)別在于參數(shù)不同:
21、int ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 );int ReceiveFrom( void* lpBuf, int nBufLen, SOCKADDR* lpSockAddr, int* lpSockAddrLen, int nFlags = 0 ); 5.2 CSocket類類CSocket類是從CAsyncSocket類派生而來的,它們的派生關(guān)系如圖5.2: 圖5.2 CSocket類的派生關(guān)系 5.2.1 創(chuàng)建創(chuàng)建
22、CSocket對象對象分為兩個步驟:(1)調(diào)用CSocket類的構(gòu)造函數(shù),創(chuàng)建一個空的CSocket對象。(2)調(diào)用此CSocket對象的Create()成員函數(shù),創(chuàng)建對象的底層套接字。調(diào)用格式是:BOOL Create( UINT nSocketPort = 端口號,Int nSocketPort = SOCK_STREAM | SOCK_DGRAM,LPCTSTR lpszSocketAddress = 套接字所用的網(wǎng)絡(luò)地址 );如果打算使用CArchive對象和套接字一起進(jìn)行數(shù)據(jù)傳輸工作,必須使用流式套接字。 5.2.2 建立連接建立連接 CSocket類使用基類CAsyncSocket
23、的同名成員函數(shù)Connect()、Listen()、Accept()來建立服務(wù)器和客戶機(jī)套接字之間的連接,使用方法相同。不同的是:CSocket類的Connect()和Accept()支持阻塞調(diào)用。比如:在調(diào)用Connect()函數(shù)時會發(fā)生阻塞,直到成功地建立了連接或有錯誤發(fā)生才返回,在多線程的應(yīng)用程序中,一個線程發(fā)生阻塞,其他的線程仍能處理Windows事件。 CSocket對象從不調(diào)用OnConnect()事件處理函數(shù)。 5.2.3 發(fā)送和接收數(shù)據(jù)。發(fā)送和接收數(shù)據(jù)。 在創(chuàng)建CSocket類對象后,對于數(shù)據(jù)報套接字,直接使用CSocket類的SendTo()、ReceiveFrom()成員函
24、數(shù)來發(fā)送和接收數(shù)據(jù)。對于流式套接字,首先在服務(wù)器和客戶機(jī)之間建立連接,然后使用CSocket類的Send()、Receive()成員函數(shù)來發(fā)送和接收數(shù)據(jù),它們的調(diào)用方式與CAsyncSocket類相同。 不同的是:CSocket類的這些函數(shù)工作在阻塞的模式。比如,一旦調(diào)用了Send()函數(shù),在所有的數(shù)據(jù)發(fā)送之前,程序或線程將處于阻塞的狀態(tài)。一般將CSocket類與CArchive類和CSocketFile類結(jié)合,來發(fā)送和接收數(shù)據(jù),這將使編程更為簡單。CSocket對象從不調(diào)用OnSend()事件處理函數(shù)。 5.2.4 CSocket類與類與CArchive類和類和CSocketFile類類 使
25、用CSocket類的最大優(yōu)點在于,應(yīng)用程序可以在連接的兩端通過CArchive對象來進(jìn)行數(shù)據(jù)傳輸。具體做法是:(1)創(chuàng)建CSocket類對象(2)創(chuàng)建一個基于CSocketFile類的文件對象,并把它的指針傳給上面的已創(chuàng)建的CSocket對象。(3)分別創(chuàng)建用于輸入和輸出的CArchive對象,并將它們與這個CSocketFile文件對象連接。(4)利用CArchive對象來發(fā)送和接收數(shù)據(jù)。 下面是一段示例代碼:CSocket exSocket;/ 創(chuàng)建一個空的CSocket對象CSocketFile* pExFile;/定義一個CSocketFile對象指針/ 定義一個用于輸入的Carchi
26、ve對象指針CArchive* pCArchiveIn; / 定義一個用于輸出的Carchive對象指針CArchive* pCArchiveOut;/ 創(chuàng)建Csocket對象的底層套接字exSocket.Create();/創(chuàng)建CSocketFile對象,并將CSocket對象的指針傳遞給它pExFile = new CSocketFile( & exSocket,TRUE);/創(chuàng)建用于輸入的CArchive對象pCArchiveIn = new CArchive(pExFile, CArchive:load);/創(chuàng)建用于輸出的CArchive對象。pCArchiveOut = ne
27、w CArchive(pExFile, CArchive:store); 圖5.3 CSocket、CArchive和CSocketFile類在傳輸數(shù)據(jù)時的作用 5.2.5 關(guān)閉套接字和清除相關(guān)的對象,關(guān)閉套接字和清除相關(guān)的對象,在使用完CSocket對象以后,應(yīng)用程序應(yīng)調(diào)用它的Close()成員函數(shù)來釋放套接字占用的系統(tǒng)資源,也可以調(diào)用它的ShutDown()成員函數(shù)來禁止套接字讀寫。而對于相應(yīng)的CArchive對象、CSocketFile對象和CSocket對象,可以將它們銷毀;也可以不作處理,因為當(dāng)應(yīng)用程序終止時,會自動調(diào)用這些對象的析構(gòu)函數(shù),從而釋放這些對象占用的資源。 5.3 CSocket類的編程模型類的編程模型下面給出針對流式套接字的CSocket類的編程模型。分為服務(wù)器端和客戶端。1服務(wù)器端服務(wù)器端 CSocket sockServ; /創(chuàng)建空的服務(wù)器端監(jiān)聽套接字對象 sockSer
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023-2024學(xué)年粵教版(2019)高中信息技術(shù)必修一《數(shù)據(jù)與計算》第五章第二節(jié)《數(shù)據(jù)的采集》說課稿
- Unit 1 Friendship-Section 3 說課稿 2024-2025學(xué)年滬教版英語七年級上冊
- 全國山西經(jīng)濟(jì)版小學(xué)信息技術(shù)第三冊第一單元活動12《動畫的輸出》說課稿
- Unit 2 We are family!Section B (Project)說課稿-2024-2025學(xué)年人教版(2024)七年級英語上冊
- Unit 1 What's he like(說課稿)-2024-2025學(xué)年人教PEP版英語五年級上冊
- 群文閱讀《魯濱遜漂流記(節(jié)選)》《湯姆·索亞歷險記(節(jié)選)》《神秘島(節(jié)選)》說課稿-2024-2025學(xué)年六年級語文下冊統(tǒng)編版
- 2024版借款合同雙方約定
- 二零二五年度工業(yè)廠房安全租賃合同3篇
- Unit 1 Back to school Project 說課稿-2024-2025學(xué)年高一英語譯林版(2020)必修第一冊
- 寶石合成技術(shù)的現(xiàn)狀與發(fā)展方向考核試卷
- 常用靜脈藥物溶媒的選擇
- 當(dāng)代西方文學(xué)理論知到智慧樹章節(jié)測試課后答案2024年秋武漢科技大學(xué)
- 2024年預(yù)制混凝土制品購銷協(xié)議3篇
- 2024-2030年中國高端私人會所市場競爭格局及投資經(jīng)營管理分析報告
- GA/T 1003-2024銀行自助服務(wù)亭技術(shù)規(guī)范
- 《消防設(shè)備操作使用》培訓(xùn)
- 新交際英語(2024)一年級上冊Unit 1~6全冊教案
- 2024年度跨境電商平臺運營與孵化合同
- 2024年電動汽車充電消費者研究報告-2024-11-新能源
- 湖北省黃岡高級中學(xué)2025屆物理高一第一學(xué)期期末考試試題含解析
- 上海市徐匯中學(xué)2025屆物理高一第一學(xué)期期末學(xué)業(yè)水平測試試題含解析
評論
0/150
提交評論