【正文】
66 } 67 close(new_fd)。 Linux 網(wǎng)絡(luò)編程 —— 實(shí)現(xiàn)一個(gè)局域網(wǎng)的電子郵件系統(tǒng) 41 42 int ReadMailSev(int sockfd)。 21 char from[MAXSIZE]。在這一過程中,實(shí)現(xiàn)老師給出這一任務(wù)的初衷,不要求做出來的東西有多完美,只要求在動(dòng)手的過程中能學(xué)到書本上學(xué)不到的東西。也就是附件的文件類型應(yīng)該用文本形式另外發(fā)送,這樣才能讓接受者知道福附件到底是什么文件。 LINUX 截圖程序得到。當(dāng)服務(wù)器收到欲讀郵件的客戶發(fā)過來的郵件代號,根據(jù)該代號在相應(yīng)文件中查找到欲讀的郵件,把內(nèi)容寫到一個(gè)緩沖里,用 BUF 返回。 驗(yàn)證密碼。 /*刪除郵件功能服務(wù)器端函數(shù),299~313 行 */ int SendMailSev(int sockfd,char*Usr)。 a、 服務(wù)器主函數(shù) int ServerMain(int sockfd): 當(dāng)一個(gè)用戶與服務(wù)器建立連接,服務(wù)器程序產(chǎn)生一個(gè)子進(jìn)程為之服務(wù),該子Linux 網(wǎng)絡(luò)編程 —— 實(shí)現(xiàn)一個(gè)局域網(wǎng)的電子郵件系統(tǒng) 進(jìn)程調(diào)用 ServerMain 函數(shù)為客戶服務(wù),此函數(shù)返回,服務(wù)即結(jié)束。 13~16 行定義了一些常量, MAXSIZE 為緩沖區(qū)的最大容量。在利用系統(tǒng)函數(shù) read(),write() 的基礎(chǔ)上,還另外使用了幾個(gè)自編的函數(shù): readline(),sockendl(),CutEndl(),分 別說明如下: int readline(int,void*,int): 從套接字中讀取一行內(nèi)容。一個(gè)郵件結(jié)構(gòu)包括以下幾項(xiàng):收信者,Linux 網(wǎng)絡(luò)編程 —— 實(shí)現(xiàn)一個(gè)局域網(wǎng)的電子郵件系統(tǒng) 發(fā)信者,主題,郵件正文,發(fā)信時(shí)間,郵件編號等等。 ( 3)進(jìn)入 郵箱界面:打印郵件列表,提供“讀郵件”,“發(fā)郵件”,“刪除郵件”,“退出郵箱”,“注銷用戶”等命令選擇。根據(jù)用戶名及用戶傳過來的待刪郵件的號碼利用系統(tǒng)調(diào)用將相應(yīng)郵件刪除。基本結(jié)構(gòu)如下: 服務(wù)器主程序調(diào)用以下兩大模塊: 服務(wù)器文件處理模塊 ⑴信件管理子模塊 (打開郵件 列表,打開郵件,刪除郵件) ⑵用戶信息管理子模塊 (保存帳號密碼對,驗(yàn)證密碼) 服務(wù)器通信模塊 (服務(wù)器向客戶傳郵件,服務(wù)器向客戶傳服務(wù)響應(yīng)信息) 客戶端主程序調(diào)用以下兩大模塊 客戶端界面提供模塊 客戶端通信模塊 (客戶向服務(wù)器傳郵件,客戶向服務(wù)器傳服務(wù)請求信息) 我們實(shí)現(xiàn)的郵件系統(tǒng)的運(yùn)行大致過程為:服務(wù)器和客戶機(jī)分別進(jìn)入主程序,調(diào)用各自通信模塊建立連接。 printf(Receive from server %s :\n %s,argv[1],buf)。s ip address server39。 connect request......\n)。 int sin_size。如果 read 出錯(cuò),則返回 1,并設(shè)置 errno。函數(shù)的形式如下: includesys/ int accept(int sockfd,struct sockaddr *addr,int *addrlen)。 =AF_INET。 exit(1)。 Linux 系統(tǒng)提供了 4 個(gè)庫函數(shù)來進(jìn)行字節(jié)順序的轉(zhuǎn)化: includei/ unsigned long int htonl(unsigned long int hostlong)。參數(shù) addrlen 指定這個(gè)套接字地址的長度。以上過程體現(xiàn)了 TCP 協(xié)議三次握手建立連接的思想。 套接字是面向客戶 — 服務(wù)器模型設(shè)計(jì),針對客戶和服務(wù)器提供不同的套接字操作。 Linux 網(wǎng)絡(luò)編程 —— 實(shí)現(xiàn)一個(gè)局域網(wǎng)的電子郵件系統(tǒng) 第二章 LINUX 網(wǎng)絡(luò)編程環(huán)境分析 第一節(jié) 套接字簡介 網(wǎng)絡(luò)程序設(shè)計(jì)全靠套接字( SOCKET)接收和發(fā)送信息。 關(guān)鍵字 : Linux, 網(wǎng)絡(luò)編程,套接字,服務(wù)器,客戶端,電子郵件系統(tǒng) Abstract The rapid development of the puter works has been making a great influence in many fields of human society. Among a great many works operating systems, Linux is obtaining more and more attention from people by its excellent this graduate design, our task is to develop a system based on a lan with Linux as its operating system. This article includes two parts. In part one, we will make an introduction to Linux operating system and the work programming environment in Linux. In particular, the BSD socket functions are analyzed in great detail, for they will be used in later programming work. In part two, we present the implementation of our mail system, from whole designing to detail designing, and the C program source files written by me is attached to the end of this article. Keywords: Linux, work programming , socket, server, client, system Linux 網(wǎng)絡(luò)編程 —— 實(shí)現(xiàn)一個(gè)局域網(wǎng)的電子郵件系統(tǒng) 目錄 第一部分 環(huán)境分析 第一章 LINUX 的發(fā)展歷史及趨勢 …………………………………… .3 第二章 LINUX 網(wǎng)絡(luò)編程環(huán)境分析 第一節(jié) 套接字簡介 ………………………………………… 4 第二節(jié) socket 編程的基本流程 …………………………… .4 第二節(jié) BSD 套接字函數(shù)介紹 ……………………………… 5 第二部分 郵件系統(tǒng)實(shí)現(xiàn) 第三章 郵件系統(tǒng)介紹 第一節(jié) 概述 ………………… ……………………………… 13 第二節(jié) 模塊劃分 …………………………………………… 14 第三節(jié) 服務(wù)器程序和客戶端程序的詳細(xì)設(shè)計(jì)與分析 …… 16 設(shè)計(jì)體會(huì)與致謝 ……………………………………………………………… .…29 參考文獻(xiàn) ………………………………………………………………………… .30 附錄 服務(wù)器程序和客戶端程序的源代碼 ………………………………………………… ..31 Linux 網(wǎng)絡(luò)編程 —— 實(shí)現(xiàn)一個(gè)局域網(wǎng)的電子郵件系統(tǒng) 第一章 LINUX 的發(fā)展歷史及趨勢 在迅猛發(fā)展的國際互聯(lián)網(wǎng)上,有這樣一群人,他們是一支由編程高手、業(yè)余計(jì)算機(jī)玩家和黑客們組成的奇怪隊(duì)伍,完全獨(dú)立的開發(fā)出在功能上毫不遜色于微軟的全新的免費(fèi) UNIX 操作系統(tǒng) —— Linux,成為網(wǎng)絡(luò)上一支不可輕視的力量,短短幾年時(shí)間就成了微軟的一個(gè)強(qiáng)勁對手。 LINUX 是什么?按照 LINUX 開發(fā)者的說法, LINUX 是一個(gè)遵循 POSIX 標(biāo)準(zhǔn)的免費(fèi)操作系統(tǒng)。什么是套接字?套接字的英文原意是“孔”或“插座”,作為 BSD UNIX 的進(jìn)程通信機(jī)制,取后一種意義??蛻綦S機(jī)申請一個(gè)套接字號,服務(wù)器擁有全局公認(rèn)的套接字號,任何客戶可以向它發(fā)出 連接請求和信息請求。 然后雙方可以通過操作各自的描述符來進(jìn)行傳輸數(shù)據(jù)。 * 套接字地址 結(jié)構(gòu) struct sockaddr 定義了一種通用的套接字地址,其定義如下: struct sockaddr { unsigned short sa_family。 unsigned short int htons(unsigned short int hostshort)。 } ret=connect(sock_fd,(struct sockaddr*)amp。 =htons(SERVER_PORT)。 參數(shù) sockfd 是被設(shè)置為傾聽的被動(dòng)套接字描述符,參數(shù) addr 是指向套接字地址結(jié)構(gòu)的指針,它將保持連接對端的地址信息。 write 和 read 相似,將返回實(shí)際寫出的數(shù)據(jù)的字節(jié)數(shù)。 if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==1){ perror(socket)。 while(1) { sin_size=sizeof(struct sockaddr_in)。s port)。 printf(totally %d bytes received\n\n,numbytes)。同 時(shí),客戶端調(diào)用界面提供模塊提供菜單式的操作界面,等待用戶根據(jù)菜單提示選擇需要的服務(wù),通信模塊將用戶選擇的服務(wù)用字符串的形式發(fā)送給服務(wù)器,服務(wù)器根據(jù)收到的字符串判斷用戶需要的哪種服務(wù),調(diào)用文件處理模塊中的相應(yīng)服務(wù)子程序(函數(shù))來提供特定服務(wù)。并修改保存該用戶郵件列表的文件。 ( 4)郵件編輯界面:當(dāng)用戶選擇“發(fā)郵件”進(jìn)入該界面。有件結(jié)構(gòu)定義見 18~25行。一行指的是一換行符 39。 MYPORT 為服務(wù)器端建立 SOCKET 連接使用的端口號。函數(shù)主要內(nèi)容為接受用戶第一次傳來的服務(wù)請求,決定提供注冊服務(wù)或登錄服務(wù),然后進(jìn)入相應(yīng)服務(wù)函數(shù)。 /*發(fā)送郵件功能服務(wù)器端函數(shù),315~372 行 */ b、客戶端服 務(wù)函數(shù): int RegisterCli(int sockfd)。參數(shù)為字符串形式的用戶名和密碼,當(dāng)服務(wù)器 收到登錄用戶傳來的用戶名和密碼,調(diào)用此函數(shù),查找 PASSWD 文件,若找到匹配的用戶密碼對,返回 TRUE( 1),否則返回 FALSE( 0)。以待通信 模塊將它發(fā)送到客戶端。 圖一展示了在 GNOME 圖形界面服務(wù)器程序和客戶端程序同時(shí)運(yùn)行于兩個(gè)虛擬終端的情形。 (2)郵件編輯功能:本郵件系統(tǒng)在用戶發(fā)郵件時(shí),輸入收信者地址、主題以及郵件正文采用在 命令行直接輸入的形式,這樣不利于郵件的編輯。實(shí)際上,通過幾個(gè)月的思考、學(xué)習(xí)和動(dòng)手,在完成任務(wù)的同時(shí),自己收獲頗多,分別總結(jié)如下: 熟悉了 LINUX 操作系統(tǒng)編程環(huán)境,熟悉 LINUX 網(wǎng)絡(luò)編程的基本思想,積累了一些 C 語言編程經(jīng)驗(yàn),自己的動(dòng)手能力得到提高。 22 char subject[MAXSIZE]。 43 int DelMailSev(int sockfd,char*Usr)。 68 } 69 while(waitpid(1,NULL,WNOHANG)0)。 65 close(new_fd)。 40 int SendMailList(int,char*)。 20 char to[MAXSIZE]。應(yīng)該說一接到這個(gè)任務(wù)感到有些無從下手,難度很大,但經(jīng)過幾個(gè)月來慢慢的斟酌,學(xué)習(xí) ,以及動(dòng)手編程,在不斷發(fā)現(xiàn)問題,解決問題的過程中,任務(wù)漸漸化整為零,化難為易,最終得到實(shí)現(xiàn)。只是接收時(shí)應(yīng)能區(qū)別它是附件文件,而非一般的文本文件。下面是 GNOME 圖形界面客程序運(yùn)行圖。參數(shù)為整形郵件代號,和字符串形式緩沖區(qū)。 int TestPasd(char*Usr,char*Pswd)。 /*閱讀郵件功能服務(wù)器端函數(shù), 276~297 行 */ int DelMailSev(int sockfd,char*Usr)。 服務(wù)“主函數(shù)” 當(dāng)主程序建立連接后,服務(wù)器和客戶雙方都進(jìn)入一個(gè)“主函數(shù)”,通過 層層調(diào)用各子程序完成郵件服務(wù)功能。 10~11 行是對文件處理模塊的包括。 讀寫函數(shù): 合理使用讀寫函數(shù)也是通信模塊實(shí)現(xiàn)