課程設(shè)計(jì)論文郵件收發(fā)器_第1頁
課程設(shè)計(jì)論文郵件收發(fā)器_第2頁
課程設(shè)計(jì)論文郵件收發(fā)器_第3頁
課程設(shè)計(jì)論文郵件收發(fā)器_第4頁
課程設(shè)計(jì)論文郵件收發(fā)器_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

..計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院課程設(shè)計(jì)〔論文報(bào)告__學(xué)號:專業(yè):網(wǎng)絡(luò)工程班級:設(shè)計(jì)題目:郵件收發(fā)器20XX6月..1緒論1.1電子郵件的發(fā)展歷程電子郵件由英文electronicmail或e.mail翻譯而來,它表示通過電子通訊系統(tǒng)進(jìn)行信件的書寫、發(fā)送和接收。作為互聯(lián)網(wǎng)上最受歡迎的功能之一,電子郵件系統(tǒng)可以為世界上任何一個(gè)網(wǎng)絡(luò)用戶傳遞信息,內(nèi)容包括文字、圖像、聲音、視頻等。同時(shí),如果用戶愿意,通過電子郵件可以得到大量免費(fèi)的新聞、專題郵件,并實(shí)現(xiàn)輕松的信息搜索,這是傳統(tǒng)郵件無法比擬的。電子郵件發(fā)明于1971年,當(dāng)時(shí)已經(jīng)存在可傳輸文件的電腦程序以及一種原始的信息程序。但這兩個(gè)程序存在局限性,發(fā)信方只能給接收方發(fā)送公報(bào),且接收方的電腦必須與發(fā)送方一致。雷餳姆林森<RayTomlinson>在已有的傳輸文件程序以及信息程序的基礎(chǔ)上,研制出一套全新的文件信息傳輸程序,可以通過電腦網(wǎng)絡(luò)發(fā)送和接收文件信息。為讓人們都擁有容易識別的電子郵箱地址,湯姆林森采用了符號,符號前面加用戶名,后面是用戶郵箱所在的地址,即useraddress的形式表示用戶郵箱地址,這標(biāo)志著電子郵件的誕生。當(dāng)時(shí),湯姆林森所在的企業(yè)受聘于美國軍方,參與Arpanet網(wǎng)絡(luò)的建設(shè)和維護(hù)工作。雖然電子郵件在1970年代發(fā)明,卻是在1980年代興起。由于1970年代使用Arpanet網(wǎng)絡(luò)的人較少,網(wǎng)速較慢,用戶只能發(fā)送簡短的信息,這限制了電子郵件的使用;到1980年代中期,個(gè)人電腦及Internet的興起,電子郵件開始傳播開來;1990年代中期,互聯(lián)網(wǎng)瀏覽器誕生,全球網(wǎng)民人數(shù)激增,電子郵件開始被廣泛使用。電子郵件系統(tǒng)經(jīng)過三十多年的發(fā)展,目前主要有三種系統(tǒng)類型:<1>免費(fèi)郵箱大多數(shù)網(wǎng)民都有電子郵箱,這種方式投資少,免維護(hù),但每天需要處理大量的郵件,導(dǎo)致郵件的收發(fā)速度受到限制,且無法保證郵箱的安全性和服務(wù)質(zhì)量。因此免費(fèi)郵箱只能作為簡單應(yīng)用,不適合用于交流重要的、需要保密的信息。<2>收費(fèi)郵箱收費(fèi)電子郵箱一般比免費(fèi)郵箱安全、穩(wěn)定、收發(fā)速度快,而且具有郵件殺毒、郵件到達(dá)通知、手機(jī)收發(fā)郵件等功能。但對于企業(yè)來說,每個(gè)員工可能使用不同的郵箱域名,影響企業(yè)形象且不能對郵箱服務(wù)器進(jìn)行管理,無法根據(jù)企業(yè)實(shí)際需要對郵件系統(tǒng)進(jìn)行改進(jìn)及擴(kuò)展。<3>自建郵箱系統(tǒng)隨著網(wǎng)絡(luò)化進(jìn)程的進(jìn)一步發(fā)展,大多企業(yè)或高校建立了自己的電子郵件系統(tǒng)。單位將企業(yè)名作為服務(wù)器域名。這樣,每個(gè)企業(yè)員工具有使用相同的郵箱服務(wù)器,有利于宣傳企業(yè)形象并可以對郵件服務(wù)器進(jìn)行管理,并提供較好的安全性。目前郵箱服務(wù)器主要基于Windows操作系統(tǒng)或Unix操作系統(tǒng),雖然Windows平臺界面友好,操作方便,但基于Windows平臺的郵件系統(tǒng)一般為商業(yè)性軟件,源碼保密,不便于對其進(jìn)行二次開發(fā);Unix平臺下雖然有開放的郵件系統(tǒng)源碼,但管理復(fù)雜,要求管理員深入了解電子郵件系統(tǒng)原理,并具備豐富的Unix平臺開發(fā)經(jīng)驗(yàn)。因此,本文自主開發(fā)了電子郵件收發(fā)器,它屬于自建郵箱系統(tǒng)但自主研發(fā)。此郵件系統(tǒng)不僅可以實(shí)現(xiàn)以局域網(wǎng)為基礎(chǔ)的單位內(nèi)部電子郵件傳遞,也能通過Intemet和外部進(jìn)行信息交流。同時(shí),還可根據(jù)互聯(lián)網(wǎng)的發(fā)展,隨時(shí)對郵件系統(tǒng)進(jìn)行升級與改造,使之更符合單位內(nèi)部的發(fā)展需要1.2電子郵件簡介電子郵件系統(tǒng)工作在TCP/lP協(xié)議的應(yīng)用層,采用客戶端/服務(wù)器模式,通過客戶端與服務(wù)器的相互通信實(shí)現(xiàn)郵件傳遞。它由兩部分組成:MUA<用戶代理>和MTA<郵件傳輸代理>。它的傳輸過程如圖所示:在圖中,MUA為用戶提供讀寫郵件界面,也就是常說的客戶端;MTA運(yùn)行在郵件服務(wù)器上,負(fù)責(zé)郵件的完整的傳遞過程,主要包括SMTP、POP3和MDA三部分。MDA負(fù)責(zé)將收件人是本地用戶的郵件投遞到用戶郵箱中;而SMTP和POP3負(fù)責(zé)郵件的傳遞和收件人從服務(wù)器上收取郵件的功能,本文在第二章對它們進(jìn)行了詳細(xì)介紹。用戶使用MUA發(fā)送編寫好郵件后,利用SMTP協(xié)議發(fā)送給自己的MTA。MTA對郵件的收件人進(jìn)行判斷,如果是本地用戶則將郵件轉(zhuǎn)給MDA.由它將郵件投遞到收件人郵箱;如果用戶是其它服務(wù)器用戶,MTA則連接收件人的MTA,利用SMTP協(xié)議將郵件轉(zhuǎn)發(fā),再由收件人的MDA進(jìn)行投遞。最后收件人使用MLTA利用POP3協(xié)議將郵件收取到本地主機(jī)上。在郵件傳遞過程中,郵箱地址是必不可少的元素,它表明了郵件的起始與目的地址。完整的郵件地址為:用戶名域名。用戶名是用戶在服務(wù)器上的標(biāo)識,服務(wù)器通過用戶名來識別的具體郵箱;而域名則是郵箱所屬的服務(wù)器的域名,其它服務(wù)器可以通過這個(gè)域名查詢到服務(wù)器的m地址;符號是專門用來表示郵箱地址的特殊符號,它代表"at"的意思。這三部分組合在一起成為郵箱在Interact上的唯一標(biāo)識。1.3電子郵件主要協(xié)議<1>SMTP協(xié)議SMTP為簡單郵件傳輸協(xié)議,主要保證電子郵件能夠可靠和高效地傳送。SMTP主要應(yīng)用在兩種情況:一是電子郵件從客戶端傳輸?shù)椒?wù)器;二是郵件從一個(gè)服務(wù)器轉(zhuǎn)發(fā)到另一個(gè)服務(wù)器。當(dāng)收信人和發(fā)信人在同一個(gè)網(wǎng)絡(luò)上時(shí),SMTP服務(wù)器把郵件直傳發(fā)送給收信人信箱;當(dāng)雙方不在同一個(gè)網(wǎng)絡(luò)上時(shí),發(fā)信方的SMTP服務(wù)器作客戶端,將郵件發(fā)送給收信入所在網(wǎng)絡(luò)的SMTP郵件服務(wù)器。SMTP協(xié)議的基本命令有7個(gè)1101,分別為:HELO、MAIL,RCPT,DATA,REST,NOOP和QUIT等??蛻舳讼蚍?wù)器發(fā)送郵件時(shí),首先向SMTP服務(wù)器提出連接請求,服務(wù)器接受此客戶端連接后,雙發(fā)可以開始通信。以下是對SMTP命令的一些介紹:HELO向服務(wù)器標(biāo)識用戶身份。發(fā)送者能欺騙,說謊,但一般情況下服務(wù)器都能檢測到。EHLO向服務(wù)器標(biāo)識用戶身份。發(fā)送者能欺騙,說謊,但一般情況下服務(wù)器都能檢測到。.MAILFROM命令中指定的地址是發(fā)件人地址RCPTTO標(biāo)識單個(gè)的郵件接收人;可有多個(gè)RCPTTO;常在MAIL命令后面。DATA在單個(gè)或多個(gè)RCPT命令后,表示所有的郵件接收人已標(biāo)識,并初始化數(shù)據(jù)傳輸,以CRLF.CRLF結(jié)束VRFY用于驗(yàn)證指定的用戶/郵箱是否存在;由于[url=javascript:;安全[/url]

方面的原因,服務(wù)器常禁止此命令EXPN驗(yàn)證給定的郵箱列表是否存在,擴(kuò)充郵箱列表,也常被禁用HELP查詢服務(wù)器支持什么命令NOOP無操作,服務(wù)器應(yīng)響應(yīng)OKRSET重置會話,當(dāng)前傳輸被取消QUIT結(jié)束會話<2>POP3協(xié)議電子郵件系統(tǒng)中,常采取用戶代理<UA>方式實(shí)現(xiàn)郵件發(fā)送和接收,而使用郵件傳輸系統(tǒng)<MTs>為用戶提供郵箱服務(wù)。POP是用戶和郵件服務(wù)器之間收取郵件的協(xié)議,全稱為PostOfficeProtocol,是基于TCP協(xié)議的應(yīng)用層協(xié)議,通信端口號為110?,F(xiàn)在普遍使用的是POP協(xié)議第三版,即POP3協(xié)議。POP3協(xié)議采用C/S工作模式,即客戶/服務(wù)器模式。提供POP3服務(wù)的主機(jī)稱為POP3服務(wù)器,請求POP3服務(wù)的主杌稱為POP3客戶機(jī)。服務(wù)器首先為每個(gè)郵箱建立一個(gè)帳戶,每個(gè)帳戶由用戶名和密碼構(gòu)成。郵箱內(nèi)保存此帳戶的未讀郵件,客戶端通過POP3協(xié)議從郵箱內(nèi)收取郵件后在本地機(jī)上進(jìn)行處理,因此POP3是一個(gè)脫機(jī)協(xié)議。郵件被客戶機(jī)取走后即被刪除,服務(wù)器上不保留郵件各份。客戶機(jī)在和服務(wù)器通信前,首先建立連接,然后依次向服務(wù)器發(fā)送命令。POP3協(xié)議包含12條命令,并包含三種狀態(tài),即認(rèn)證狀態(tài)<AuthorizationState>、處理狀態(tài)<TransactionState>和更新狀態(tài)<UpdateState>,不同的命令帶有不同的參數(shù),適用于不同襖態(tài)??蛻舳送ㄟ^向服務(wù)器發(fā)送命令請求服務(wù),如果此請求符合當(dāng)前服務(wù)狀態(tài)并且語法正確,則服務(wù)器接受此請求,返回一條正確信息,此信息以"+OK"開頭,后面是服務(wù)器相應(yīng)的響應(yīng)信息;如果請求命令語法錯(cuò)誤或不符合當(dāng)前服務(wù)狀態(tài),則返回錯(cuò)誤信息,以"-ERR"開頭。后面是相應(yīng)的錯(cuò)誤描述信息。以下是POP3命令及參數(shù):USERusername認(rèn)證用戶名PASSpassword認(rèn)證密碼認(rèn)證,認(rèn)證通過則狀態(tài)轉(zhuǎn)換APOPname,digest認(rèn)可一種安全傳輸口令的辦法,執(zhí)行成功導(dǎo)致狀態(tài)轉(zhuǎn)換請參見RFC1321。STAT處理請求server回送郵箱統(tǒng)計(jì)資料,如郵件數(shù)、郵件總字節(jié)數(shù)UIDLn處理server返回用于該指定郵件的唯一標(biāo)識,如果沒有指定,返回所有的。LISTn處理server返回指定郵件的大小等RETRn處理server返回郵件的全部文本DELEn處理server標(biāo)記刪除,QUIT命令執(zhí)行時(shí)才真正刪除RSET處理撤消所有的DELE命令TOPn,m處理返回n號郵件的前m行內(nèi)容,m必須是自然數(shù)NOOP處理server返回一個(gè)肯定的響應(yīng)QUIT希望結(jié)束會話。如果server處于"處理"狀態(tài),則現(xiàn)在進(jìn)入"更新"狀態(tài),刪除那些標(biāo)記成刪除的郵件。如果server處于"認(rèn)可"狀態(tài),則結(jié)束會話時(shí)server不進(jìn)入"更新"狀態(tài)。2工具技術(shù)介紹VisualC++6.0,簡稱VC或者VC6.0,是微軟推出的一款C++編譯器,將"高級語言"翻譯為"機(jī)器語言〔低級語言"的程序。VisualC++是一個(gè)功能強(qiáng)大的可視化軟件開發(fā)工具。自1993年Microsoft公司推出VisualC++1.0后,隨著其新版本的不斷問世,VisualC++已成為專業(yè)程序員進(jìn)行軟件開發(fā)的首選工具。雖然微軟公司推出了VisualC++.NET<VisualC++7.0>,但它的應(yīng)用的很大的局限性,只適用于Windows2000、WindowsXP和WindowsNT4.0。所以實(shí)際中,更多的是以VisualC++6.0為平臺。VisualC++6.0由Microsoft開發(fā),它不僅是一個(gè)C++編譯器,而且是一個(gè)基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境〔integrateddevelopmentenvironment,IDE。VisualC++6.0由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lassWizard等開發(fā)工具。這些組件通過一個(gè)名為DeveloperStudio的組件集成為和諧的開發(fā)環(huán)境。Microsoft的主力軟件產(chǎn)品?,F(xiàn)在的最新版C++編譯器集合在MicrosoftVisualStudio2010軟件里面,包含C++,Visualbasic,C#,J#,.net。等,其中,VC開發(fā)環(huán)境的版本已經(jīng)升級至MicrosoftVisualC++2010,對C++的支持更加全面穩(wěn)定,建議電腦性能好的可以使用此版本。3需求分析3.1穩(wěn)定性軟件最重要的性能就是它的穩(wěn)定性。本軟件在Windows操作系統(tǒng)下使用VisualC++軟件進(jìn)行編寫,保證的平臺的穩(wěn)定性??蛻舳藢︵]件的所有處理都是在網(wǎng)絡(luò)連接建立之前進(jìn)行的,在發(fā)送郵件時(shí)只是簡單的從文件中讀取并發(fā)送,無需對郵件進(jìn)行任何處理。這樣簡化了發(fā)送過程,縮短了網(wǎng)絡(luò)連接時(shí)間,避免了發(fā)送郵件時(shí)要解決郵件格式和內(nèi)容錯(cuò)誤的問題,減少了網(wǎng)絡(luò)出錯(cuò)的機(jī)率。而服務(wù)器將收取到的郵件存儲在本地硬盤臨時(shí)文件夾中,只有在郵件投遞到用戶的郵箱、成功轉(zhuǎn)發(fā)或在指定次數(shù)內(nèi)無法轉(zhuǎn)發(fā)的情況下才刪除,這就保證了郵件不會丟失。3.2兼容性SMTP電子郵件系統(tǒng)應(yīng)該與目前廣泛使用的各種客戶端軟件及郵件服務(wù)器系統(tǒng)相兼容。具體的要求是:·SMTP客戶端發(fā)送的郵件應(yīng)該可以被其他郵件客戶端軟件解析并正確顯示;-SMTP客戶端可以向現(xiàn)在被廣泛使用的郵件服務(wù)器發(fā)送郵件;·SMTP服務(wù)器可以接收任何客戶端發(fā)送的郵件;·SMTP服務(wù)器能夠?qū)⑧]件正確投遞或者將收件人不是本地用戶的郵件轉(zhuǎn)發(fā)給目的服務(wù)器。3.3易于維護(hù)及修改每個(gè)功能設(shè)計(jì)成獨(dú)立的模塊進(jìn)行編寫程序,模塊之間關(guān)聯(lián)性很小,系統(tǒng)的整體設(shè)計(jì)簡潔、清晰。這使得軟件有良好的可讀性和可移植性,特別是方便了以后對軟件進(jìn)行修改、維護(hù)和升級,即使要改變或增減系統(tǒng)的某些功能,也不需要重新編寫整個(gè)程序,只需對該功能相應(yīng)的函數(shù)進(jìn)行修改就可以。4系統(tǒng)的分析與設(shè)計(jì)4.1系統(tǒng)總體框架電子郵件系統(tǒng)可分為SMTP客戶端和POP3客戶端兩部分,根據(jù)郵件在傳輸時(shí)使用的協(xié)議它們又分別可以分為SMTP和POP3。下圖給出了電子郵件系統(tǒng)的整體框架結(jié)構(gòu),其中箭頭令表示了郵件的傳輸路徑。首先由SMTP客戶端編寫并發(fā)送郵件;SMTP服務(wù)器接收到郵件后根據(jù)收件人是否是本地用戶進(jìn)行分發(fā)。如果是本地用戶,則將郵件直接投遞到用戶郵箱中;如果是遠(yuǎn)程郵箱,則將郵件轉(zhuǎn)發(fā)到收件人所在的服務(wù)器上;最后收件人通過POP3客戶端經(jīng)過POP3服務(wù)器,把郵件從服務(wù)器上的郵箱中取到本地主機(jī)上進(jìn)行解析和顯示。電子郵件服務(wù)器的用戶名、密碼以及其它參數(shù)<如每個(gè)郵箱的最大存儲空間、每封信的大小等>都是通過管理服務(wù)器進(jìn)行管理的。4.2系統(tǒng)通信模型調(diào)用socket函數(shù)創(chuàng)建一個(gè)用于通信的套接字,設(shè)置套接字地址結(jié)構(gòu),使用服務(wù)器端的的地址和端口號。調(diào)用connect函數(shù)來建立與服務(wù)器的連接。此時(shí),可以調(diào)用讀寫函數(shù)進(jìn)行數(shù)據(jù)的收發(fā)操作。操作完畢后,關(guān)閉該套接字,終止連接。WinsockAPI函數(shù)<1>初始化和終止使用Winsock函數(shù)每個(gè)使用WinsockAPI的應(yīng)用程序,在調(diào)用Winsock函數(shù)之前都必須檢查系統(tǒng)是否加載Winsock庫。應(yīng)用程序通過調(diào)用函數(shù)WSAstartupO實(shí)現(xiàn)這個(gè)功能,只有在成功的調(diào)用該函數(shù)后,程序才能進(jìn)一步的調(diào)用其他Winsock函數(shù)。當(dāng)應(yīng)用程序不再使用WinsockAPI中的任何函數(shù)時(shí),必須調(diào)用WSACleanup<>函數(shù)終止對Winsock函數(shù)庫的使用。<2>建立和關(guān)閉套接口函數(shù)應(yīng)用程序在使用套接口通信前,必須使用Socket〔函數(shù)創(chuàng)建一個(gè)套接口,該函數(shù)具有三個(gè)參數(shù)。參數(shù)AF說明套接口所使用的協(xié)議地址族,如果希望建立一個(gè)UDP或TCP套接口,則用常量AF_INET表示使用互聯(lián)網(wǎng)協(xié)議<IP>。參數(shù)type描述套接口類型,在AF參數(shù)是AF_INET時(shí),它只能是SOCK_STREAM,SOCK_DRAM或SOCK_RAW三個(gè)套接口類型中的一個(gè),分別表示要?jiǎng)?chuàng)建的是流式套接口、數(shù)據(jù)報(bào)套接口和原始套接口。protocol參數(shù)說明套接口使用的特定協(xié)議,當(dāng)參數(shù)AF和type都確定后,它可以使用限定了的值。當(dāng)一個(gè)套接口不再使用時(shí),一定要調(diào)用closcsocket〔函數(shù)關(guān)閉這個(gè)套接口,以釋放與該套接口關(guān)聯(lián)的所有資源,包括正在等待處理的數(shù)據(jù)。<3>地址綁定函數(shù)在使用于流式和數(shù)據(jù)報(bào)套接口時(shí),服務(wù)器端是使用socket<>函數(shù)創(chuàng)建套接口后,還不能馬上使用,需要用bind<>函數(shù)將套接口與本地主機(jī)地址和分配好的端口號聯(lián)系起來。Winsock中使用sockaddrin結(jié)構(gòu)體指定m地址和端口信息,它的定義如下:structsockaddr_in<shortsin_family,shortsin_port,structin_addrsin_addr,charsin_zero[8]>;其中,sin_family必須是AF_INET,說明使用IP地址族;sin_port和sin_addrlP分別表示端口號和P地址:sin_zero般使用0填充。<4>監(jiān)聽連接函數(shù)服務(wù)器端將套接口與主機(jī)地址和端口號綁定后,用listen<>函數(shù)指示該套接口進(jìn)入監(jiān)聽連接狀態(tài)請求的狀態(tài),等待客戶端發(fā)出連接請求。除了用來標(biāo)識一個(gè)已經(jīng)綁定地址的套接口的參數(shù)外,該函數(shù)只有一個(gè)backlog參數(shù)指定了正待等待連接的最大隊(duì)列長度。服務(wù)器按順序從隊(duì)列中接受連接請求,并將以接受的請求從隊(duì)列中刪除。<5>請求和接受連接函數(shù)當(dāng)服務(wù)器端進(jìn)入監(jiān)聽連接狀態(tài)后,客戶端就可以在建好的套接口上用connect<>函數(shù)向服務(wù)器提出連接請求;而服務(wù)器端則使用acccpt<>函數(shù)從等待連接隊(duì)列中接受連接。這樣就在服務(wù)器套接口和客戶端套接口之間建立了一個(gè)連接。這兩個(gè)函數(shù)的定義如下:intconnect<SOCKETs,conststructsockaddrFAR*name,intnamelen>;intaccept<SOCKETs,structsockaddrFAR*addr,intnamelen>;兩個(gè)函數(shù)中的三個(gè)參數(shù)類型十分相似;s參數(shù)表示一個(gè)套接口。name和addr參數(shù)是以一個(gè)指向套接口地址結(jié)構(gòu)體的指針,namelen說明了地址結(jié)構(gòu)體的長度。但在每個(gè)函數(shù)中每個(gè)參數(shù)代表著不同的意義:connect<>函數(shù)中,參數(shù)s是將要建立連接的套接口,name指向的地址結(jié)構(gòu)體中存放著遠(yuǎn)端服務(wù)器套接口地址信息;而accept0函數(shù)中,參數(shù)s為服務(wù)器上處于監(jiān)聽狀態(tài)的套接口,addr指向的結(jié)構(gòu)體中存放著發(fā)出連接請求的客戶端套接口地址信息。<6>發(fā)送和接受數(shù)據(jù)函數(shù)在Winsock函數(shù)庫中有兩套用于發(fā)送、接受數(shù)據(jù)的函數(shù),它們分別是在已建立連接套接口上發(fā)送/接受數(shù)據(jù)的函數(shù)send0、recv0和在無連接套接口上發(fā)送/接受數(shù)據(jù)的函數(shù)sendto<>、recvfrom<>。這兩套函數(shù)實(shí)現(xiàn)的功能相同,send<>和sendto<>函數(shù)將緩沖區(qū)中的數(shù)據(jù)發(fā)送給遠(yuǎn)端的套接口,recv<>和recvfrom<>函數(shù)從接收數(shù)據(jù)的緩沖區(qū)讀取出遠(yuǎn)端套接口發(fā)送到的信息。它們的不同之處在于,用sendtoO和recvfrom〔函數(shù)是每次發(fā)送,接受數(shù)據(jù)時(shí),都需要有一個(gè)地址結(jié)構(gòu)體用來存放遠(yuǎn)端套接口信息。<7>套接口狀態(tài)查詢函數(shù)使用send<>和recv<>等函數(shù)進(jìn)行I/o操作時(shí),若套接口工作在阻塞方式線程會被迫進(jìn)入等待狀態(tài)。為了防止程序出現(xiàn)這個(gè)情況,可以使用select0函數(shù),它在執(zhí)行I/O操作前對套接口進(jìn)行檢查。Select<>函數(shù)可以通過參數(shù)設(shè)置分別檢查套接口的可讀性和可寫性,它的返回有三種狀態(tài):可以進(jìn)行I/O操作、發(fā)生錯(cuò)誤不能進(jìn)行I/O操作和等待時(shí)間超出參數(shù)設(shè)定的時(shí)間。該函數(shù)具有.fds、*readfds、*writefds、*exceptfds和*timout五個(gè)參數(shù)。其中,nfds參數(shù)是為與BerkeleyAPI相兼容并不使用;*readfds、*wdtefds和*exceptfds參數(shù)為fd_set眈類型的結(jié)構(gòu)體,它代表一系列特定套接口的集合*readfds表示需要檢查是否有可讀數(shù)據(jù)的套接口集合,writefds參數(shù)表示需要檢查是否可寫數(shù)據(jù)的套接口集合,而exceptfds參數(shù)需要檢查是否有外帶數(shù)據(jù)的套接口集合;*timeout參數(shù)是一個(gè)指向設(shè)定了超時(shí)時(shí)間結(jié)構(gòu)體的指針。<8>數(shù)據(jù)存儲類型的轉(zhuǎn)換函數(shù)不同的計(jì)算機(jī)系統(tǒng)在存儲由多個(gè)字節(jié)組成的信息時(shí),主機(jī)對字節(jié)值的存儲順序不同:將低序字節(jié)存放在低地址的方式叫做"小序在前<Little-endian>",而將高序字節(jié)存放在低地址的方式叫做"大序在前<Big-endian>"。在計(jì)算機(jī)中TCP/IP協(xié)議使用整數(shù)如端口號和地址,是按計(jì)算機(jī)各自的字節(jié)順序來表示的,被稱為"主機(jī)字節(jié)<Host-byte>"。而網(wǎng)絡(luò)通信協(xié)議要求,在網(wǎng)絡(luò)中使用的字節(jié)必須按"大序在前"的形式來表示,一般稱之為"網(wǎng)絡(luò)字節(jié)<Network-byte>"。由于Windows系列的操作系統(tǒng)使用的是"小序在前"的存儲方式,因此在Winsock中有一系列特定的API函數(shù)用來進(jìn)行主機(jī)字節(jié)順序和網(wǎng)絡(luò)字節(jié)順序的轉(zhuǎn)換:htonl〔和htons〔:將主機(jī)字節(jié)順序的數(shù)轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)順序;ntohl〔和ntohs〔:將網(wǎng)絡(luò)字節(jié)順序的數(shù)轉(zhuǎn)化為主機(jī)字節(jié)順序。在網(wǎng)絡(luò)程序設(shè)計(jì)中,常常會使用到m地址,它一般使用點(diǎn)分十進(jìn)制形式表示,如202.118.66.6,這種IP地址在程序中一般是用ACSII字符串的形式存儲的;但在網(wǎng)絡(luò)上,P地址是以網(wǎng)絡(luò)字節(jié)順序表示的。Winsock函數(shù)庫中,分別用inet_addr<>和inet_ntoa<>函數(shù)進(jìn)行點(diǎn)分十進(jìn)制表示的IP地址到網(wǎng)絡(luò)字節(jié)順序的m地址的轉(zhuǎn)換及其逆轉(zhuǎn)換。<9>獲取主機(jī)及網(wǎng)絡(luò)信息函數(shù)網(wǎng)絡(luò)應(yīng)用程序有時(shí)需要獲取主機(jī)與網(wǎng)絡(luò)的相關(guān)信息如主機(jī)名、遠(yuǎn)端地址等,這些信息一般存放在數(shù)據(jù)文件中。而獲取這些主機(jī)和網(wǎng)絡(luò)信息的函數(shù)被稱作數(shù)據(jù)庫函數(shù)。Winsock函數(shù)庫中數(shù)據(jù)庫函數(shù)根據(jù)獲取信息得不同可分為獲取主機(jī)信息、協(xié)議信息和服務(wù)信息這三類。在本文中使用的這類函數(shù)為:gethostname<>用來獲取主機(jī)名;gethostbyname〔函數(shù)根據(jù)主機(jī)名獲取包含主機(jī)的妒地址的主機(jī)信息。4.3系統(tǒng)總體構(gòu)成預(yù)設(shè)計(jì)的簡易電子郵件收發(fā)客戶端模塊是一個(gè)軟件包,它應(yīng)該包含郵件的發(fā)送、接收和顯示功能,還可以對用戶郵箱進(jìn)行處理,如下圖所示:功能設(shè)計(jì)電子郵件客戶端肩負(fù)著電子郵件系統(tǒng)與用戶交互郵件信息的重任,它是電子郵件系統(tǒng)中MUA<用戶代理>部分。完整的電子郵件客戶端應(yīng)至少具備對郵件進(jìn)行編寫、傳輸、收取、閱讀這幾個(gè)基本功能。由于電子郵件的大部分使用者為非計(jì)算機(jī)專業(yè)人員,對電子郵件的原理并不了解,這就要求電子郵件客戶端應(yīng)該具有易于用戶操作的界面,幫助用戶進(jìn)行郵件的編寫和閱讀,并且對郵件的具體處理<如生成標(biāo)準(zhǔn)格式的郵件、發(fā)送郵件、接收郵件、提取郵件信息等>操作應(yīng)放在后臺處理??蛻舳说恼w框架如圖所示:它根據(jù)功能可分為兩部分:SMTP客戶端和POP3客戶端。SMTP客戶端是客戶端中編輯、發(fā)送郵件部分,用戶通過界面輸入郵件信息后,SMTP客戶端根據(jù)郵件信息生成標(biāo)準(zhǔn)格式的郵件,并發(fā)送到SMTP服務(wù)器上;POP3客戶端實(shí)現(xiàn)郵件的接收和讀取顯示功能。〔2流程圖根據(jù)模塊化設(shè)計(jì)思想,按照SMTP客戶端的不同功能將其分為檢查郵件信息完整性、生成標(biāo)準(zhǔn)格式的郵件和發(fā)送郵件這三部分。SMTP客戶端的基本流程圖如下圖:每部分的基本功能如下:<1>寫郵件:在編寫郵件界面用戶按要求填寫郵件正文、附件及其它必須的信息:<2>從界面獲取郵件信息:調(diào)用MFC的函數(shù)將界面中的內(nèi)容存儲到結(jié)構(gòu)體中以便程序中使用;<3>檢查郵件信息完整性:檢查從界面讀取的信息中是否包括全部的發(fā)送郵件必備信息;<4>生成標(biāo)準(zhǔn)郵件:根據(jù)得到的郵件信息編寫郵件頭及郵件體各部分的頭信息,并對需要編碼的郵件體進(jìn)行編碼,然后將這些內(nèi)容按照RFC822和MIME的規(guī)定的格式并存入臨時(shí)文件中:<5>發(fā)送郵件:使用SMTP協(xié)議將郵件發(fā)送到服務(wù)器上。如果發(fā)送過程出現(xiàn)錯(cuò)誤,則提示用戶錯(cuò)誤信息并返回編寫郵件界面。.2建立網(wǎng)絡(luò)連接 SMTP采用客戶端朋艮務(wù)器工作模式,客戶

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論