




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院20082009 學(xué)年第 2 學(xué)期計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)題目: 端口掃描實(shí)驗(yàn) 班級(jí): 學(xué)號(hào): 姓名: 教師: 成績(jī): 目 錄1 需求分析31.1 課程設(shè)計(jì)目的31.2 課程設(shè)計(jì)內(nèi)容31.3 課程設(shè)計(jì)要求32 概要設(shè)計(jì)32.1 原理概述32.2 運(yùn)行環(huán)境32.3 基本設(shè)計(jì)思路32.4 功能模塊設(shè)計(jì)33 詳細(xì)設(shè)計(jì)33.1 程序流程33.2 主要算法53.3 主要數(shù)據(jù)結(jié)構(gòu)63.4 主要函數(shù)說明64 用戶使用手冊(cè)75 項(xiàng)目分析與總結(jié)75.1 項(xiàng)目分析75.2 總結(jié)與建議8附錄a 源程序代碼文件說明8附錄b 參考文獻(xiàn)201. 需求分析1.1 課程設(shè)計(jì)目的 加深對(duì)tcp/ip的理解,熟悉s
2、ocket編程。課程設(shè)計(jì)內(nèi)容實(shí)現(xiàn)一個(gè)掃描器,使用tcp connect進(jìn)行端口掃描,并把掃描到的結(jié)果記錄下來(lái)。課程設(shè)計(jì)要求(1) windows或linux環(huán)境下,程序在單機(jī)上運(yùn)行;(2) 使用端口掃描對(duì)一臺(tái)主機(jī)進(jìn)行掃描,并顯示出結(jié)果;對(duì)一個(gè)網(wǎng)段進(jìn)行ip掃描,顯示出結(jié)果;(3) 提供友好的用戶界面。2. 概要設(shè)計(jì)2.1 原理概述tcp connect掃描是最基本的掃描,操作系統(tǒng)提供的connect()系統(tǒng)調(diào)用,用來(lái)與每一個(gè)感興趣的目標(biāo)計(jì)算機(jī)的端口進(jìn)行連接。如果端口處于偵聽狀態(tài),那么connect()就能成功。否則,這個(gè)端口是不能用的,即沒有提供服務(wù)。2.2 運(yùn)行環(huán)境windows xp,vc+
3、6.02.3 基本設(shè)計(jì)思路創(chuàng)建一個(gè)csocket套接字,通過csocket的connect函數(shù)測(cè)試該主機(jī)的某個(gè)端口是否能夠連通,獲得該端口的打開狀態(tài)。2.4 功能模塊設(shè)計(jì)(1)測(cè)試主機(jī)某個(gè)端口是否打開;(2)“掃描結(jié)果”標(biāo)題欄;(3)掃描單個(gè)或多個(gè)端口的單選按鈕;(4)“掃描”,“停止”,“保存”按鈕。3.詳細(xì)設(shè)計(jì)3.1 程序流程開始掃描初始化掃描單個(gè)端口?tm_bsingleport=true;m_csingleport.enablewindow();m_cportfrom.enablewindow(false);m_cportto.enablewindow(false);m_cbtnsto
4、p.enablewindow(false);fm_bsingleport=false;m_csingleport.enablewindow(false);m_cportfrom.enablewindow();m_cportto.enablewindow();m_cbtnstop.enablewindow(false);設(shè)置端口開始偵聽端口有錯(cuò)誤?顯示結(jié)果ft設(shè)置下一端口掃描結(jié)束3.2 主要算法(1)測(cè)試主機(jī)某個(gè)端口是否打開的函數(shù)testconnection():bool cmydlg:testconnection(cstring ip,uint nport) csocket* psocket;
5、psocket=new csocket;assert(psocket);if (!psocket-create() delete psocket;psocket=null;return false;while (!psocket-connect(ip,nport) delete psocket;psocket=null;return false;psocket-close();delete psocket;return true;(2)響應(yīng)單選按鈕“掃描單個(gè)端口”和“掃描多個(gè)端口”的單擊消息:void cmydlg:onradio1single() m_bsingleport=true;m_c
6、singleport.enablewindow();m_cportfrom.enablewindow(false);m_cportto.enablewindow(false);m_cbtnstop.enablewindow(false);void cmydlg:onradio2range() m_bsingleport=false;m_csingleport.enablewindow(false);m_cportfrom.enablewindow();m_cportto.enablewindow();m_cbtnstop.enablewindow(false);(3)顯示列表框標(biāo)題欄的成員函數(shù)
7、:/增加列表框標(biāo)題欄的某一列bool cmydlg:addcolumn(lpctstr stritem,int nitem,int nsubitem,int nmask,int nfmt) lv_column lvc;lvc.mask=nmask;lvc.fmt=nfmt;lvc.psztext=(lptstr) stritem;lvc.cx=m_cresult.getstringwidth(lvc.psztext)+25;if(nmask&lvcf_subitem) if(nsubitem!=-1)lvc.isubitem=nsubitem;elselvc.isubitem=nitem;re
8、turn m_cresult.insertcolumn(nitem,&lvc);/在列表框中加一條bool cmydlg:additem(int nitem,int nsubitem,lpctstr stritem ,int nimageindex) lv_item lvitem;lvitem.mask=lvif_text;lvitem.iitem=nitem;lvitem.isubitem=nsubitem;lvitem.psztext=(lptstr)stritem;if(nimageindex!=-1) lvitem.mask|=lvif_image;lvitem.iimage|=lvi
9、f_image;if(nsubitem=0)return m_cresult.insertitem(&lvitem);return m_cresult.setitem(&lvitem);/加一列標(biāo)題欄字符void cmydlg:addheader(lptstr hdr) if (m_pcolumns)m_pcolumns-addtail(hdr);/顯示列表框標(biāo)題欄void cmydlg:showheaders() int nindex=0;position pos=m_pcolumns-getheadposition();while(pos) cstring hdr=(cstring)m_p
10、columns-getnext(pos);addcolumn(hdr,nindex+);(4)“掃描”,“停止”,“保存”按鈕,見附錄程序。3.3 主要數(shù)據(jù)結(jié)構(gòu)及主要函數(shù)說明(1)測(cè)試主機(jī)某個(gè)端口是否打開testconnection函數(shù);(2)“掃描結(jié)果”標(biāo)題欄成員函數(shù)addheader,addcolumn,showheaders;在列表框中添加字符串的函數(shù)additem;(3)掃描單個(gè)或多個(gè)端口的單選按鈕onradiosingle()和onradiorange();(4)“掃描”,“停止”,“保存”按鈕onbutton1start(),onbutton2stop(),onbutton3sav
11、e();4.用戶使用手冊(cè)輸入要掃描的主機(jī)ip地址,選擇“掃描單個(gè)端口”或“掃描多個(gè)端口”,若選擇前者,則輸入單個(gè)端口號(hào);若選擇后者,則輸入端口范圍。再輸入掃描次數(shù)(默認(rèn)值為1),單擊“掃描”按鈕,掃描結(jié)果列表框中將會(huì)顯示所輸入端口的掃描結(jié)果。單擊“停止”時(shí)停在那一刻的狀態(tài),并顯示已掃描的結(jié)果。單擊“保存”時(shí),可將結(jié)果保存在文本文件中。5.項(xiàng)目分析與總結(jié)5.1 項(xiàng)目分析掃描單個(gè)端口的結(jié)果:掃描多個(gè)端口:通過觀察,主機(jī)ip為10.5.104.36的25號(hào)端口是打開的。5.2 總結(jié)與建議通過這次實(shí)驗(yàn),加深了對(duì)端口的理解,也對(duì)socket編程有了進(jìn)一步的認(rèn)識(shí)。實(shí)驗(yàn)中遇到許多函數(shù)和定義需要上網(wǎng)查閱資料,
12、而且調(diào)試的過程也比較困難,需要向同學(xué)請(qǐng)教。所以,今后在編程和查閱資料方面的能力有待于進(jìn)一步去提高。附錄a源程序代碼文件說明:(1)端口掃描dlg.h:#if !defined(afx_dlg_h_37f5060c_6d8b_42f0_90d9_fba754bad52b_included_)#define afx_dlg_h_37f5060c_6d8b_42f0_90d9_fba754bad52b_included_#if _msc_ver 1000#pragma once#endif / _msc_ver 1000#include #include #include #include #inc
13、lude /掃描結(jié)果typedef struct int nattempts;tchar ipaddress16;tchar port5;bool bstatus; /1 = open , 0 = closedata;/ cmydlg dialogclass cmydlg : public cdialog/ constructionpublic:cmydlg(cwnd* pparent = null);/ standard constructor/ dialog data/afx_data(cmydlg)enum idd = idd_my_dialog ;cprogressctrlm_cpro
14、gress;clistctrlm_cresult;cipaddressctrlm_cip;ceditm_cattempts;ceditm_cportto;ceditm_cportfrom;ceditm_csingleport;cbuttonm_cbtnstop;cbuttonm_cbtnscan;/afx_data/ classwizard generated virtual function overrides/afx_virtual(cmydlg)protected:virtual void dodataexchange(cdataexchange* pdx);/ ddx/ddv supp
15、ort/afx_virtual/ implementationprotected:hicon m_hicon; bool testconnection(cstring ip, uint nport);/測(cè)試主機(jī)某個(gè)端口是否打開void showheaders(void);/顯示列表框標(biāo)題欄void addheader(lptstr hdr);/增加一列標(biāo)題欄字符additem(int nitem,int nsubitem,lpctstr stritem,int nimageindex=-1);/向m_cresult輸出一個(gè)結(jié)果/ 向輸出結(jié)構(gòu)列表控件增加一列bool addcolumn(lpct
16、str stritem,int nitem,int nsubitem=-1,int nmask=lvcf_fmt|lvcf_width|lvcf_text|lvcf_subitem,int nfmt=lvcfmt_left);/ 變量uint m_nmaxattempts;/試圖連接次數(shù)的最大值bool m_bsingleport;/是否只掃描單個(gè)端口uint m_minport,m_maxport;/掃描端口的范圍uint m_ncounter;/端口的個(gè)數(shù)cstringlist* m_pcolumns;/列表框標(biāo)題欄cptrlist* m_pstatuslist;/保存掃描結(jié)果的鏈表/ g
17、enerated message map functions/afx_msg(cmydlg)virtual bool oninitdialog();afx_msg void onsyscommand(uint nid, lparam lparam);afx_msg void onpaint();afx_msg hcursor onquerydragicon();afx_msg void onbutton1start();afx_msg void onbutton2stop();afx_msg void onbutton3save();afx_msg void onradio1single();
18、afx_msg void onradio2range();/afx_msgdeclare_message_map();/afx_insert_location/ microsoft visual c+ will insert additional declarations immediately before the previous line.#endif / !defined(afx_dlg_h_37f5060c_6d8b_42f0_90d9_fba754bad52b_included_)(2)端口掃描dlg.cpp:#includestdafx.h#include端口掃描.h#inclu
19、de端口掃描dlg.h#ifdef _debug#define new debug_new#undef this_filestatic char this_file = _file_;#endif/ caboutdlg dialog used for app aboutclass caboutdlg : public cdialog public:caboutdlg();/ dialog data/afx_data(caboutdlg)enum idd = idd_aboutbox ;/afx_data/ classwizard generated virtual function overr
20、ides/afx_virtual(caboutdlg)protected:virtual void dodataexchange(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:dodataexch
21、ange(cdataexchange* pdx)cdialog:dodataexchange(pdx);/afx_data_map(caboutdlg)/afx_data_mapbegin_message_map(caboutdlg, cdialog)/afx_msg_map(caboutdlg)/ no message handlers/afx_msg_mapend_message_map()/ cmydlg dialogcmydlg:cmydlg(cwnd* pparent /*=null*/): cdialog(cmydlg:idd, pparent)/在對(duì)話框的構(gòu)造函數(shù)中初始化成員變量
22、/afx_data_init(cmydlg)/afx_data_init/ note that loadicon does not require a subsequent destroyicon in win32m_hicon = afxgetapp()-loadicon(idr_mainframe); m_pcolumns=new cstringlist; assert(m_pcolumns); m_bsingleport=true; m_nmaxattempts=1; m_pstatuslist=new cptrlist; assert(m_pstatuslist); void cmyd
23、lg:dodataexchange(cdataexchange* pdx) cdialog:dodataexchange(pdx);/afx_data_map(cmydlg)ddx_control(pdx, idc_progress1, m_cprogress);ddx_control(pdx, idc_list1, m_cresult);ddx_control(pdx, idc_ipaddress1, m_cip);ddx_control(pdx, idc_edit4_attempts, m_cattempts);ddx_control(pdx, idc_edit3_single_port_
24、to, m_cportto);ddx_control(pdx, idc_edit2_single_port_from, m_cportfrom);ddx_control(pdx, idc_edit1_single_port, m_csingleport);ddx_control(pdx, idc_button2_stop, m_cbtnstop);ddx_control(pdx, idc_button1_start, m_cbtnscan);/afx_data_mapbegin_message_map(cmydlg, cdialog)/afx_msg_map(cmydlg)on_wm_sysc
25、ommand()on_wm_paint()on_wm_querydragicon()on_bn_clicked(idc_button1_start, onbutton1start)on_bn_clicked(idc_button2_stop, onbutton2stop)on_bn_clicked(idc_button3_save, onbutton3save)on_bn_clicked(idc_radio1_single, onradio1single)on_bn_clicked(idc_radio2_range, onradio2range)/afx_msg_mapend_message_
26、map()/ cmydlg message handlersbool cmydlg:oninitdialog()/設(shè)置按鈕的初始狀態(tài)和列表框的風(fēng)格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-appendmenu(mf_s
27、tring, 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 here/給列表框加標(biāo)題欄 addheader(_t(ip地址); /
28、 加一列標(biāo)題欄字符 addheader(_t(端口號(hào)); addheader(_t(端口狀態(tài)); addheader(_t(嘗試連接次數(shù)); addheader(_t(標(biāo)記); showheaders(); /設(shè)置掃描單個(gè)端口 checkradiobutton(idc_radio1_single,idc_radio2_range,idc_radio1_single); /設(shè)置控件的默認(rèn)狀態(tài) m_csingleport.enablewindow();m_cportfrom.enablewindow(false); m_cportto.enablewindow(false); m_cbtnstop
29、.enablewindow(false); m_cattempts.setwindowtext(_t(1);return true; / return true unless you set the focus to a controlvoid cmydlg:onsyscommand(uint nid, lparam lparam) if (nid & 0xfff0) = idm_aboutbox) caboutdlg dlgabout;dlgabout.domodal();else cdialog:onsyscommand(nid, lparam);/ if you add a minimi
30、ze button 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 cmydlg:onpaint() if (isiconic()cpaintdc dc(this); / device context for paintingsendmessage(wm_iconerasebkgnd, (wpara
31、m) dc.getsafehdc(), 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);elsecdi
32、alog:onpaint();/ the system calls this to obtain the cursor to display while the user drags/ the minimized window.hcursor cmydlg:onquerydragicon() return (hcursor) m_hicon;void cmydlg:onbutton1start() /“掃描”按鈕 / todo: add your control notification handler code herecstring btntxt,ip;uint nsingleport;b
33、yte f1,f2,f3,f4;tchar temp10=0; m_cprogress.setpos(0); m_cresult.deleteallitems(); position p=m_pstatuslist-getheadposition(); while(p) position temp=p; data* pnode=(data*)m_pstatuslist-getnext(p); m_pstatuslist-removeat(temp); if (pnode)/pnode!=null delete pnode; if(m_cip.isblank() messagebox(請(qǐng)輸入主機(jī)
34、ip地址); return; if(m_cip.getaddress(f1,f2,f3,f4)4) messagebox(請(qǐng)輸入有效的ip地址); return; ip=_itoa(f1,temp,10); ip+=_t(.); ip+=_itoa(f2,temp,10); ip+=_t(.); ip+=_itoa(f3,temp,10); ip+=_t(.); ip+=_itoa(f4,temp,10); m_cbtnstop.enablewindow(); m_cbtnscan.enablewindow(false); if(m_bsingleport) cstring port; m_c
35、singleport.getwindowtext(port); m_minport=m_maxport=nsingleport=atoi(port); else cstring port1,port2; m_cportfrom.getwindowtext(port1); m_cportto.getwindowtext(port2); m_minport=atoi(port1); m_maxport=atoi(port2); m_cprogress.setrange32(0,m_maxport-m_minport+1); m_cprogress.setstep(1); if (!m_bsingl
36、eport&m_maxportm_minport) messagebox(_t(您輸入的端口范圍有誤,請(qǐng)重新輸入); return; uint m_nmaxattempts=getdlgitemint(idc_edit4_attempts); for(m_ncounter=m_minport;m_ncounter=m_maxport;m_ncounter+) bool bisopen=false; uint nattempt=1; while(nattemptsetwindowtext(str); str.empty(); bisopen=testconnection(ip,m_ncounte
37、r); if(bisopen) data* pnode=new data; assert(pnode); strcpy(pnode-ipaddress,ip.getbuffer(ip.getlength(); strcpy(pnode-port,_itoa(m_ncounter,temp,10); pnode-bstatus = 1; /open pnode-nattempts=nattempt; m_pstatuslist-addtail(pnode); nattempt+; if (!bisopen) data* pnode=new data; assert(pnode); strcpy(
38、pnode-ipaddress,ip.getbuffer(ip.getlength(); strcpy(pnode-port,_itoa(m_ncounter,temp,10); pnode-bstatus=0; /close pnode-nattempts=nattempt-1; m_pstatuslist-addtail(pnode); msg message; if (:peekmessage(&message,null,0,0,pm_remove) :translatemessage(&message); :dispatchmessage(&message); m_cprogress.
39、stepit(); cstatic* pstatic=(cstatic*)getdlgitem(idc_static_status); pstatic-setwindowtext(cstring)_t(當(dāng)前掃描狀態(tài)); m_cbtnscan.enablewindow(); m_cbtnstop.enablewindow(false); uint nindex=0; position pos=m_pstatuslist-getheadposition(); while(pos) data* pnode=(data*)m_pstatuslist-getnext(pos); additem(nind
40、ex,0,pnode-ipaddress); additem(nindex,1,pnode-port); if (pnode-bstatus) additem(nindex,2,_t(open); additem(nindex,4,_t(*); else additem(nindex,2,_t(close); additem(nindex,4,_t( ); additem(nindex+,3,_itoa(pnode-nattempts,temp,10); void cmydlg:onbutton2stop() /“停止”按鈕 / todo: add your control notificat
41、ion handler code herem_ncounter=m_maxport+1;m_cbtnstop.enablewindow(false);m_cbtnscan.enablewindow();cstatic* pstatic=(cstatic*)getdlgitem(idc_static_status);pstatic-setwindowtext(cstring)_t(當(dāng)前掃描狀態(tài));void cmydlg:onbutton3save() /“保存”按鈕/ todo: add your control notification handler code herecfiledialog
42、* pdlg=new cfiledialog(false,_t(txt),null,ofn_overwriteprompt | ofn_explorer | ofn_longnames,_t(scanned ports files (*.txt),this);assert(pdlg);if (pdlg-domodal()=idok)int nhandle,retval;nhandle=_open(pdlg-getpathname(),_o_binary|_o_creat|_o_trunc|_o_rdwr);if (nhandle=-1)messagebox(_t(unable to open
43、output file to write.),_t(error),mb_ok|mb_iconexclamation);delete pdlg;return;position pos=m_pstatuslist-getheadposition();while(pos)cstring buffer;data* pnode=(data*)m_pstatuslist-getnext(pos);buffer=pnode-ipaddress;buffer+=_t(,);buffer+=pnode-port;buffer+=_t(,);if (pnode-bstatus)buffer+=_t(open);e
44、lsebuffer+=_t(close);buffer+=_t(rn0);retval=_write(nhandle,(void*)buffer.getbuffer(buffer.getlength(), buffer.getlength();if (retval!=buffer.getlength()messagebox(_t(an error occured while writing records.),_t(error),mb_ok | mb_iconexclamation);delete pdlg;return;buffer.empty();_close(nhandle);delete pdlg;void cmydlg:onradio1single() / todo: add your control notification handler code herem_bsingleport=true;m_csingleport.enablewindow();m_cportfrom.enablewindow(false);m_cportto.enablewindow(false);m_cbtnstop.enablewindow(false);
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度教育機(jī)構(gòu)講師團(tuán)隊(duì)合作協(xié)議
- 公司文員勞動(dòng)協(xié)議
- 全球環(huán)境治理項(xiàng)目資金捐贈(zèng)協(xié)議
- 中國(guó)地理讀后感
- 《數(shù)學(xué)競(jìng)賽題庫(kù)設(shè)計(jì)與復(fù)習(xí)教學(xué)教案》
- 大宗商品貿(mào)易管理流程手冊(cè)
- 委托貸款借款合同
- 農(nóng)產(chǎn)品質(zhì)量安全追溯手冊(cè)
- 互聯(lián)網(wǎng)軟件開發(fā)合同協(xié)議
- 綠化工程承包合同協(xié)議
- 2024年精對(duì)苯二甲酸市場(chǎng)分析報(bào)告
- 成人手術(shù)后疼痛評(píng)估與護(hù)理團(tuán)體標(biāo)準(zhǔn)
- 2025年中考數(shù)學(xué)二輪專題復(fù)習(xí) 題型四-二次函數(shù)圖象與性質(zhì)綜合題
- 【數(shù)學(xué)】一元一次方程的應(yīng)用第2課時(shí)盈不足問題課件-2024-2025學(xué)年北師大版數(shù)學(xué)七年級(jí)上冊(cè)
- 不說臟話課件
- 支氣管哮喘的診療課件
- 上海市黃浦區(qū)2022-2023學(xué)年九年級(jí)上學(xué)期期末化學(xué)試卷(一模)
- 競(jìng)聘運(yùn)營(yíng)主管的未來(lái)規(guī)劃
- 中級(jí)消防設(shè)施操作員練習(xí)題庫(kù)含參考答案
- 職業(yè)衛(wèi)生監(jiān)測(cè)與評(píng)價(jià)作業(yè)指導(dǎo)書
- 急性創(chuàng)傷的現(xiàn)場(chǎng)急救和評(píng)估
評(píng)論
0/150
提交評(píng)論