VisualC網(wǎng)絡(luò)編程案例實(shí)戰(zhàn)之郵件接收和發(fā)送客戶端_第1頁(yè)
VisualC網(wǎng)絡(luò)編程案例實(shí)戰(zhàn)之郵件接收和發(fā)送客戶端_第2頁(yè)
VisualC網(wǎng)絡(luò)編程案例實(shí)戰(zhàn)之郵件接收和發(fā)送客戶端_第3頁(yè)
VisualC網(wǎng)絡(luò)編程案例實(shí)戰(zhàn)之郵件接收和發(fā)送客戶端_第4頁(yè)
VisualC網(wǎng)絡(luò)編程案例實(shí)戰(zhàn)之郵件接收和發(fā)送客戶端_第5頁(yè)
已閱讀5頁(yè),還剩106頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

1、第章 郵件接收和發(fā)送客戶端 郵件接收和發(fā)送客戶端的作用是在本地計(jì)算機(jī)和遠(yuǎn)程計(jì)算機(jī)之間傳送電子信件以及接收電子信件。用戶平時(shí)所用的就是一種郵件接收和發(fā)送客戶端。通常情況下,由發(fā)送者將電子信件發(fā)送到郵件服務(wù)器()中,再由服務(wù)器將該郵件發(fā)送到(接收郵件)服務(wù)器中,郵件接收者通過(guò)賬戶和口令再?gòu)姆?wù)器中獲取信件。在本章中,將向用戶介紹郵件接收和發(fā)送客戶端的原理以及開(kāi)發(fā)過(guò)程。 調(diào)用自帶的郵件發(fā)送程序 一般情況下,用戶所使用的操作系統(tǒng)中都帶有默認(rèn)的郵件發(fā)送程序。通過(guò)該郵件發(fā)送程序,用戶可以將郵件發(fā)送到任何目的地址。這種方法比較簡(jiǎn)單適用,所以很受大部分用戶歡迎。用戶可以在操作系統(tǒng)中,使用操作系統(tǒng)命令打開(kāi)郵件程

2、序。如果用戶需要在自己的程序中調(diào)用系統(tǒng)自帶的郵件程序,那么需要使用函數(shù)()或者()進(jìn)行調(diào)用。下面將分別介紹這兩種方法。 調(diào)用自帶程序 在操作系統(tǒng)中,所有的程序都是以進(jìn)程為單位運(yùn)行。本節(jié)中所講述的調(diào)用郵件發(fā)送程序就是通過(guò)調(diào)用相應(yīng)的進(jìn)程實(shí)現(xiàn)的。調(diào)用該進(jìn)程所使用的命令是“”,其中,表示郵件發(fā)送的目的地址。例如,用戶需要將郵件發(fā)送到郵件地址為的郵箱中,使用的命令是“”。 首先,在系統(tǒng)界面下選擇“開(kāi)始”“運(yùn)行”命令,彈出“運(yùn)行”對(duì)話框,如圖所示。圖 “運(yùn)行”對(duì)話框 然后,在運(yùn)行對(duì)話框中輸入命令“”,可以打開(kāi)自帶的郵件發(fā)送程序進(jìn)行郵件發(fā)送,如圖所示。圖 郵件收發(fā)器 以上過(guò)程是用戶通過(guò)命令調(diào)用郵件收發(fā)器必須

3、做的。實(shí)際上,除了這種方法,用戶還可以在程序中通過(guò)函數(shù)調(diào)用郵件收發(fā)器。此種方法將在節(jié)中進(jìn)行講解。 ()函數(shù) 在中編程,類(lèi)庫(kù)已經(jīng)提供了幾個(gè)庫(kù)函數(shù)用于調(diào)用的外部程序,包括郵件收發(fā)程序。在本節(jié)中,將向用戶介紹其中的兩個(gè)函數(shù)()和()。使用()函數(shù) ()函數(shù)可以創(chuàng)建進(jìn)程,同時(shí)也可以調(diào)用已經(jīng)存在的進(jìn)程。該函數(shù)的原型如下: ( , , , , , , , , , ); 該函數(shù)創(chuàng)建進(jìn)程成功則返回,否則返回。其參數(shù)意義如下: 參數(shù)表示可執(zhí)行文件的名字。用戶指定該參數(shù)后,該函數(shù)會(huì)在當(dāng)前路徑下搜索可執(zhí)行文件,但不會(huì)按照系統(tǒng)的搜索路徑進(jìn)行搜索。注意:使用該參數(shù)時(shí),需要加上擴(kuò)展名,因?yàn)橄到y(tǒng)不會(huì)自動(dòng)為其添加“”后綴名。

4、 參數(shù)表示將要傳遞到新進(jìn)程的命令行字符串。使用該參數(shù)時(shí),該函數(shù)會(huì)自動(dòng)為其添加后綴名“”。如果參數(shù)字符串沒(méi)有指定所在路徑,那么該函數(shù)則會(huì)按照系統(tǒng)的搜索路徑進(jìn)行搜索文件。 參數(shù)表示該進(jìn)程創(chuàng)建的子進(jìn)程是否能繼承父進(jìn)程的對(duì)象句柄。 參數(shù)指向結(jié)構(gòu)體的指針變量。該結(jié)構(gòu)體的聲明如下: ;表示該結(jié)構(gòu)體的大小 ;保留,必須將該參數(shù)初始化為 ; ; 設(shè)置控制臺(tái)程序的名稱 ; 設(shè)置應(yīng)用程序窗口的坐標(biāo) ; 設(shè)置應(yīng)用程序窗口的坐標(biāo) ; 設(shè)置應(yīng)用程序窗口的橫向大小 ; 設(shè)置應(yīng)用程序窗口的縱向大小 ; 以字符為單位設(shè)置應(yīng)用程序窗口的坐標(biāo) ; 以字符為單位設(shè)置應(yīng)用程序窗口的坐標(biāo) ;設(shè)置應(yīng)用程序窗口所使用的背景色等 ; 表示創(chuàng)

5、建窗口的標(biāo)志 ; 是否顯示應(yīng)用程序窗口 ; 保留,將該參數(shù)必須設(shè)置為 ;保留,將該參數(shù)必須設(shè)置為 ; 設(shè)置控制臺(tái)程序的輸入輸出緩存句柄 ; ; 錯(cuò)誤輸出句柄 , *; 該結(jié)構(gòu)體主要用于保存新創(chuàng)建進(jìn)程的窗口信息,如窗口的大小或窗口的顯示方式等。其中,參數(shù)標(biāo)識(shí)了窗口創(chuàng)建成功以后,在顯示之前以何種方式進(jìn)行顯示。其取值如表所示。表 程序窗口顯示標(biāo)志取值 注意:在表中所示的程序窗口顯示標(biāo)注意:在表中所示的程序窗口顯示標(biāo)志的作用僅僅是為了控制相應(yīng)的成員變志的作用僅僅是為了控制相應(yīng)的成員變量是否有效而已。例如,用戶在程序中,量是否有效而已。例如,用戶在程序中,需要使用到該結(jié)構(gòu)體中的成員。那么,需要使用到該結(jié)

6、構(gòu)體中的成員。那么,用戶必須將參數(shù)取值為。否則,該成員用戶必須將參數(shù)取值為。否則,該成員變量將無(wú)效。變量將無(wú)效。 參數(shù)是指向結(jié)構(gòu)體的指針變量。該結(jié)構(gòu)參數(shù)是指向結(jié)構(gòu)體的指針變量。該結(jié)構(gòu)體聲明如下:體聲明如下: ; 進(jìn)程句柄進(jìn)程句柄 ; 線程線程句柄句柄 ; 進(jìn)程進(jìn)程 ; 線程線程 ;取 值含 義使用和成員使用成員使用和成員使用和成員使用成員使用、成員以全屏方式啟動(dòng)程序 該結(jié)構(gòu)體主要用于保存進(jìn)程的相關(guān)信息。其他參數(shù)均可以默認(rèn)設(shè)置為。例如,調(diào)用操作系統(tǒng)的記事本程序。代碼如下:. 省略部分代碼 ();定義結(jié)構(gòu)體變量 ;定義結(jié)構(gòu)體對(duì)象 *”;記事本名稱();調(diào)用函數(shù)打開(kāi)記事本程序. 省略部分代碼 同樣的

7、道理,用戶在本例中,也可以使用函數(shù)()調(diào)用郵件收發(fā)程序。代碼如下:. 省略部分代碼 ();定義結(jié)構(gòu)體變量 ; *;打開(kāi)郵件程序的系統(tǒng)命令();調(diào)用函數(shù)打開(kāi)記事本程序. 省略部分代碼使用()函數(shù) 在編程中,除了函數(shù)()以外,還可以調(diào)用函數(shù)()實(shí)現(xiàn)相同的功能。該函數(shù)原型如下: ( , 父窗口句柄 ,將要進(jìn)行的操作形式 , 目錄文件名稱或文件路徑 , 傳遞的參數(shù) ,一般為 顯示方式 ); 該函數(shù)執(zhí)行成功會(huì)返回調(diào)用程序的應(yīng)用程序指針,否則返回錯(cuò)誤代碼。部分錯(cuò)誤代碼如表所示。表 部分錯(cuò)誤代碼錯(cuò) 誤 代 碼意 義找不到相應(yīng)文件找不到所需路徑無(wú)效的文件無(wú)效的文件名 操作系統(tǒng)的內(nèi)存溢出 該函數(shù)各個(gè)參數(shù)的說(shuō)明已

8、在函數(shù)原型中標(biāo)出。使用該函數(shù)調(diào)用操作系統(tǒng)自帶的郵件發(fā)送程序,代碼如下: 以上代碼是使用語(yǔ)言編寫(xiě),并且使用命令行窗口界面,目的是為了讓用戶了解整個(gè)調(diào)用過(guò)程。在隨書(shū)光盤(pán)的第章中附有代碼,請(qǐng)用戶自行參考。此段代碼在中編譯后的結(jié)果,如圖所示。用戶在運(yùn)行界面中輸入字符或,然后按下鍵。程序提示郵件程序正在打開(kāi),當(dāng)郵件程序打開(kāi)以后,實(shí)例程序會(huì)提示已經(jīng)打開(kāi)郵件程序,如圖所示。圖 運(yùn)行界面圖 運(yùn)行界面 注意:在程序中為了模擬計(jì)算機(jī)的工注意:在程序中為了模擬計(jì)算機(jī)的工作,所以筆者使用了循環(huán)產(chǎn)生時(shí)間差,作,所以筆者使用了循環(huán)產(chǎn)生時(shí)間差,僅僅是為了讓用戶重復(fù)了解該調(diào)用過(guò)程。僅僅是為了讓用戶重復(fù)了解該調(diào)用過(guò)程。在實(shí)際編

9、程中,不提倡使用該方法產(chǎn)生在實(shí)際編程中,不提倡使用該方法產(chǎn)生時(shí)間差,因?yàn)檫@種方法很危險(xiǎn),容易造時(shí)間差,因?yàn)檫@種方法很危險(xiǎn),容易造成系統(tǒng)的崩潰。通常,使用多線程編程成系統(tǒng)的崩潰。通常,使用多線程編程的方法比較安全,也是筆者極力推薦的的方法比較安全,也是筆者極力推薦的一種方法。該類(lèi)方法將在后面的相關(guān)章一種方法。該類(lèi)方法將在后面的相關(guān)章節(jié)中講述。節(jié)中講述。 會(huì)話過(guò)程 怎么連接服務(wù)器 在網(wǎng)絡(luò)中傳輸郵件信息都是基于協(xié)議的,所以用戶在操作系統(tǒng)中編寫(xiě)郵件發(fā)送程序時(shí)可以使用套接字來(lái)完成。一般情況下,客戶端連接服務(wù)器的幾個(gè)步驟如下。 ()客戶端指定地址和端口連接服務(wù)器。 ()服務(wù)器收到連接請(qǐng)求,并同意客戶端連接

10、請(qǐng)求。 ()客戶端和服務(wù)器互相發(fā)送數(shù)據(jù)。 ()關(guān)閉服務(wù)器和客戶端的套接字。 基于以上幾個(gè)步驟,用戶可以中編寫(xiě)程序?qū)崿F(xiàn)郵件客戶端。創(chuàng)建套接字對(duì)象 該實(shí)例與一般網(wǎng)絡(luò)程序一樣,需要套接字的支持,所以用戶應(yīng)該首先初始化套接字庫(kù)。代碼如下: ();();指定套接字庫(kù)版本();初始化套接字庫(kù) 用戶初始化套接字庫(kù)以后,還必須記得在程序退出之前釋放該套接字庫(kù)。代碼如下: () ();釋放已經(jīng)加載的套接字庫(kù) 然后,用戶可以調(diào)用函數(shù)()創(chuàng)建連接服務(wù)器的套接字了。代碼如下: 在代碼中,函數(shù)()創(chuàng)建了基于通信的流式套接字句柄。連接服務(wù)器 用戶創(chuàng)建好套接字以后,可以調(diào)用函數(shù)()連接服務(wù)器。其原型如下: (, *, );

11、 該函數(shù)用于連接遠(yuǎn)程計(jì)算機(jī),如果連接失敗則返回,否則成功。參數(shù)及其意義如下: 參數(shù)表示將要連接服務(wù)器的套接字句柄,該套接字是用戶之前已經(jīng)創(chuàng)建好的套接字句柄。 參數(shù)是指向套接字地址結(jié)構(gòu)體的指針變量。該套接字結(jié)構(gòu)體聲明如下: ; ; ; ; ; 該結(jié)構(gòu)體是結(jié)構(gòu)的擴(kuò)充結(jié)構(gòu),一般被用在 中。 參數(shù)表示套接字結(jié)構(gòu)對(duì)象的大小。 使用該函數(shù)在套接字上連接服務(wù)器。例如,服務(wù)器地址為“”,端口為。代碼如下: 通過(guò)上面的代碼,用戶已經(jīng)向服務(wù)器發(fā)送了連接請(qǐng)求。當(dāng)服務(wù)器接受客戶端的連接請(qǐng)求以后,服務(wù)器會(huì)返回相關(guān)響應(yīng)碼給客戶端。該響應(yīng)碼的前位數(shù)字表示服務(wù)器端響應(yīng)的結(jié)果。部分響應(yīng)碼如表所示。表 部分響應(yīng)碼響 應(yīng) 碼意 義

12、服務(wù)器就緒服務(wù)器關(guān)閉傳輸通道客戶端所請(qǐng)求的郵件操作完成郵件地址不可用服務(wù)器服務(wù)不可用,關(guān)閉傳輸通道由于處理過(guò)程中出錯(cuò),請(qǐng)求的操作被終止服務(wù)器存儲(chǔ)空間不足命令語(yǔ)法錯(cuò)誤命令參數(shù)的語(yǔ)法錯(cuò)誤命令暫時(shí)不可實(shí)現(xiàn)錯(cuò)誤的命令序列客戶端請(qǐng)求的操作不能被執(zhí)行或者郵件地址不可用服務(wù)器的存儲(chǔ)不足郵箱名稱不合法服務(wù)失敗發(fā)送驗(yàn)證用戶名驗(yàn)證賬號(hào)密碼失敗 在該實(shí)例中,客戶端如果連接服務(wù)器成功則會(huì)返回響應(yīng)碼,表示服務(wù)器服務(wù)就緒,否則返回。客戶端接收響應(yīng)碼應(yīng)該調(diào)用函數(shù)()。代碼如下: 本節(jié)中,向用戶講述了連接服務(wù)器、響應(yīng)碼的具體意義以及客戶端接收響應(yīng)碼,并且配有相關(guān)的代碼實(shí)例。 命令 在客戶端與服務(wù)器之間進(jìn)行數(shù)據(jù)傳輸時(shí),雙方都是

13、使用命令進(jìn)行交流。因此,命令在通信中起著很重要的作用。但是,在向用戶講解命令之前,用戶必須首先了解一下電子郵件的基本格式。構(gòu)造格式 在例子中,的基本格式包括郵件頭和郵件體。郵件頭中的內(nèi)容是關(guān)于該郵件的一些基本信息。例如,發(fā)送者和主題信息。而郵件體中是純文本的郵件內(nèi)容,并且在協(xié)議中,還規(guī)定在郵件頭和郵件體之間需要使用一個(gè)空白行隔開(kāi)。 在郵件頭中,主要是由標(biāo)準(zhǔn)字段組成,這些字段包含郵件的基本信息。例如: 郵件頭 : 以上字段所包含的信息:郵件發(fā)送者的郵件地址是,郵件主題是 。在協(xié)議中,包含了很多郵件頭標(biāo)準(zhǔn)字段,部分郵件頭字段如表所示。緊跟著郵件頭的是一個(gè)空白行,用于區(qū)分郵件頭和郵件體。在郵件體中,

14、主要是郵件需要發(fā)送的信息內(nèi)容。在郵件體中,不包含任何字段信息,只有文本格式的郵件內(nèi)容而已。表 郵件頭字段字 段意 義郵件創(chuàng)建者的郵件地址郵件目的地郵件發(fā)送者郵件回復(fù)地址郵件抄送人 郵件正被回復(fù)郵件創(chuàng)建的時(shí)間郵件主題郵件的其他說(shuō)明郵件的關(guān)鍵字郵件的密件抄送人郵件地址郵件的標(biāo)識(shí)符 在表中列出了部分標(biāo)準(zhǔn)字段。其中,表示郵件的創(chuàng)建者地址,該地址在一般情況下僅有一個(gè)。表示郵件的發(fā)送者,該發(fā)送者可能是轉(zhuǎn)發(fā)郵件,該字段可以有多個(gè)郵件地址,地址之間使用逗號(hào)隔開(kāi)。同時(shí)可以有多個(gè)地址的字段是。例如: : , , 發(fā)送者為多個(gè)地址 接收者也為多個(gè): 郵件主題空行 ! 郵件數(shù)據(jù)體 ! 如果郵件沒(méi)有發(fā)送成功,則客戶端應(yīng)

15、該將該郵件重新進(jìn)行發(fā)送。郵件的重發(fā)必須在保證郵件內(nèi)容不發(fā)生改變的情況下進(jìn)行。實(shí)際上,郵件進(jìn)行重發(fā)只用在原有郵件頭的標(biāo)題字段前加上字符串“”。例如,將上述實(shí)例中的郵件進(jìn)行重發(fā),內(nèi)容如下: : , 發(fā)送者為多個(gè)地址接收者也為多個(gè): 郵件主題 !郵件數(shù)據(jù)體 !注意:在連接服務(wù)器成功以后,客戶端在接收到服務(wù)器返回的命令后,就可以將以上構(gòu)造的郵件內(nèi)容發(fā)送到服務(wù)器了。命令 前面已經(jīng)向用戶介紹過(guò)客戶端與服務(wù)器之間的交流是通過(guò)命令來(lái)完成的。常見(jiàn)的命令如表所示。表 常用命令命 令含 義客戶機(jī)向服務(wù)器問(wèn)候指定郵件的發(fā)送者指定郵件的接收者指示客戶端或服務(wù)器端可以發(fā)送郵件內(nèi)容重新初始化會(huì)話狀態(tài)驗(yàn)證郵件地址的有效性空操

16、作終止會(huì)話交換服務(wù)器與客戶端 下面將參照表中所列舉的部分命令進(jìn)行講解。 命令是在郵件客戶端連接服務(wù)器成功以后,第一個(gè)發(fā)送到服務(wù)器的命令。其作用是向服務(wù)器問(wèn)候。例如,客戶端向服務(wù)器問(wèn)候并表明自己的身份。內(nèi)容如下: 其中,字符表示結(jié)束符號(hào)。以上內(nèi)容表示客戶端向服務(wù)器問(wèn)候并且表明自己的身份。例如,在中向服務(wù)器發(fā)送該命令,代碼如下: .省略部分代碼 ;構(gòu)造命令字符串 (, ();發(fā)送命令到服務(wù)器 .省略部分代碼 命令 分別表示指定郵件的發(fā)送和接收者。例如: 上述代碼分別指定了郵件的發(fā)送者和接收者的郵件地址。 命令是客戶端發(fā)送到服務(wù)器表明客戶端將要發(fā)送郵件到服務(wù)器。服務(wù)器收到該命令后會(huì)返回響應(yīng)碼到客戶端

17、,表示服務(wù)器已經(jīng)準(zhǔn)備好接收客戶端的郵件數(shù)據(jù)。 命令是被用來(lái)驗(yàn)證某個(gè)郵件地址的有效性。例如,用戶用該命令來(lái)驗(yàn)證自己的郵箱地址是否有效,則可以發(fā)送命令字符串“”到服務(wù)器。如果該郵箱地址是有效的地址,則服務(wù)器會(huì)返回響應(yīng)碼,表示客戶端所請(qǐng)求的操作成功,否則返回,表示郵件地址無(wú)效。 命令表示終止服務(wù)器和客戶端的會(huì)話。例如客戶端向服務(wù)器發(fā)送該命令,代碼如下: . 省略部分代碼 ; 構(gòu)造命令字符串 (, (); 發(fā)送命令到服務(wù)器 . 省略部分代碼 當(dāng)服務(wù)器接收到該命令以后,會(huì)返回響應(yīng)碼到客戶端,表示服務(wù)器已經(jīng)關(guān)閉相關(guān)的數(shù)據(jù)通道。注意:表中的命令在程序中被發(fā)送時(shí)必須加上換行符號(hào)“”,或者用戶在構(gòu)造完成整個(gè)郵件

18、內(nèi)容后,需要在郵件內(nèi)容后面加上“”,表示數(shù)據(jù)內(nèi)容發(fā)送或者接收完畢。 發(fā)送命令與接收響應(yīng) 在客戶端編程中,通常情況下客戶端都是通過(guò)向服務(wù)器發(fā)送命令表示需要進(jìn)行的操作。在表中,已經(jīng)列出了部分常用命令,這些命令都是在客戶端連接服務(wù)器成功以后發(fā)送的??蛻舳税l(fā)送命令以后,服務(wù)器通過(guò)向客戶端發(fā)送響應(yīng)碼告知其所發(fā)送的命令是否成功或被執(zhí)行。與服務(wù)器一問(wèn)一答 客戶端與服務(wù)器的通信過(guò)程是通過(guò)問(wèn)答形式完成的,這個(gè)過(guò)程是典型的通信模式。下面介紹一下郵件客戶端發(fā)送的命令與服務(wù)器端返回的信息。內(nèi)容如下:.省略發(fā)送連接請(qǐng)求 () 加密后的用戶名 加密后的密碼 準(zhǔn)備發(fā)送信件 .信件以.結(jié)束.省略構(gòu)造信件內(nèi)容并發(fā)送退出命令 以

19、上內(nèi)容單數(shù)為客戶端發(fā)送的命令,雙數(shù)為從服務(wù)器端返回的信息。通過(guò)上面的內(nèi)容,用戶可以看到這是發(fā)送郵件所要經(jīng)歷的一個(gè)典型的(客戶端服務(wù)器)通信過(guò)程,通過(guò)問(wèn)答的形式將一封郵件發(fā)送到服務(wù)器。注意:在客戶端發(fā)送命令以后,服務(wù)器會(huì)返回是否準(zhǔn)備好接收客戶端將要發(fā)送郵件的響應(yīng)碼,該響應(yīng)碼是,表示服務(wù)器已經(jīng)準(zhǔn)備好接收郵件。接下來(lái),客戶端可以直接將郵件發(fā)送到服務(wù)器。發(fā)送命令 在實(shí)例中,客戶端發(fā)送命令是通過(guò)函數(shù)()進(jìn)行的。該函數(shù)的作用是向套接字的另一方發(fā)送指定緩沖區(qū)中的內(nèi)容。函數(shù)原型如下: ( * ); 該函數(shù)調(diào)用成功返回非值,否則失敗。部分參數(shù)意義如下: 參數(shù)表示客戶端所創(chuàng)建的套接字句柄。 參數(shù)指向緩沖區(qū)的字符指

20、針。 參數(shù)表示緩沖區(qū)的大小,可以使用函數(shù)()獲得。 例如,用戶使用函數(shù)()將命令發(fā)送到服務(wù)器,代碼如下: ;定義命令字符串 ()();接收郵件服務(wù)器響應(yīng) 客戶端接收的消息來(lái)自于服務(wù)器端返回的響應(yīng)碼。實(shí)現(xiàn)該功能的函數(shù)是(),該函數(shù)原型如下: ( * ); 該函數(shù)調(diào)用成功,則返回實(shí)際接收到的字符數(shù),否則失敗。主要參數(shù)意義如下: 參數(shù)套接字句柄。 參數(shù)表示接收數(shù)據(jù)的緩沖區(qū)指針,與函數(shù)()一樣。 參數(shù)表示將接收的數(shù)據(jù)大小。在這里將該參數(shù)設(shè)置為。 ; (); 在這里,關(guān)于客戶端接收服務(wù)器響應(yīng)消息的功能不再進(jìn)行重復(fù)講述,請(qǐng)用戶復(fù)習(xí)本章前面所講述的相關(guān)內(nèi)容。 客戶端發(fā)送郵件 用戶通過(guò)學(xué)習(xí)前面關(guān)于郵件收發(fā)的基

21、本原理和編程方法,對(duì)郵件收發(fā)器的制作已經(jīng)熟悉。在本節(jié)中,將通過(guò)編程制作程序?qū)嵗?,向用戶講述在環(huán)境下編程的具體方法。通過(guò)本節(jié)實(shí)例的學(xué)習(xí),用戶可以仿照該實(shí)例的設(shè)計(jì)方法,自行編程實(shí)現(xiàn)郵件收發(fā)器。 準(zhǔn)備工作 在程序中,窗口界面是最重要的,因?yàn)槌绦蚪缑嬷苯用嫦蛴脩?。?dāng)用戶第一次使用軟件時(shí),其窗口界面決定了用戶對(duì)該軟件的第一印象,所以我們先從設(shè)計(jì)對(duì)話框的界面開(kāi)始,然后做些編程前的準(zhǔn)備工作。創(chuàng)建工程 創(chuàng)建基于對(duì)話框的工程,工程名為,注意在向?qū)У牡诓竭x中 復(fù)選框,如圖所示。圖 復(fù)選框添加控件 為對(duì)話框添加控件并設(shè)計(jì)界面如圖所示:圖 程序設(shè)計(jì)界面及其關(guān)鍵控件號(hào) 控件的以及為控件關(guān)聯(lián)的變量名和類(lèi)型如圖所示:圖 控

22、件關(guān)聯(lián)的變量名及類(lèi)型 為對(duì)話框添加成員變量 在類(lèi)中添加成員變量,即與服務(wù)器端交流的套接字。 登錄身份驗(yàn)證方式 既可允許匿名登錄也可以要求身份驗(yàn)證,實(shí)際應(yīng)該中當(dāng)然是要求身份認(rèn)證的。身份認(rèn)證的方式有多種。方式 本章所講的工程實(shí)例就是采用此種登錄驗(yàn)證方式。實(shí)例中專門(mén)引入了兩個(gè)文件和,它們封裝了一個(gè)類(lèi),可以用它的成員函數(shù)()對(duì)需要進(jìn)行編碼的數(shù)據(jù)進(jìn)行處理。方式 基于明文的驗(yàn)證,其向服務(wù)器發(fā)送的用戶名和密碼的格式應(yīng)該為“”。是用戶名,后邊的是口令,是的。方式 即是一種驗(yàn)證方式,是“ ”的縮寫(xiě)。所謂,是將與共享的一個(gè)作為一部分的輸入,正好郵件系統(tǒng)的用戶名和口令可以作為這個(gè)。 服務(wù)器對(duì)以上種驗(yàn)證方式并不一定全

23、部支持。 連接登錄服務(wù)器 為“登錄服務(wù)器”按鈕添加消息響應(yīng)函數(shù)()。.加載套接字庫(kù) ()必須是應(yīng)用程序調(diào)用的第一個(gè) 函數(shù)。 使用函數(shù)()來(lái)加載指定版本的套接字庫(kù)。.創(chuàng)建套接字并獲取服務(wù)器的地址 獲取的地址會(huì)被用在之后的連接服務(wù)器的操作中。 是由用戶輸入的服務(wù)器的網(wǎng)址,通過(guò)調(diào)用函數(shù)()來(lái)返回一個(gè)指向結(jié)構(gòu)的指針,結(jié)構(gòu)的成員包含了服務(wù)器網(wǎng)絡(luò)字節(jié)序的地址,通過(guò)字節(jié)拷貝函數(shù)()將所指向內(nèi)存的個(gè)字節(jié)拷貝到類(lèi)型的變量中。.連接服務(wù)器 需要用默認(rèn)的端口號(hào)和之前獲得的地址填充結(jié)構(gòu)。 代碼通過(guò)調(diào)用()函數(shù)來(lái)連接服務(wù)器,調(diào)用函數(shù)()來(lái)接收來(lái)自服務(wù)器的響應(yīng)信息,返回表示連接成功。.發(fā)送命令 習(xí)慣上要問(wèn)候服務(wù)器一下,就

24、像與熟人第一次見(jiàn)面時(shí)的問(wèn)候一樣。 代碼發(fā)送 向服務(wù)器問(wèn)候,服務(wù)器通常會(huì)返回 響應(yīng)。當(dāng)然也可以不想它問(wèn)候,如果你不滿意它的“回答”的話。.登錄驗(yàn)證 選擇一種服務(wù)器支持的驗(yàn)證方式,通過(guò)驗(yàn)證后才可以進(jìn)入自己的郵箱。 代碼選擇了的登錄驗(yàn)證方式,并先后向服務(wù)器發(fā)送了經(jīng)過(guò)處理的用戶名和密碼。代碼中是通過(guò)調(diào)用類(lèi)的成員函數(shù)()來(lái)實(shí)現(xiàn)處理的,函數(shù)接收的參數(shù)分別為要處理的數(shù)據(jù)和數(shù)據(jù)的長(zhǎng)度。 一切正常的話服務(wù)器的響應(yīng)如下: 加密后的用戶名 加密后的密碼 成功登錄 綜上所述,“登錄服務(wù)器”按鈕的消息響應(yīng)函數(shù)()編寫(xiě)如下: 登錄服務(wù)器的代碼實(shí)現(xiàn)效果如圖所示。圖 程序連接服務(wù)器過(guò)程 構(gòu)造并發(fā)送郵件 服務(wù)器端服務(wù)成功啟動(dòng)以

25、后,客戶端可以將郵件發(fā)送到服務(wù)器,但是在郵件發(fā)送之前必須對(duì)郵件的數(shù)據(jù)進(jìn)行順序調(diào)整,以符合協(xié)議的規(guī)范。例如,一封正確的郵件數(shù)據(jù)格式應(yīng)該如下。發(fā)件人地址 : 郵件主題 空白行 !郵件內(nèi)容 ! 接下來(lái)將分別向服務(wù)器發(fā)送如下命令,正常情況下服務(wù)器的響應(yīng)如下: 準(zhǔn)備發(fā)送信件 .信件以.結(jié)束 .省略構(gòu)造信件內(nèi)容并發(fā)送退出命令 .發(fā)送 命令 發(fā)送郵件前必須要首先提供的關(guān)鍵信息之發(fā)件人。 是用戶填寫(xiě)的用戶名信息,代碼首先構(gòu)造了 :字符串,然后通過(guò)()函數(shù)發(fā)送到服務(wù)器,最后用()函數(shù)來(lái)接收服務(wù)器的消息響應(yīng)。.發(fā)送 命令 發(fā)送郵件前必須要提供的關(guān)鍵信息之收件人。 是用戶填寫(xiě)的收件人信息,代碼首先構(gòu)造了 :字符串,

26、然后通過(guò)()函數(shù)發(fā)送到服務(wù)器,最后用()函數(shù)來(lái)接收服務(wù)器的消息響應(yīng)。.發(fā)送命令 發(fā)送提示服務(wù)器:客戶端即將發(fā)送郵件。同時(shí)希望得到服務(wù)器“已經(jīng)準(zhǔn)備好了”的響應(yīng)信息。 代碼首先構(gòu)造了字符串,然后通過(guò)()函數(shù)發(fā)送到服務(wù)器,最后用()函數(shù)來(lái)接收服務(wù)器的消息響應(yīng)。.發(fā)送郵件 選擇感興趣的關(guān)鍵字并填充,如主題。按照約定郵件的結(jié)束以“.”為標(biāo)志。 是用戶填寫(xiě)的主題信息,是用戶填寫(xiě)的郵件內(nèi)容,代碼將用戶填寫(xiě)的信息進(jìn)行了格式化,然后整合在了一起。最后通過(guò)()函數(shù)發(fā)送到服務(wù)器,最后用()函數(shù)來(lái)接收服務(wù)器的消息響應(yīng)。.發(fā)送命令 命令用來(lái)通知服務(wù)器結(jié)束會(huì)話、斷開(kāi)連接。 代碼首先構(gòu)造了字符串,然后通過(guò)()函數(shù)發(fā)送到服務(wù)

27、器,最后用()函數(shù)來(lái)接收服務(wù)器的消息響應(yīng)。 綜上所述,添加“郵件發(fā)送”按鈕的消息響應(yīng)函數(shù)如下: 郵件發(fā)送的代碼實(shí)現(xiàn)效果如圖所示。圖 程序發(fā)送郵件的過(guò)程 打開(kāi)收件人的郵箱查看收到的郵件如圖所示:圖 查看郵箱中收到的郵件 退出程序 雙擊“退出程序”按鈕,添加消息響應(yīng)函數(shù)()。 代碼主要調(diào)用函數(shù)()和()完成關(guān)閉套接字和卸載庫(kù)的功能。 簡(jiǎn)介 一般,用戶接收郵件是通過(guò)向服務(wù)器發(fā)送命令獲取的。具體發(fā)送命令的步驟與協(xié)議一樣,所以在這里不再贅述,如有不清楚的地方請(qǐng)用戶復(fù)習(xí)服務(wù)器前面的知識(shí)。在本節(jié)中,將向用戶介紹部分命令以及編程實(shí)現(xiàn)接收郵件功能。命令 通信方式與一樣,使用標(biāo)準(zhǔn)命令與服務(wù)器進(jìn)行數(shù)據(jù)交換。協(xié)議中還

28、規(guī)定了標(biāo)準(zhǔn)端口為號(hào)端口。標(biāo)準(zhǔn)命令如表所示。表 部分標(biāo)準(zhǔn)命令命 令意 義終止與服務(wù)器會(huì)話提供信箱大小獲取郵件大小客戶端發(fā)送賬號(hào)信息到服務(wù)器驗(yàn)證客戶端發(fā)送密碼信息到服務(wù)器驗(yàn)證取出第封郵件信頭和郵件內(nèi)容的前行刪除第封郵件復(fù)位會(huì)話取出第封郵件 在上表中列出了的相關(guān)命令,下面將對(duì)其中的命令進(jìn)行詳解。 命令的作用是終止與服務(wù)器的會(huì)話連接。格式如下: 該命令如果發(fā)送到服務(wù)器執(zhí)行成功,服務(wù)器則會(huì)返回,表示服務(wù)器同意客戶端退出對(duì)話。 命令的作用是請(qǐng)求服務(wù)器信箱的大小信息。 命令可以獲取指定郵件的大小信息。如果不帶任何命令參數(shù),則服務(wù)器會(huì)返回所有郵件的大小。格式如下:客戶端發(fā)送命令 表示第一封郵件的大小 表示第二

29、封郵件的大小 .注意:格式中的序號(hào)表示郵件的序列號(hào),緊跟后面的數(shù)字表示該郵件的大小信息。使用該命令獲得的郵件列表序號(hào)是從開(kāi)始的。 命令將標(biāo)識(shí)客戶端發(fā)送的賬號(hào)信息。格式如下: 命令將標(biāo)識(shí)客戶端發(fā)送的密碼信息。格式如下: 命令表示將取出指定郵件的信頭和其郵件內(nèi)容的前行。例如,用戶需要取出第一封郵件的前兩行內(nèi)容,則發(fā)送命令到服務(wù)器即可。代碼如下: ( );構(gòu)造命令字符串 ()();發(fā)送命令到服務(wù)器 命令表示對(duì)郵件進(jìn)行刪除操作。如果該命令配合其命令參數(shù)可以刪除第封郵件。例如,用戶將刪除第封郵件,格式如下: 命令的作用是對(duì)會(huì)話過(guò)程進(jìn)行復(fù)位。 命令的作用是取出第封郵件。例如,用戶需要取出第封郵件。格式 如

30、下: 當(dāng)客戶端發(fā)送該命令以后,服務(wù)器會(huì)返回被請(qǐng)求郵件的全部?jī)?nèi)容(包括郵件頭和郵件內(nèi)容)。 如果服務(wù)器成功接收到命令之后,都會(huì)返回相應(yīng)的請(qǐng)求數(shù)據(jù)到客戶端。返回的數(shù)據(jù)格式如下: 服務(wù)器將返回相應(yīng)的數(shù)據(jù)會(huì)話 會(huì)話過(guò)程與一樣,必須首先連接服務(wù)器成功以后才能進(jìn)行相關(guān)操作。下面簡(jiǎn)單介紹一下會(huì)話的過(guò)程,會(huì)話如下:建立連接 驗(yàn)證的用戶名 嘿嘿,這個(gè)得BaoMi,實(shí)際是明文的 () ()命令服務(wù)器給出各郵件長(zhǎng)度 .標(biāo)識(shí)查詢客戶郵箱中郵件的總數(shù)和郵件總長(zhǎng)度 該會(huì)話過(guò)程是一個(gè)交互式的問(wèn)答過(guò)程。注意:因?yàn)榈墓ぷ鞣绞脚c相似,所以在本章中不再向讀者繼續(xù)講解關(guān)于的其他知識(shí)。如果用戶需要具體了解,請(qǐng)參考其他書(shū)籍。 客戶端接收

31、郵件 用戶接收郵件是通過(guò)(接收郵件服務(wù)器)協(xié)議完成的。一般情況下,客戶端通過(guò)向服務(wù)器發(fā)送相應(yīng)的命令獲取郵件。服務(wù)器接收到命令以后,會(huì)將數(shù)據(jù)按照的數(shù)據(jù)格式整理郵件,然后將郵件發(fā)送到客戶端進(jìn)行解析、顯示。在本節(jié)中,將向用戶講解命令等相關(guān)知識(shí)。 準(zhǔn)備工作 在程序中,窗口界面是最重要的,因?yàn)槌绦蚪缑嬷苯用嫦蛴脩?。?dāng)用戶第一次使用軟件時(shí),其窗口界面決定了用戶對(duì)該軟件的第一印象,所以我們先從設(shè)計(jì)對(duì)話框的界面開(kāi)始,然后做些編程前的準(zhǔn)備工作。創(chuàng)建工程 創(chuàng)建基于對(duì)話框的工程,工程名為,注意在向?qū)У牡诓竭x中 復(fù)選框,如圖所示。圖 復(fù)選框. 添加控件 為對(duì)話框添加控件并設(shè)計(jì)界面如圖所示:圖 程序設(shè)計(jì)界面及其關(guān)鍵控件

32、號(hào) 控件的以及為控件關(guān)聯(lián)的變量名和類(lèi)型如圖所示:圖 控件關(guān)聯(lián)的變量名及類(lèi)型. 為對(duì)話框添加成員變量 在類(lèi)中添加成員變量,即與服務(wù)器端會(huì)話的套接字。 連接登錄服務(wù)器 為“連接服務(wù)器”按鈕添加消息響應(yīng)函數(shù)。.加載套接字庫(kù) 就像之前講過(guò)的那樣,()必須是應(yīng)用程序調(diào)用的第一個(gè) 函數(shù)。 使用函數(shù)()來(lái)加載指定版本的套接字庫(kù)。.創(chuàng)建套接字并獲取服務(wù)器的地址 獲取的地址會(huì)被用在之后的連接服務(wù)器的操作中。 是由用戶輸入的服務(wù)器的網(wǎng)址,通過(guò)調(diào)用函數(shù)()來(lái)返回一個(gè)指向結(jié)構(gòu)的指針,結(jié)構(gòu)的成員包含了服務(wù)器網(wǎng)絡(luò)字節(jié)序的地址,通過(guò)字節(jié)拷貝函數(shù)()將所指向內(nèi)存的個(gè)字節(jié)拷貝到類(lèi)型的變量中。.連接服務(wù)器 需要用默認(rèn)的端口號(hào)和之前獲得的地址填充結(jié)構(gòu)。

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論