




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告利用c+實(shí)現(xiàn)smtp協(xié)議系 別電子信息系專業(yè)名稱計(jì)算機(jī)科學(xué)與技術(shù)班級(jí)學(xué)號(hào)學(xué)生姓名指導(dǎo)教師成 績(jī)2011年 7月 12日 利用c+實(shí)現(xiàn)smtp協(xié)議1.概述smtp(simple mail transfer protocol)即簡(jiǎn)單郵件傳輸協(xié)議,是一種提供可靠且有效電子郵件傳輸?shù)膮f(xié)議。smtp是建立在ftp文件傳輸服務(wù)上的一種郵件服務(wù),主要用于傳輸系統(tǒng)之間的郵件信息并提供與來(lái)信有關(guān)的通知。smtp目前已是事實(shí)上的在internet傳輸e-mail的標(biāo)準(zhǔn),是一個(gè)相對(duì)簡(jiǎn)單的基于文本的協(xié)議。在其之上指定了一條消息的一個(gè)或多個(gè)接收者(在大多數(shù)情況下被確定是存在的),然后消息文本就傳
2、輸了??梢院芎?jiǎn)單地通過(guò)telnet程序來(lái)測(cè)試一個(gè)smtp服務(wù)器,smtp使用tcp端口25。要為一個(gè)給定的域名決定一個(gè)smtp服務(wù)器,需要使用mx(mail exchange)dns。1.1設(shè)計(jì)題目及實(shí)現(xiàn)目標(biāo)設(shè)計(jì)題目:利用c+實(shí)現(xiàn)smtp協(xié)議;實(shí)現(xiàn)目標(biāo):實(shí)現(xiàn)smtp協(xié)議的基本功能,包括客戶機(jī)的命令與數(shù)據(jù)。1.2開(kāi)發(fā)環(huán)境簡(jiǎn)介 本次開(kāi)發(fā)用visual c+ 6.0作為開(kāi)發(fā)環(huán)境。 vc+是微軟公司開(kāi)發(fā)的一個(gè)ide(集成開(kāi)發(fā)環(huán)境),換句話說(shuō),就是使用c+的一個(gè)開(kāi)發(fā)平臺(tái).有些軟件就是這個(gè)編出來(lái)的.另外還有vb,vf.只是使用不同語(yǔ)言.但是,vc+是windows平臺(tái)上的c+編程環(huán)境,學(xué)習(xí)vc要了解很多w
3、indows平臺(tái)的特性并且還要掌握mfc、atl、com等的知識(shí),難度比較大。windows下編程需要了解windows的消息機(jī)制以及回調(diào)(callback)函數(shù)的原理;mfc是win32api的包裝類,需要理解文檔視圖類的結(jié)構(gòu),窗口類的結(jié)構(gòu),消息流向等等;com是代碼共享的二進(jìn)制標(biāo)準(zhǔn),需要掌握其基本原理等等。vc作為一個(gè)主流的開(kāi)發(fā)平臺(tái)一直深受編程愛(ài)好者的喜愛(ài),但是很多人卻對(duì)它的入門感到難于上青天,究其原因主要是大家對(duì)他錯(cuò)誤的認(rèn)識(shí)造成的,嚴(yán)格的來(lái)說(shuō) vc+不是門語(yǔ)言,雖然它和c+之間有密切的關(guān)系,如果形象點(diǎn)比喻的話,可以c+看作為一種”工業(yè)標(biāo)準(zhǔn)”,而vc+則是某種操作系統(tǒng)平臺(tái)下的”廠商標(biāo)準(zhǔn)”,
4、而”廠商標(biāo)準(zhǔn)”是在遵循”工業(yè)標(biāo)準(zhǔn)”的前提下擴(kuò)展而來(lái)的。vc+應(yīng)用程序的開(kāi)發(fā)主要有兩種模式2.系統(tǒng)設(shè)計(jì)分析2.1 協(xié)議分析smtp 獨(dú)立于特定的傳輸子系統(tǒng),且只需要可靠有序的數(shù)據(jù)流信道支持。 smtp 重要特性之一是其能跨越網(wǎng)絡(luò)傳輸郵件,即“ smtp 郵件中繼”。通常, 一個(gè)網(wǎng)絡(luò)可以由公用互聯(lián)網(wǎng)上 tcp 可相互訪問(wèn)的主機(jī)、防火墻分隔的 tcp/ip 網(wǎng)絡(luò)上 tcp 可相互訪問(wèn)的主機(jī),及其它 lan/wan 中的主機(jī)利用非 tcp 傳輸層協(xié)議組成。使用 smtp ,可實(shí)現(xiàn)相同網(wǎng)絡(luò)上處理機(jī)之間的郵件傳輸,也可通過(guò)中繼器或網(wǎng)關(guān)實(shí)現(xiàn)某處理機(jī)與其它網(wǎng)絡(luò)之間的郵件傳輸。 smtp協(xié)議工作原理smtp是工
5、作在兩種情況下:一是電子郵件從客戶機(jī)傳輸?shù)椒?wù)器:二是從某一個(gè)服務(wù)器傳輸?shù)搅硪粋€(gè)服務(wù)器。smtp也是個(gè)請(qǐng)求/響應(yīng)協(xié)議,命令和響應(yīng)都是基于asc文本,并以cr和lf符結(jié)束。響應(yīng)包括一個(gè)表示返回狀態(tài)的三位數(shù)字代碼。smtp在tcp協(xié)議25號(hào)端口監(jiān)聽(tīng)連續(xù)請(qǐng)求。 連接和發(fā)送過(guò)程如下: (1)建立tcp 連接。 (2)客戶端發(fā)送helo命令以標(biāo)識(shí)發(fā)件人自己的身份,然后客戶端發(fā)送mail命令;服務(wù)器端正希望以ok作為響應(yīng),表明準(zhǔn)備接收。 (3)客戶端發(fā)送rcpt命令,以標(biāo)識(shí)該電子郵件的計(jì)劃接收人,可以有多個(gè)rcpt行;服務(wù)器端則表示是否愿意為收件人接收郵件。 (4)協(xié)商結(jié)束,發(fā)送郵件,用命令data發(fā)送。
6、 (5)以“.”號(hào)表示結(jié)束輸入內(nèi)容一起發(fā)送出去,結(jié)束此次發(fā)送,用quit命令退出。3.程序核心代碼3.1服務(wù)器端相關(guān)代碼:1)、相關(guān)核心代碼如下:/ smtpseverdlg.cpp : implementation file#include stdafx.h#include smtpsever.h#include smtpseverdlg.h#include picture.h#include / csmtpseverdlg message handlersbool csmtpseverdlg:oninitdialog()cdialog:oninitdialog();/ add about.
7、 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_string, idm_aboutbox, straboutmenu);/ set the icon for this dialog. the framework does this automatically/ wh
8、en the applications main window is not a dialogseticon(m_hicon, true);/ set big iconseticon(m_hicon, false);/ set small icon/ todo: add extra initialization hereisdatacontent = false ;isshow = false ;m_listener.setparent(this);m_server.setparent(this);return true; / return true unless you set the fo
9、cus to a controlvoid csmtpseverdlg:onsyscommand(uint nid, lparam lparam)if (nid & 0xfff0) = idm_aboutbox)caboutdlg dlgabout;dlgabout.domodal();elsecdialog:onsyscommand(nid, lparam);void csmtpseverdlg:onaccept()cstring str; str.format(* 收到連接請(qǐng)求); m_list_smtp.insertstring(-1,str);if(m_listener.accept(m
10、_server)str.format(* 建立連接);m_list_smtp.insertstring(-1,str); str = _t(220 simple mail sever ready for mailrn); m_server.send(lpctstr)str,str.getlength();str = _t(s: )+str;m_list_smtp.insertstring(-1,str); m_server.asyncselect(fd_read); elsem_server.close();void csmtpseverdlg:onreceive() char buff655
11、36; char local_host80; int nread; memset(buff,0,65536);/清空緩沖區(qū)接收數(shù)據(jù) nread = m_server.receive(buff, 65536); /根據(jù)讀到的長(zhǎng)度 switch (nread) case 0: m_server.close(); break; case socket_error: if (getlasterror() != wsaewouldblock) afxmessagebox (error occurred); m_server.close(); break; default: buffnread =0; /
12、terminate the string cstring sztemp; if(isdatacontent) while(strstr(buff,rn.rn)=null) str+=buff;memset(buff,0,65536);nread = m_server.receive(buff, 65536); str+=buff;cstring temp ;temp.format(%srnrn,(lpctstr)str.c_str();m_edit_con.setwindowtext(temp);base64_decode(temp);sztemp = _t(250 message accep
13、ted for deliveryrn);m_server.send(sztemp,sztemp.getlength();sztemp = _t(s: )+sztemp;m_list_smtp.insertstring(-1,sztemp);sztemp.empty();isdatacontent=false; if(strnicmp(buff,helo,4)=0) sztemp = buff; sztemp = _t(c: )+sztemp; /m_list_smtp.insertstring(-1,(lpctstr)buff); m_list_smtp.insertstring(-1,(lp
14、ctstr)sztemp); gethostname(local_host,80); sztemp.format(_t(250 ok %srn),local_host); m_server.send(lpctstr)sztemp,sztemp.getlength(); sztemp = _t(s: )+sztemp; m_list_smtp.insertstring(-1,sztemp); sztemp.empty(); if(strnicmp(buff,mail from:,10)=0) sztemp = buff; sztemp = _t(c: )+sztemp; /m_list_smtp
15、.insertstring(-1,(lpctstr)buff); m_list_smtp.insertstring(-1,(lpctstr)sztemp); sztemp = _t(250 sender okrn); m_server.send(sztemp,sztemp.getlength(); sztemp = _t(s: )+sztemp; m_list_smtp.insertstring(-1,sztemp); sztemp.empty(); if(strnicmp(buff,rcpt to:,8)=0) sztemp = buff; sztemp = _t(c: )+sztemp;
16、/m_list_smtp.insertstring(-1,(lpctstr)buff); m_list_smtp.insertstring(-1,(lpctstr)sztemp); sztemp = _t(250 receiver okrn); m_server.send(sztemp,sztemp.getlength(); sztemp = _t(s: )+sztemp; m_list_smtp.insertstring(-1,sztemp); sztemp.empty(); if(strnicmp(buff,data,4)=0) sztemp = buff; sztemp = _t(c:
17、)+sztemp; /m_list_smtp.insertstring(-1,(lpctstr)buff); m_list_smtp.insertstring(-1,(lpctstr)sztemp); sztemp = _t(354 go ahead. end withrn); m_server.send(sztemp,sztemp.getlength(); sztemp = _t(s: )+sztemp; m_list_smtp.insertstring(-1,sztemp); sztemp.empty(); isdatacontent=true; if(strnicmp(buff,quit
18、,4)=0) sztemp = buff; sztemp = _t(c: )+sztemp; /m_list_smtp.insertstring(-1,(lpctstr)buff); m_list_smtp.insertstring(-1,(lpctstr)sztemp); sztemp = _t(221 quit,goodbye !rn); m_server.send(sztemp,sztemp.getlength(); sztemp = _t(s: )+sztemp; m_list_smtp.insertstring(-1,sztemp); isshow = true; if (strni
19、cmp(buff,auth login,10)=0) sztemp = buff; sztemp = _t(c: )+sztemp; /m_list_smtp.insertstring(-1,(lpctstr)buff); m_list_smtp.insertstring(-1,(lpctstr)sztemp); sztemp = _t(334 dxnlcm5hbwu6rn); m_server.send(sztemp,sztemp.getlength(); sztemp = _t(s: )+sztemp; m_list_smtp.insertstring(-1,sztemp); sztemp
20、.empty(); if (strnicmp(buff,bwfu,4)=0) sztemp = buff; sztemp = _t(c: )+sztemp; /m_list_smtp.insertstring(-1,(lpctstr)buff); m_list_smtp.insertstring(-1,(lpctstr)sztemp); sztemp = _t(334 ugfzc3dvcmq6rn); m_server.send(sztemp,sztemp.getlength(); sztemp = _t(s: )+sztemp; m_list_smtp.insertstring(-1,szt
21、emp); sztemp.empty(); if (strnicmp(buff,bgfp,4)=0) sztemp = buff; sztemp = _t(c: )+sztemp; /m_list_smtp.insertstring(-1,(lpctstr)buff); m_list_smtp.insertstring(-1,(lpctstr)sztemp); sztemp = _t(235 authentication successfulrn); m_server.send(sztemp,sztemp.getlength(); sztemp = _t(s: )+sztemp; m_list
22、_smtp.insertstring(-1,sztemp); sztemp.empty(); bool csmtpseverdlg:destroywindow() / todo: add your specialized code here and/or call the base classm_listener.close();m_server.close();return cdialog:destroywindow();void csmtpseverdlg:onclose()m_server.close();cstring str;str.format(listening on port
23、%d, 25);m_list_smtp.insertstring(-1,str); void csmtpseverdlg:onbuttonclose() / todo: add your control notification handler code herem_listener.close();m_server.close();m_list_smtp.insertstring(-1,s: 服務(wù)器關(guān)閉成功);void csmtpseverdlg:onbuttonopen() / todo: add your control notification handler code hereboo
24、l bflag = m_listener.create(25,sock_stream); if(!bflag)if (getlasterror() != wsaewouldblock) tchar szerror256; wsprintf(szerror, socket建立失敗: %d, getlasterror();m_listener.close(); afxmessagebox(szerror);afxmessagebox(wrong);return ;if(!m_listener.listen(1)if (getlasterror() != wsaewouldblock) tchar
25、szerror256; wsprintf(szerror, 監(jiān)聽(tīng)失敗: %d, getlasterror(); m_listener.close(); afxmessagebox(szerror);return ;m_list_smtp.insertstring(-1,* 服務(wù)器準(zhǔn)備好 *);m_list_smtp.insertstring(-1,*);void csmtpseverdlg:onbuttonquit() / todo: add your control notification handler code herem_listener.close();m_server.close
26、();cdialog:destroywindow();/ base64.cpp: implementation of the base64 class.#include stdafx.h#include smtpsever.h#include base64.h#ifdef _debug#undef this_filestatic char this_file=_file_;#define new debug_new#endifbase64:base64()base64:base64()static const std:string base64_chars = abcdefghijklmnop
27、qrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/;std:string base64:base64_encode(const std:string &s) return base64_encode(const unsigned char *)s.c_str(), s.length();/解碼函數(shù)的實(shí)現(xiàn)/std:string base64:base64_decode(unsigned char const* encoded_string, unsigned int in_len) int i = 0; int j = 0; int in_ = 0;
28、unsigned char char_array_44, char_array_33;std:string ret; while (in_len- & ( encoded_stringin_ != =) & is_base64(encoded_stringin_) char_array_4i+ = encoded_stringin_; in_+; if (i =4) for (i = 0; i 4; i+) char_array_4i = base64_chars.find(char_array_4i); char_array_30 = (char_array_40 4); /將六個(gè)字節(jié)和下一
29、個(gè)六字節(jié)的前兩位組成8位解碼 char_array_31 = (char_array_41 & 0xf) 2); char_array_32 = (char_array_42 & 0x3) 6) + char_array_43; for (i = 0; (i 3); i+) ret += char_array_3i; i = 0; if (i)/不足24位緩沖區(qū)的用0補(bǔ)足再解碼 for (j = i; j 4; j+) char_array_4j = 0; for (j = 0; j 4; j+) char_array_4j = base64_chars.find(char_array_4j)
30、; char_array_30 = (char_array_40 4); char_array_31 = (char_array_41 & 0xf) 2); char_array_32 = (char_array_42 & 0x3) 6) + char_array_43; for (j = 0; (j 2; /右移 char_array_41 = (char_array_30 & 0x03) 4); char_array_42 = (char_array_31 & 0x0f) 6); char_array_43 = char_array_32 & 0x3f; for(i = 0; (i 4)
31、; i+) ret += base64_charschar_array_4i; i = 0; if (i) for(j = i; j 2; char_array_41 = (char_array_30 & 0x03) 4); char_array_42 = (char_array_31 & 0x0f) 6); char_array_43 = char_array_32 & 0x3f; for (j = 0; (j i + 1); j+) ret += base64_charschar_array_4j; /這個(gè)字符串是 亂碼把6個(gè)字節(jié)放在8個(gè)字節(jié)的空間里 while(i+ onreceive(
32、);asyncselect(fd_read);casyncsocket:onreceive(nerrorcode);void cserversocket:onclose(int nerrorcode) / todo: add your specialized code here and/or call the base classif (nerrorcode = 0)(csmtpseverdlg*)m_pwnd)-onclose();casyncsocket:onclose(nerrorcode);/ listenersocket.cpp : implementation file/#incl
33、ude stdafx.h#include smtpsever.h#include listenersocket.h#include smtpseverdlg.h#ifdef _debug#define new debug_new#undef this_filestatic char this_file = _file_;#endifclistenersocket:clistenersocket()clistenersocket:clistenersocket()/ do not edit the following lines, which are needed by classwizard.
34、#if 0begin_message_map(clistenersocket, casyncsocket)/afx_msg_map(clistenersocket)/afx_msg_mapend_message_map()#endif/ 0/ clistenersocket member functionsvoid clistenersocket:setparent(cdialog *pwnd)m_pwnd = pwnd;void clistenersocket:onaccept(int nerrorcode) if (nerrorcode = 0)(csmtpseverdlg*)m_pwnd
35、)-onaccept();casyncsocket:onaccept(nerrorcode);3.2客戶端相關(guān)代碼: 1)、相關(guān)核心代碼如下:/ emaildlg.cpp : implementation file#include stdafx.h#include email.h#include emaildlg.h#include .emaillibsmtp.h#include .emaillibmimemessage.h#include setup.h#ifdef _debug#define new debug_new#undef this_filestatic char this_fil
36、e = _file_;#endifstatic tchar _szfilter = text(all files0*.*0text files (*.txt)0*.txt0);/class 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 vo
37、id 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:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(
38、pdx);/afx_data_map(caboutdlg)/afx_data_mapbegin_message_map(caboutdlg, cdialog)/afx_msg_map(caboutdlg)/ no message handlers/afx_msg_mapend_message_map()/ cemaildlg dialogcemaildlg:cemaildlg(cwnd* pparent /*=null*/): cdialog(cemaildlg:idd, pparent)/afx_data_init(cemaildlg)m_to = _t();m_subject = _t()
39、;m_from = _t();m_content = _t();m_cc = _t();m_bcc = _t();/afx_data_init/ note that loadicon does not require a subsequent destroyicon in win32 m_bissetup = false;/m_hicon = afxgetapp()-loadicon(idr_mainframe);m_hicon = afxgetapp()-loadicon(idi_mail);void cemaildlg:dodataexchange(cdataexchange* pdx)c
40、dialog:dodataexchange(pdx);/afx_data_map(cemaildlg)ddx_control(pdx, idc_list_file, m_listbox);ddx_text(pdx, idc_edit_to, m_to);ddx_text(pdx, idc_edit_subject, m_subject);ddx_text(pdx, idc_edit_from, m_from);ddx_text(pdx, idc_edit_content, m_content);ddx_text(pdx, idc_edit_cc, m_cc);ddx_text(pdx, idc
41、_edit_bcc, m_bcc);/afx_data_mapbegin_message_map(cemaildlg, cdialog)/afx_msg_map(cemaildlg)on_wm_syscommand()on_wm_paint()on_wm_querydragicon()on_bn_clicked(idc_button_add_file, onbuttonaddfile)on_bn_clicked(idc_button_send, onbuttonsend)on_bn_clicked(idc_button_setup, onbuttonsetup)/afx_msg_mapend_
42、message_map()/ cemaildlg message handlersbool cemaildlg: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-appendmenu(mf_string, idm_aboutbox, straboutmenu);/ set the icon for this dialog. the fram
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 移動(dòng)工程合同范本
- 裝訂工廠轉(zhuǎn)讓合同范本
- 消防總代合同范本
- 建筑電氣控制技術(shù)趙建偉59課件
- 5.2少年當(dāng)自強(qiáng)(選用)課件- -2024-2025學(xué)年統(tǒng)編版道德與法治九年級(jí)下冊(cè)
- 吉林工程職業(yè)學(xué)院《分子病理學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 呼和浩特職業(yè)學(xué)院《商業(yè)建筑設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 河南省獲嘉縣2024-2025學(xué)年三下數(shù)學(xué)期末復(fù)習(xí)檢測(cè)試題含解析
- 廣州南洋理工職業(yè)學(xué)院《生命科學(xué)前沿專題》2023-2024學(xué)年第二學(xué)期期末試卷
- 云服務(wù)使用成本控制方法
- 電線電纜檢測(cè)報(bào)告模板
- 模具開(kāi)發(fā)管理手冊(cè)
- Q∕SY 06505.13-2016 煉油化工工程儀表自動(dòng)化設(shè)計(jì)規(guī)范 第13部分:儀表防爆及防護(hù)
- 油漆使用登記記錄表
- 【知識(shí)點(diǎn)提綱】新教材-人教版高中化學(xué)必修第一冊(cè)全冊(cè)各章節(jié)知識(shí)點(diǎn)考點(diǎn)重點(diǎn)難點(diǎn)提煉匯總
- 高中語(yǔ)文基礎(chǔ)知識(shí)手冊(cè)薛金星
- 輪轂電機(jī)驅(qū)動(dòng)電動(dòng)車懸架和轉(zhuǎn)向系統(tǒng)設(shè)計(jì)與性能匹配
- 二年級(jí)第二學(xué)期體育知識(shí)結(jié)構(gòu)圖
- CASS勘測(cè)定界操作指導(dǎo)方案
- 中國(guó)商品條碼系統(tǒng)注冊(cè)登記表規(guī)范填寫
- 湘科教版小學(xué)信息技術(shù)四年級(jí)下冊(cè)全冊(cè)教案.doc
評(píng)論
0/150
提交評(píng)論