




已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
SMTP郵件服務(wù)器實(shí)驗(yàn)1. 實(shí)驗(yàn)內(nèi)容和實(shí)驗(yàn)環(huán)境描述實(shí)驗(yàn)任務(wù):使用Socket API編寫一個(gè)SMTP郵件服務(wù)器程序?qū)嶒?yàn)內(nèi)容:1)作為SMTP服務(wù)器,接收郵件客戶端程序的TCP連接請求,接收SMTP命令和郵件數(shù)據(jù),將郵件保存在文件中; 2)作為SMTP客戶端,建立到實(shí)際郵件服務(wù)器的TCP連接,發(fā)送SMTP命令,將保存的郵件發(fā)送給實(shí)際郵件服務(wù)器; 3)提供郵件差錯(cuò)報(bào)告:將實(shí)際郵件服務(wù)器的差錯(cuò)報(bào)告轉(zhuǎn)發(fā)給郵件客戶端軟件; 4)支持一封郵件多個(gè)接收者,要求接收者屬于不同的域(如、163.com、,); 5)提供發(fā)件人和收件人Email地址格式檢查功能,例如下列郵件地址是錯(cuò)誤的:chengli,chengli,, . 。實(shí)驗(yàn)環(huán)境:Microsoft Visual Studio 20102. 軟件設(shè)計(jì)(1) 數(shù)據(jù)結(jié)構(gòu):char mail_from4096;/存發(fā)件地址char rcpt_to54096;/存收件地址char data4096;/存Datachar imf4096;/存郵件標(biāo)準(zhǔn)格式WORD A;/加載套接字庫WSADATA B;/儲(chǔ)存調(diào)用WSAStartup函數(shù)返回的Windows Sockets初始化信息int err;/報(bào)錯(cuò)標(biāo)志SOCKET sockSrv;/創(chuàng)建用于監(jiān)聽客戶端的套接字SOCKADDR_IN addrSrv;/作為服務(wù)器端的socket地址char recvBuf4096=;/接收客戶端SMTP指令(2) 模塊結(jié)構(gòu):1main();/服務(wù)器端,用于從客戶端接收儲(chǔ)存郵件2main_clicenet(SOCKET s);/客戶端,用于將收到的郵件轉(zhuǎn)發(fā)到郵件服務(wù)器,同時(shí)將郵件服務(wù)器的錯(cuò)誤報(bào)告通過SOCKET s轉(zhuǎn)發(fā)給客戶端3 ValidEmail(char *addr);/收發(fā)件地址(addr)合法性監(jiān)測(3) 算法流程:畫出流程圖,描述算法的主要流程。Main()Load Windows Sockets;創(chuàng)建用于監(jiān)聽的socket;綁定socket和sockaddr;將socket設(shè)為監(jiān)聽模式;While(1)請求隊(duì)列非空則抽取第一個(gè)鏈接建立連接;打開郵件儲(chǔ)存文件;Send:220 recv:EHLO ; Send:250 OK recv:MAIL FROM: T 發(fā) 件 地址 合 法 FSend:550 Invalid User ; continueSend:250 OK recv: RCPT TO:;檢查合法性While(recv!=DATA)recv: RCPT TO:;檢查合法性Send:250 OKRecv:DATAsend:354 Start mail input;end with .rn recv: DATA fragment, .bytesSend:250 recv:IMF; send 250 recv: . Send:QUIT調(diào)用客戶端程序關(guān)閉套接字關(guān)閉文件指針釋放分配的套接字資源(4) 主要功能模塊的實(shí)現(xiàn)要點(diǎn)1main();/服務(wù)器端,用于從客戶端接收儲(chǔ)存郵件實(shí)現(xiàn)要點(diǎn):與客戶端建立連接,根據(jù)SMTP協(xié)議標(biāo)準(zhǔn)進(jìn)行通信。2main_clicenet(SOCKET s);/客戶端,用于將收到的郵件轉(zhuǎn)發(fā)到郵件服務(wù)器,同時(shí)將郵件服務(wù)器的錯(cuò)誤報(bào)告通過SOCKET s轉(zhuǎn)發(fā)給客戶端實(shí)現(xiàn)要點(diǎn):與服務(wù)器端建立連接,根據(jù)SMTP協(xié)議標(biāo)準(zhǔn)進(jìn)行通信。3 ValidEmail(char *addr);/收發(fā)件地址(addr)合法性監(jiān)測實(shí)現(xiàn)要點(diǎn):根據(jù)標(biāo)準(zhǔn)email地址格式進(jìn)行合法性監(jiān)測3 實(shí)驗(yàn)結(jié)果演示及分析(1) 對于你所實(shí)現(xiàn)的功能,逐個(gè)進(jìn)行測試,并將輸出截圖。普通郵件群發(fā): 1 2 34錯(cuò)誤報(bào)告:12(2) 你的程序是否提供了差錯(cuò)處理功能?可以對哪些差錯(cuò)進(jìn)行處理?1 將實(shí)際郵件服務(wù)器的差錯(cuò)報(bào)告轉(zhuǎn)發(fā)給郵件客戶端軟件;2監(jiān)測收發(fā)件郵箱地址格式是否正確(3) 和課堂上學(xué)習(xí)的SMTP協(xié)議相比,你的程序是否完全按照協(xié)議來實(shí)現(xiàn),是否有不同之處?和實(shí)際的SMTP服務(wù)器相比,你的程序有哪些優(yōu)點(diǎn)和不足?不是。因?yàn)閙ain函數(shù)無法從客戶端收取用戶名和密碼,故跳過AUTH LOGIN部分,直接開始MAILFROM:。優(yōu)點(diǎn):代碼功能較為簡潔易懂。不足:未實(shí)現(xiàn)用戶合法性監(jiān)測。以及收發(fā)件郵箱地址是否實(shí)際存在。4 實(shí)驗(yàn)總結(jié)和心得體會(huì)描述你在調(diào)試過程中都遇到了哪些問題和解決的過程。(1) 完成本次實(shí)驗(yàn)的實(shí)際上機(jī)調(diào)試時(shí)間是多少? 14hours。(2) 編程工具方面遇到了哪些問題?包括Windows環(huán)境和VC軟件的安裝問題。沒。(3) 編程語言方面遇到了哪些問題?包括C語言使用和對C語言操控能力上的問題。涉及到Socket方面的函數(shù)由于初次接觸使用尚不熟練。(4) 協(xié)議方面遇到了哪些問題?包括協(xié)議機(jī)制的設(shè)計(jì)錯(cuò)誤,發(fā)現(xiàn)協(xié)議死鎖,或者不能正確工作,協(xié)議參數(shù)的調(diào)整等問題。協(xié)議中提供的郵件域名解析指令被大部分郵件服務(wù)器屏蔽,只能通過其他函數(shù)編碼實(shí)現(xiàn)相應(yīng)功能。(5) 通過本次試驗(yàn),你認(rèn)為SMTP協(xié)議有哪些不足?有何改進(jìn)思路?功能較為基礎(chǔ),但擴(kuò)展改進(jìn)等已有SSL,X2.5等增強(qiáng)版本存在。(6) 總結(jié)本次實(shí)驗(yàn),你在C 語言方面,協(xié)議軟件方面,理論學(xué)習(xí)方面,軟件工程方面等哪些方面上有所提高?熟悉了C語言的編碼規(guī)范,通信協(xié)議的工作機(jī)制。5 源程序清單#pragma comment(lib,wsock32.lib) #include#include#include#includechar mail_from4096;char rcpt_to54096;char data4096;char imf4096;void main_Client(SOCKET);int ValidEmail(char*);void main()WORD A = MAKEWORD(1,1); /加載套接字庫WSADATA B; /儲(chǔ)存調(diào)用WSAStartup函數(shù)返回的Windows Sockets初始化信息int err;err=WSAStartup(A,&B); /根據(jù)A要求的版本初始化Winsock服務(wù)if(err!=0) / Tell the user that we couldnt find a useable / winsock.dll. return;if (LOBYTE(B.wVersion)!=1|HIBYTE(B.wVersion)!=1) WSACleanup( ); /檢查socket版本,不符合則釋放分配資源return;SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); /創(chuàng)建用于監(jiān)聽客戶端的套接字SOCKADDR_IN addrSrv;/作為服務(wù)器端的socket地址addrSrv.sin_addr.S_un.S_addr=inet_addr();/ Internet address addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(25); /服務(wù)器端端口號(hào)bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR); /綁定套接字listen(sockSrv,5); /將套接字設(shè)為監(jiān)聽模式,準(zhǔn)備接受客戶請求SOCKADDR_IN addrClient; /客戶端地址int len=sizeof(SOCKADDR);char *sendBuf=220 LXs SMTP Readyrn,250 LXs server|250 mail|250 PIPELININGrn,250 OKrn,250 OKrn,354 Start mail input;end with .rn,250 OKrn,250 OKrn,QUITrn,550 Invalid Userrn; /發(fā)送標(biāo)示符char tempbuf14096=;while(1) /等待客戶請求SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); /隊(duì)列非空則sockSrv抽取第一個(gè)鏈接,否則阻塞調(diào)用進(jìn)程FILE *fp;fp=fopen(d:Universitymail.txt,w+); char recvBuf4096=; /接收客戶端SMTP指令memset(rcpt_to,0,sizeof(rcpt_to);send(sockConn,sendBuf0,strlen(sendBuf0),0); /向已經(jīng)連接的套接字sockConn發(fā)送連接建立信息:220recv(sockConn,recvBuf,sizeof(recvBuf),0); /接收數(shù)據(jù) EHLO acer-PCfprintf(fp,%sn,recvBuf); /將數(shù)據(jù)寫入文件memset(recvBuf,0,sizeof(recvBuf); /將recvBuf前4096個(gè)字節(jié)用字符0替換send(sockConn,sendBuf1,strlen(sendBuf1),0); / send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv:MAIL FROM:if(ValidEmail(recvBuf)send(sockConn,sendBuf8,strlen(sendBuf8),0);closesocket(sockConn); fclose(fp); continue; /send:550memcpy(mail_from,recvBuf,sizeof(recvBuf); fprintf(fp,%sn,recvBuf); memset(recvBuf,0,sizeof(recvBuf);send(sockConn,sendBuf2,strlen(sendBuf2),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv: RCPT TO:if(ValidEmail(recvBuf)send(sockConn,sendBuf8,strlen(sendBuf8),0);closesocket(sockConn); fclose(fp); continue; /send:550 memcpy(rcpt_to0,recvBuf,sizeof(recvBuf); fprintf(fp,%sn,recvBuf); memset(recvBuf,0,sizeof(recvBuf); send(sockConn,sendBuf2,strlen(sendBuf2),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0);/recv:?int i=1;strncpy(tempbuf1,recvBuf,4);while(strcmp(tempbuf1,RCPT)=0)&(i5)if(ValidEmail(recvBuf)send(sockConn,sendBuf8,strlen(sendBuf8),0);closesocket(sockConn); fclose(fp); continue;/send:550 memcpy(rcpt_toi,recvBuf,sizeof(recvBuf); fprintf(fp,%sn,recvBuf);memset(recvBuf,0,sizeof(recvBuf);send(sockConn,sendBuf2,strlen(sendBuf2),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv: RCPT TO:strncpy(tempbuf1,recvBuf,4);+i;fprintf(fp,%sn,recvBuf);memset(recvBuf,0,sizeof(recvBuf); send(sockConn,sendBuf4,strlen(sendBuf4),0);/send:354 Start mail input;end with .rnrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv:DATA fragment, .bytesmemcpy(data,recvBuf,sizeof(recvBuf); fprintf(fp,%sn,recvBuf); memset(recvBuf,0,sizeof(recvBuf); send(sockConn,sendBuf5,strlen(sendBuf5),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv:IMFmemcpy(imf,recvBuf,sizeof(recvBuf);fprintf(fp,%sn,recvBuf); memset(recvBuf,0,sizeof(recvBuf);send(sockConn,sendBuf6,strlen(sendBuf6),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv: . fprintf(fp,%sn,recvBuf);memset(recvBuf,0,sizeof(recvBuf);send(sockConn,sendBuf7,strlen(sendBuf7),0); /send:QUITfprintf(fp,%sn,recvBuf);main_Client(sockConn); /調(diào)用客戶端函數(shù)closesocket(sockConn); /關(guān)閉套接字fclose(fp); /關(guān)閉文件指針WSACleanup(); /釋放分配資源void main_Client(SOCKET sockCo)WORD A=MAKEWORD(1,1); WSADATA B; int err; err=WSAStartup(A,&B); if(err!=0)return; if(LOBYTE(B.wVersion)!=1|HIBYTE(B.wVersion)!=1)WSACleanup();return;SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrClient; addrClient.sin_family = AF_INET; addrClient.sin_port = htons(25); struct hostent *host; /主機(jī)信息host = gethostbyname(); memcpy(&addrClient.sin_addr.S_un.S_addr,host-h_addr_list0,host-h_length); /將獲取的主機(jī)IP地址復(fù)制到客戶端網(wǎng)絡(luò)地址.32位無符號(hào)IPV4地址 connect(sockClient,(SOCKADDR*)&addrClient,sizeof(SOCKADDR); /連接套接字 char *SendBuf = EHLO rn, AUTH LOGINrn, Z3VhaWRhbzIyrn,/郵箱名的Base64編碼THVuYVhUSjkyMTAxNA=rn,/密碼的Base64編碼DATArn, rn.rn,QUIT; char arecvBuf4096 = ; char tempbuf3=;memset(tempbuf,0,sizeof(tempbuf); memset(arecvBuf, 0, sizeof(arecvBuf); /初始化arecvBufrecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:220 OKmemset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf0, strlen(SendBuf0), 0); /send:EHLO acer_PCrecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:250 OKstrncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,250)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf1, strlen(SendBuf1), 0); /send:AUTH LOGINrecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:334strncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,334)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf2, strlen(SendBuf2), 0); /send:Z3VhaWRhbzIyrecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:334strncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,334)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf3, strlen(SendBuf3), 0); /send:THVuYVhUSjkyMTAxNA=recv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /rec:235strncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,235)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, mail_from, strlen(mail_from), 0); /send:MAIL FROM:recv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:250 OKstrncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,250)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);int i=0;while(rcpt_toi0!=0)&(i5)memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, rcpt_toi, strlen(rcpt_toi), 0); /send:RCPT TO:recv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:250 OKstrncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,250)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);+i;memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf4, strlen(SendBuf4), 0); /send: DATArecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:354strncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,354)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, data, strlen(data), 0); /send:DATA fragment, .bytesmemset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, imf, strlen(imf), 0); /send:imf fragmentmemset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf5, strlen(SendBuf5), 0); /send: . recv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:250 OKstrncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,250)!=0)send(sockCo,arecvBuf,strlen(arec
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 德城區(qū)中考題目數(shù)學(xué)試卷
- 各市中考數(shù)學(xué)試卷
- 肛腸外科便秘課件
- 鼓樓一年級(jí)下數(shù)學(xué)試卷
- 二手高中數(shù)學(xué)試卷
- 肉牛養(yǎng)殖技術(shù)課件視頻
- 2025年06月廣東東莞市泗安醫(yī)院招聘臨床人員(門診部皮膚科醫(yī)師和醫(yī)療美容科醫(yī)師)考試總筆試歷年專業(yè)考點(diǎn)(難、易錯(cuò)點(diǎn))附帶答案詳解
- 2025至2030船體清潔機(jī)器人行業(yè)市場深度研究及發(fā)展前景投資可行性分析報(bào)告
- 2025至2030充氣袋行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 2025至2030廣告策劃行業(yè)市場深度調(diào)研及前景趨勢與投資報(bào)告
- 中國支付體系行業(yè)市場運(yùn)行現(xiàn)狀及投資規(guī)劃建議報(bào)告
- 2025年蘇州市中考?xì)v史試卷真題(含標(biāo)準(zhǔn)答案及解析)
- 醫(yī)院后勤禮儀培訓(xùn)課件
- 《咕咚》課件 小學(xué)語文一年級(jí)下冊
- 小學(xué)二年級(jí)下冊豎式計(jì)算題400道
- LS-T8014-2023高標(biāo)準(zhǔn)糧倉建設(shè)標(biāo)準(zhǔn)
- 小兒心力衰竭的護(hù)理查房
- TCSTM00829-2022鋼軌自動(dòng)渦流檢測系統(tǒng)綜合性能測試方法
- 2025年美術(shù)教師編制考試模擬試卷:美術(shù)教育心理學(xué)在課堂管理中的應(yīng)用試題
- 農(nóng)村商業(yè)銀行貸款協(xié)議書
- DB62T 3081-2022 綠色建筑工程驗(yàn)收標(biāo)準(zhǔn)
評論
0/150
提交評論