版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、tcp/ip協(xié)議分析與應(yīng)用編程課程設(shè)計報告一、 團(tuán)隊介紹二、 實驗步驟三、 實驗體會一、 團(tuán)隊介紹二、 實驗步驟1使用mfc appwizard創(chuàng)建客戶端應(yīng)用程序框架。2為對話框界面添加控件對象3為對話框中的控件對象定義相應(yīng)的成員變量4創(chuàng)建從casyncsocket類繼承的派生類5手工添加的代碼6添加事件函數(shù)和成員函數(shù)的代碼7進(jìn)行測試。 客戶端程序的主要功能的代碼和分析1應(yīng)用程序類ctcapp對應(yīng)的文件應(yīng)用程序類ctcapp,對應(yīng)的文件是tc.h和tc.cpp;tc.h定義了ctcapp類,tc.cpp是該類的實現(xiàn)代碼,完全由vc+自動創(chuàng)建,用戶不必作任何改動。2派生的套接字類ccsocket
2、對應(yīng)的文件ccsocket類對應(yīng)csocket.h頭文件和csocket.cpp文件。3.cmsg類對應(yīng)的文件msg.h頭文件和msg.cpp文件。4對話框類ctcdlg對應(yīng)的文件對話框類cttcdlg,對應(yīng)的文件是tcdlg.h和tcdlg.cpp。5其他文件對于vc+為tc工程創(chuàng)建的其他文件,如stdafx.h和stdafx.cpp,以及resource.h和tc.rc都不需要作任何處理。 創(chuàng)建客戶端應(yīng)用程序1使用mfc appwizard創(chuàng)建客戶端應(yīng)用程序框架。(1)在new對話框中,選擇projects卡,如圖所示。從左邊的列表框中選擇mfc appwizard(exe)條目,在右邊的
3、project name處填入工程名tc,在location處選定存放此工程的目錄。然后點擊ok按鈕(2)出現(xiàn)mfc appwizard設(shè)置的第一步對話框(mfc appwizard step 1),如圖所示。從中選擇dialog based的應(yīng)用程序類型,語言支持選擇中文(中國),使此工程能夠正確地進(jìn)行中文的輸入、輸出、顯示及處理。然后點擊next按鈕。 (3)出現(xiàn)mfc appwizard設(shè)置的第二步對話框(mfc appwizards step 2 of 4),如圖所示,在windows sockets復(fù)選框上打上選擇標(biāo)記,表示應(yīng)用程序?qū)⒅С謜insock套接字。接受其它的默認(rèn)設(shè)置。跳過
4、后面的步驟,直接點擊finsh按鈕(4)出現(xiàn)新工程信息對話框(new project information),說明了所創(chuàng)建的骨架工程的有關(guān)信息。如圖所示。 2為對話框界面添加控件對象在創(chuàng)建了應(yīng)用程序骨架之后,可以布置程序的主對話框。在mfc界面左方的工作區(qū)(workspace)中選擇resourceview卡,從中選擇dialog,雙擊idd_tc_dialog,右邊會出現(xiàn)對話框,左邊會出現(xiàn)控件面板,利用控件面板可以方便地在程序的主對話框界面中添加相應(yīng)的可視控件對象,如圖所示。 完成的對話框如圖所示,然后按照表修改控件的屬性。 控件類型控件idcaption靜態(tài)文本 static texti
5、dc_static_servname服務(wù)器名稱靜態(tài)文本 static textidc_static_servport服務(wù)器端口靜態(tài)文本 static textidc_static_msg消 息靜態(tài)文本 static textidc_static_sent客戶名編輯框 edit boxidc_edit_servname編輯框 edit boxidc_edit_servport編輯框 edit boxidc_edit_msg命令按鈕 buttonidc_button_connect連接命令按鈕 buttonidc_button_close斷開命令按鈕 buttonidok發(fā)送列表框 listbox
6、idc_list_sent列表框 listboxidc_list_received3為對話框中的控件對象定義相應(yīng)的成員變量在窗口菜單中點查看/建立類向?qū)?,進(jìn)入類向?qū)?class wizard)對話框,如圖。 選擇成員變量卡(member variables),用類向?qū)閷υ捒蛑械目丶ο蠖x相應(yīng)的成員變量。確認(rèn)class name是ctcdlg,在左邊的列表框中選擇一個控件,然后點“add variable”按鈕,會彈出”add member variable”對話框,如圖所示,然后按照表輸入即可。 客戶端程序?qū)υ捒蛑械目丶ο髮?yīng)的成員變量 控件idcontrol ids變量名稱member
7、 variable name變量類別category變量類型variable typeidc_button_connectm_btnconnectcontrolcbuttonidc_edit_servnamem_strservnamevaluecstringidc_edit_servportm_strservportvalueintidc_edit_msgm_strmsgvaluecstringidc_list_sentm_listsentcontrolclistboxidc_list_receivedm_listrecetvedcontrolclistbox4創(chuàng)建從casyncsocket類
8、繼承的派生類(1)為了能夠捕獲并響應(yīng)socket事件,應(yīng)創(chuàng)建用戶自己的套接字類,它應(yīng)當(dāng)從casyncsocket類派生,還能將套接字事件傳遞給對話框,以便執(zhí)行用戶自己的事件處理函數(shù)。選擇菜單“插入/新建類”,進(jìn)入“new class”對話框,如圖所示。 選擇或輸入以下信息:class type:選擇mfc classclass infoumation下的name: 輸入ccsocketclass infoumation下的base class:選擇casyncsocket點擊“ok”按鈕,系統(tǒng)會自動生成ccsocket類對應(yīng)的包含文件csocket.h和csocket.cpp文件,在vc界面的
9、class view中就可以看到這個類。 (2)利用類向?qū)lasswizard為這個套接字類添加響應(yīng)消息的事件處理成員函數(shù)。點菜單view/classwizard.,進(jìn)入類向?qū)υ捒?,選擇message maps(消息映射)卡,確認(rèn)class name是ccsocket,從messages(消息)欄中選擇事件消息,然后點擊add function按鈕,就會看到在member function欄中添加了相應(yīng)的事件處理函數(shù)。如圖5.13所示,此程序中需要添加onconnect,onclose和onreceive三個函數(shù)。這一步會在ccsocket類的csocket.h中自動生成這些函數(shù)的聲明,在
10、csocket.cpp中生成這些函數(shù)的框架,以及消息映射的相關(guān)代碼。(3)為套接字類添加一般的成員函數(shù)和成員變量在vc+的界面中,在工作區(qū)窗口選擇classview卡,用右鍵單擊ccsocket類,會彈出快捷菜單,選擇其中的add member function 可以為該類添加成員函數(shù);選擇add member variable可以為該類添加成員變量。如圖所示。(4)手工添加其他代碼在vc+的界面中,在工作區(qū)窗口選擇fileview卡,雙擊要編輯的文件,在右面的窗口中就會展示該文件的代碼,可以編輯添加。對于csocket.h,應(yīng)在文件開頭,添加對于此應(yīng)用程序?qū)υ捒蝾惖穆暶鳌lass ctcd
11、lg;5手工添加的代碼在ctcdlg對話框類的tcdlg.h中添加對于csocket.h的包含命令,來獲得對于套接字支持: #include “csocket.h”在ctcdlg對話框類的tcdlg.cpp中添加對于控件變量的初始化代碼:/ todo: add extra initialization here/用戶添加的控件變量的初始化代碼bool ctcdlg:oninitdialog()m_strservname=localhost; / 服務(wù)器名 = localhostm_nservport=1000; / 服務(wù)端口 = 1000updatedata(false); / 更新用戶界面/
12、設(shè)置套接字類的對話框指針成員變量m_sconnectsocket.setparent(this); 6添加事件函數(shù)和成員函數(shù)的代碼主要在ctcdlg對話框類的tcdlg.cpp中和ccsocket類的csocket.cpp中,添加用戶自己的事件函數(shù)和成員函數(shù)的代碼,要注意,這些函數(shù)的框架已經(jīng)在前面的步驟中,由vc+的向?qū)?,只要將用戶自己的代碼填入其中即可。7進(jìn)行測試。測試應(yīng)分步進(jìn)行,在上面的步驟中,每作一步,都可以試著編譯執(zhí)行。創(chuàng)建服務(wù)器端應(yīng)用程序1使用mfc appwizard創(chuàng)建服務(wù)器端應(yīng)用程序框架。2為對話框界面添加控件對象3為對話框中的控件對象定義相應(yīng)的成員變量4創(chuàng)建從casync
13、socket類繼承的派生類5手工添加的代碼6添加事件函數(shù)和成員函數(shù)的代碼7進(jìn)行測試。 客戶端程序的主要功能的代碼和分析1應(yīng)用程序類ctsapp對應(yīng)的文件ts.h和ts.cpp。2類ccsocket對應(yīng)的文件csocket.h頭文件和csocket.cpp文件。3.cmsg類對應(yīng)的文件msg.h頭文件和msg.cpp文件。4.clsocket對應(yīng)的文件lsocket.h和lsocket.cpp5對話框類ctcdlg對應(yīng)的文件對話框類cttcdlg,對應(yīng)的文件是tcdlg.h和tcdlg.cpp。6其他文件對于vc+為tc工程創(chuàng)建的其他文件,如stdafx.h和stdafx.cpp,以及resou
14、rce.h和tc.rc都不需要作任何處理。 服務(wù)器端程序:csocket.cpp/ csocket.cpp: implementation of the ccsocket class./#include stdafx.h#include ts.h#include csocket.h#include tsdlg.h#include msg.h#ifdef _debug#undef this_filestatic char this_file=_file_;#define new debug_new#endif/ construction/destruction/構(gòu)造函數(shù)ccsocket:ccso
15、cket(ctsdlg* pdlg)m_pdlg = pdlg;m_pfile = null;m_parchivein = null;m_parchiveout = null;/析構(gòu)函數(shù)ccsocket:ccsocket()m_pdlg = null;if (m_parchiveout != null) delete m_parchiveout;if (m_parchivein != null) delete m_parchivein;if (m_pfile != null) delete m_pfile;/初始化void ccsocket:initialize()/構(gòu)造與此套接字相應(yīng)的cso
16、cketfile對象m_pfile=new csocketfile(this,true);/構(gòu)造與此套接字相應(yīng)的carchive對象m_parchivein=new carchive(m_pfile,carchive:load);m_parchiveout=new carchive(m_pfile,carchive:store);/發(fā)送消息void ccsocket:sendmessage(cmsg* pmsg)if (m_parchiveout != null)/調(diào)用消息類的序列化函數(shù),發(fā)送消息pmsg-serialize(*m_parchiveout);/將carchive對象中的數(shù)據(jù)強(qiáng)制
17、性寫入csocketfile文件中m_parchiveout-flush();/接收消息void ccsocket:receivemessage(cmsg* pmsg)/調(diào)用消息類的序列化函數(shù),接收消息pmsg-serialize(*m_parchivein);/onreceive事件處理函數(shù),當(dāng)套接字收到數(shù)據(jù)時,激發(fā)此事件void ccsocket:onreceive(int nerrorcode) csocket:onreceive(nerrorcode);/調(diào)用主對話框類中的相應(yīng)函數(shù)來處理m_pdlg-onreceive(this);implement_dynamic(ccsocket,
18、csocket)csocket.h/ csocket.h: interface for the ccsocket class./#if !defined(afx_csocket_h_included_)#define afx_csocket_h_included_class ctsdlg;class cmsg;/用于建立連接和傳送接收信息的客戶套接字類定義class ccsocket : public csocket declare_dynamic(ccsocket);/constructionpublic:ccsocket(ctsdlg* pdlg); /構(gòu)造函數(shù)virtual ccsock
19、et(); /析構(gòu)函數(shù)/attributespublic:ctsdlg* m_pdlg; /主對話框類指針變量csocketfile* m_pfile; /csocketfile對象的指針變量carchive* m_parchivein; /用于輸入的carchive對象的指針變量carchive* m_parchiveout;/用于輸出的carchive對象的指針變量/operationspublic:void initialize(); /初始化void sendmessage(cmsg* pmsg); /發(fā)送消息void receivemessage(cmsg* pmsg); /接收消息
20、/overridable callbacks/可重載的回調(diào)函數(shù),當(dāng)套接字收到數(shù)據(jù)時,自動調(diào)用此函數(shù)protected:virtual void onreceive(int nerrorcode);#endif / !defined(afx_csocket_h_included_)lsocket.cpp/ lsocket.cpp: implementation of the clsocket class./#include stdafx.h#include ts.h#include lsocket.h#include tsdlg.h#ifdef _debug#undef this_filesta
21、tic char this_file=_file_;#define new debug_new#endif/ construction/destruction/clsocket:clsocket(ctsdlg* pdlg)m_pdlg = pdlg; /對成員變量賦值clsocket:clsocket()m_pdlg = null;/onaccept事件處理函數(shù)void clsocket:onaccept(int nerrorcode) csocket:onaccept(nerrorcode);m_pdlg-onaccept(); /調(diào)用主對話框類中的相應(yīng)函數(shù)implement_dynamic
22、(clsocket,csocket)lsocket.h/ lsocket.h: interface for the clsocket class./#if !defined(afx_lsocket_h_included_)#define afx_lsocket_h_included_class ctsdlg;/專用于監(jiān)聽客戶端連接請求的偵聽套接字類定義class clsocket : public csocket declare_dynamic(clsocket);/constructionpublic:clsocket(ctsdlg* pdlg);virtual clsocket();/ a
23、ttributespublic:ctsdlg* m_pdlg; /成員變量/ overridable callbacks/可重載的回調(diào)函數(shù),當(dāng)套接字收到連接請求時,自動調(diào)用此函數(shù)protected:virtual void onaccept(int nerrorcode);#endif / !defined(afx_lsocket_h_included_)msg.cpp/ msg.cpp: implementation of the cmsg class./#include stdafx.h#include ts.h#include msg.h#ifdef _debug#undef this_
24、filestatic char this_file=_file_;#define new debug_new#endif/ construction/destruction/cmsg:cmsg()m_strtext = _t(); /初始化m_bclose=false;cmsg:cmsg()void cmsg:serialize(carchive& ar)if (ar.isstoring()ar(word)m_bclose;ar wd;m_bclose=(bool)wd;ar m_strtext;implement_dynamic(cmsg,cobject)msg.h/ msg.h: inte
25、rface for the cmsg class./#if !defined(afx_msg_h_included_)#define afx_msg_h_included_/消息類定義class cmsg : public cobject declare_dyncreate(cmsg);/constructionpublic:cmsg();virtual cmsg();/attributespublic:cstring m_strtext; /字符串成員bool m_bclose; /是否關(guān)閉狀態(tài)/implementationpublic:virtual void serialize(carc
26、hive& ar); /序列化函數(shù);#endif / !defined(afx_msg_h_included_)ts.cpp/ ts.cpp : defines the class behaviors for the application./#include stdafx.h#include ts.h#include tsdlg.h#ifdef _debug#define new debug_new#undef this_filestatic char this_file = _file_;#endif/ ctsappbegin_message_map(ctsapp, cwinapp)/af
27、x_msg_map(ctsapp)/ note - the classwizard will add and remove mapping macros here./ do not edit what you see in these blocks of generated code!/afx_msgon_command(id_help, cwinapp:onhelp)end_message_map()/ ctsapp constructionctsapp:ctsapp()/ todo: add construction code here,/ place all significant in
28、itialization in initinstance/ the one and only ctsapp objectctsapp theapp;/ ctsapp initializationbool ctsapp:initinstance()if (!afxsocketinit()afxmessagebox(idp_sockets_init_failed);return false;afxenablecontrolcontainer();/ standard initialization/ if you are not using these features and wish to re
29、duce the size/ of your final executable, you should remove from the following/ the specific initialization routines you do not need.#ifdef _afxdllenable3dcontrols();/ call this when using mfc in a shared dll#elseenable3dcontrolsstatic();/ call this when linking to mfc statically#endifctsdlg dlg;m_pm
30、ainwnd = &dlg;int nresponse = dlg.domodal();if (nresponse = idok)/ todo: place code here to handle when the dialog is/ dismissed with okelse if (nresponse = idcancel)/ todo: place code here to handle when the dialog is/ dismissed with cancel/ since the dialog has been closed, return false so that we
31、 exit the/ application, rather than start the applications message pump.return false;ts.h/ ts.h : main header file for the ts application/#if !defined(afx_ts_h_ff52aae4_fdc6_11d9_bc43_000795df7f99_included_)#define afx_ts_h_ff52aae4_fdc6_11d9_bc43_000795df7f99_included_#if _msc_ver 1000#pragma once#
32、endif / _msc_ver 1000#ifndef _afxwin_h_#error include stdafx.h before including this file for pch#endif#include resource.h/ main symbols/ ctsapp:/ see ts.cpp for the implementation of this class/class ctsapp : public cwinapppublic:ctsapp();/ overrides/ classwizard generated virtual function override
33、s/afx_virtual(ctsapp)public:virtual bool initinstance();/afx_virtual/ implementation/afx_msg(ctsapp)/ note - the classwizard will add and remove member functions here./ do not edit what you see in these blocks of generated code !/afx_msgdeclare_message_map();/afx_insert_location/ microsoft visual c+
34、 will insert additional declarations immediately before the previous line.#endif / !defined(afx_ts_h_ff52aae4_fdc6_11d9_bc43_000795df7f99_included_)tsdlg.cpp/ tsdlg.cpp : implementation file/#include stdafx.h#include ts.h#include tsdlg.h#include msg.h#ifdef _debug#define new debug_new#undef this_fil
35、estatic char this_file = _file_;#endif/ caboutdlg dialog used for app aboutclass caboutdlg : public cdialogpublic:caboutdlg();/ dialog data/afx_data(caboutdlg)enum idd = idd_aboutbox ;/afx_data/ classwizard generated virtual function overrides/afx_virtual(caboutdlg)protected:virtual void dodataexcha
36、nge(cdataexchange* pdx); / ddx/ddv support/afx_virtual/ implementationprotected:/afx_msg(caboutdlg)/afx_msgdeclare_message_map();caboutdlg:caboutdlg() : cdialog(caboutdlg:idd)/afx_data_init(caboutdlg)/afx_data_initvoid caboutdlg:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);/afx_data
37、_map(caboutdlg)/afx_data_mapbegin_message_map(caboutdlg, cdialog)/afx_msg_map(caboutdlg)/ no message handlers/afx_msg_mapend_message_map()/ ctsdlg dialogctsdlg:ctsdlg(cwnd* pparent /*=null*/): cdialog(ctsdlg:idd, pparent)/afx_data_init(ctsdlg)m_nport = 0;/afx_data_init/ note that loadicon does not r
38、equire a subsequent destroyicon in win32m_hicon = afxgetapp()-loadicon(idr_mainframe);m_plsocket = null;void ctsdlg:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);/afx_data_map(ctsdlg)ddx_control(pdx, idc_static_num, m_stanum);ddx_control(pdx, idok, m_btnclose);ddx_control(pdx, idc_li
39、st_msg, m_listmsg);ddx_control(pdx, idc_button_listen, m_btnlisten);ddx_text(pdx, idc_edit_port, m_nport);/afx_data_mapbegin_message_map(ctsdlg, cdialog)/afx_msg_map(ctsdlg)on_wm_syscommand()on_wm_paint()on_wm_querydragicon()on_bn_clicked(idc_button_listen, onbuttonlisten)on_bn_clicked(idok, onclose
40、)/afx_msg_mapend_message_map()/ ctsdlg message handlersbool ctsdlg:oninitdialog()cdialog:oninitdialog();/ add about. menu item to system menu./ idm_aboutbox must be in the system command range.assert(idm_aboutbox & 0xfff0) = idm_aboutbox);assert(idm_aboutbox appendmenu(mf_separator);psysmenu-appendm
41、enu(mf_string, idm_aboutbox, straboutmenu);/ set the icon for this dialog. the framework does this automatically/ when the applications main window is not a dialogseticon(m_hicon, true);/ set big iconseticon(m_hicon, false);/ set small icon/ todo: add extra initialization herem_nport = 8000;updateda
42、ta(false);getdlgitem(idok)-enablewindow(false);return true; / return true unless you set the focus to a controlvoid ctsdlg:onsyscommand(uint nid, lparam lparam)if (nid & 0xfff0) = idm_aboutbox)caboutdlg dlgabout;dlgabout.domodal();elsecdialog:onsyscommand(nid, lparam);/ if you add a minimize button
43、to your dialog, you will need the code below/ to draw the icon. for mfc applications using the document/view model,/ this is automatically done for you by the framework.void ctsdlg:onpaint() if (isiconic()cpaintdc dc(this); / device context for paintingsendmessage(wm_iconerasebkgnd, (wparam) dc.gets
44、afehdc(), 0);/ center icon in client rectangleint cxicon = getsystemmetrics(sm_cxicon);int cyicon = getsystemmetrics(sm_cyicon);crect rect;getclientrect(&rect);int x = (rect.width() - cxicon + 1) / 2;int y = (rect.height() - cyicon + 1) / 2;/ draw the icondc.drawicon(x, y, m_hicon);elsecdialog:onpai
45、nt();/ the system calls this to obtain the cursor to display while the user drags/ the minimized window.hcursor ctsdlg:onquerydragicon()return (hcursor) m_hicon;/以下的函數(shù)代碼是由編程者添加的!/當(dāng)單擊“監(jiān)聽”按鈕時,執(zhí)行此函數(shù),啟動服務(wù)器端套接字的監(jiān)聽void ctsdlg:onbuttonlisten() updatedata(true); /獲得用戶輸入/創(chuàng)建偵聽套接字對象m_plsocket = new clsocket(this);/創(chuàng)建監(jiān)聽套接字的底層套接字,在用戶指定的端口上偵聽if (!m_plsocket-create(m_nport)delete m_plsocket; /錯誤處理m_pls
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南省信陽市羅山縣2024-2025學(xué)年七年級上學(xué)期期中生物學(xué)試題(解析版)
- 2024年生態(tài)園林建設(shè)施工合同2篇
- 2024年度國際貿(mào)易代理委托借款反擔(dān)保服務(wù)合同3篇
- 2025電視節(jié)目制作播出合同
- 2025林木委托管護(hù)合同
- 2024年某科技公司關(guān)于研發(fā)人工智能技術(shù)的合作協(xié)議
- 2025承攬合同(簡3)承攬合同
- 2024年拖拉機(jī)買賣簡易協(xié)議范例版B版
- 2024年人民醫(yī)院新院區(qū)醫(yī)療廢物處置中心建設(shè)施工合同2篇
- 珠寶首飾庫存優(yōu)化方案
- 華南理工大學(xué)《自然語言處理》2023-2024學(xué)年期末試卷
- 新能源行業(yè)光伏發(fā)電與儲能技術(shù)方案
- 中國高血壓防治指南(2024年修訂版)要點解讀
- 24秋國開《西方行政學(xué)說》形考任務(wù)1答案(第2套)
- 2024巡察整改方案和整改措施
- 醫(yī)院冬季防雪防凍工作應(yīng)急預(yù)案
- 2024年公共管理學(xué)考試題庫及答案
- 借用資質(zhì)簽合同模板
- 退休員工返聘審批表
- Unit 7 Careers Writing Workshop 申請信講解 教學(xué)設(shè)計-2023-2024學(xué)年高中英語北師大版2019 選擇性必修第三冊
- 風(fēng)電場全過程咨詢項目管理規(guī)劃方案
評論
0/150
提交評論