freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

linux網(wǎng)絡(luò)編程——實(shí)現(xiàn)一個(gè)局域網(wǎng)的電子郵件系統(tǒng)-預(yù)覽頁(yè)

 

【正文】 完全獨(dú)立的開(kāi)發(fā)出在功能上毫不遜色于微軟的全新的免費(fèi) UNIX 操作系統(tǒng) —— Linux,成為網(wǎng)絡(luò)上一支不可輕視的力量,短短幾年時(shí)間就成了微軟的一個(gè)強(qiáng)勁對(duì)手。T)Bell 實(shí)驗(yàn)室 Dennis Ritchie 和 Ken Thompson 首先 PDP7 機(jī)器上實(shí)現(xiàn)了 UNIX 系統(tǒng)。 1991 年,一位來(lái)自芬蘭赫爾辛基大學(xué)的年輕人 Linus Benedict Torvalds 在實(shí)習(xí) Minix 時(shí)發(fā) 現(xiàn)它功能還很不完善,于是決心自己寫(xiě)一個(gè)保護(hù)模式下的操作系統(tǒng),這就是 Linux 的原型。目前 LINUX 的發(fā)展趨勢(shì)為分布式和嵌入式。 Linux 網(wǎng)絡(luò)編程 —— 實(shí)現(xiàn)一個(gè)局域網(wǎng)的電子郵件系統(tǒng) 第二章 LINUX 網(wǎng)絡(luò)編程環(huán)境分析 第一節(jié) 套接字簡(jiǎn)介 網(wǎng)絡(luò)程序設(shè)計(jì)全靠套接字( SOCKET)接收和發(fā)送信息。正 如打電話之前,雙方必須擁有各自的電話機(jī)一樣。 在 UNIX 系統(tǒng)中,任何對(duì) I/O 的操作都是通過(guò)讀或?qū)懸粋€(gè)文件描述符來(lái)實(shí)現(xiàn)的。一個(gè)套接字對(duì)應(yīng)一個(gè)文件描述符,由操作系統(tǒng)分配。 套接字是面向客戶 — 服務(wù)器模型設(shè)計(jì),針對(duì)客戶和服務(wù)器提供不同的套接字操作。通過(guò)流式套接字接收的數(shù)據(jù)順序和發(fā)送的數(shù)據(jù)順序是一致的。 Server 端首先調(diào)用 socket 創(chuàng)建一Linux 網(wǎng)絡(luò)編程 —— 實(shí)現(xiàn)一個(gè)局域網(wǎng)的電子郵件系統(tǒng) 個(gè)一定類(lèi)型的 socket。然后調(diào)用 connect 函數(shù)向 Server 所在主機(jī)發(fā)出連接請(qǐng)求,連接時(shí),需要指定Server 所在主機(jī)的 IP 地址和正在傾聽(tīng)的端口號(hào)。以上過(guò)程體現(xiàn)了 TCP 協(xié)議三次握手建立連接的思想。 當(dāng)數(shù)據(jù)傳輸完畢,雙方都調(diào)用 close()關(guān)閉各自套接字,終止通信。 以下代碼將創(chuàng)建一個(gè) TCP 的套接字描述符: int sock_fd=socket(AF_INET,SOCK_STREAM,0)。 函數(shù) connect() * 函數(shù)定義 函數(shù) connect()用于向服務(wù)器發(fā)出連接請(qǐng)求。參數(shù) addrlen 指定這個(gè)套接字地址的長(zhǎng)度。 每一種具體的協(xié)議簇都將定義自己的協(xié)議地址類(lèi)型, TCP/IP 協(xié)議簇定義了sockaddr_in 描述自身的協(xié)議地址: struct in_addr{ _u32 s_addr。 /*端口號(hào) */ struct in_addr sin_addr。有的系統(tǒng)設(shè)計(jì)時(shí),將變量的高端放在高字節(jié),有的恰恰相反。 Linux 系統(tǒng)提供了 4 個(gè)庫(kù)函數(shù)來(lái)進(jìn)行字節(jié)順序的轉(zhuǎn)化: includei/ unsigned long int htonl(unsigned long int hostlong)。 htonl 代表 host to work long對(duì) unsinged long int 型的變量轉(zhuǎn)化成網(wǎng)絡(luò)中使用的字節(jié)順序。 int ret,sock_fd。 =htons(SERVER_PORT)。 exit(1)。 exit(1)。在 server 進(jìn)程中,由于進(jìn)程通常使用的是一個(gè)熟知端口,所以需要調(diào)用 bind()向系統(tǒng)登記一個(gè)固定端口。 addrlen 為地址長(zhǎng)度,可設(shè)置為 sizeof(struct sockaddr)。 =AF_INET。serv_addr,sizeof(serv_addr))。對(duì)于一臺(tái)只有一個(gè) IP地址的主機(jī),它就對(duì)應(yīng)于它的 IP 地址。如果函數(shù)成功返回 0,否則返回 1。函數(shù)的形式如下: includesys/ int accept(int sockfd,struct sockaddr *addr,int *addrlen)。 當(dāng) accept()成功返回時(shí),將返回一個(gè)新的套接字描述符。 函數(shù) read()和 write() read()和 write()用于數(shù)據(jù)的接收和發(fā)送。 read 中的 buf 是應(yīng)用的發(fā)送緩沖區(qū),而 write 中的 buf 是應(yīng)用的接收緩沖區(qū)。如果 read 出錯(cuò),則返回 1,并設(shè)置 errno。 函數(shù) close() 函數(shù) close()用于關(guān)閉一個(gè)套接字描述符。進(jìn)程將不能再使用套接字描述符來(lái)訪問(wèn)套接字,但是 TCP 可能并沒(méi)有刪除套接字結(jié)構(gòu),因?yàn)榭赡茉诎l(fā)送數(shù)據(jù)緩沖區(qū)還有數(shù)據(jù)沒(méi)有發(fā)送完。這是套接字網(wǎng)絡(luò)編程最簡(jiǎn)單的應(yīng)用,后面實(shí)現(xiàn)的郵件系統(tǒng)就是在此基礎(chǔ)上做一些改動(dòng)和功能上的添加。 int sin_size。 } =AF_INET。(),8)。 } else printf(address binded successfully!\n)。 connect request......\n)。sin_size))==1) { perror(accept)。 close(new_fd)。 } 客戶端程序: /*頭文件同上 */ define MAXDATASIZE 100 int main(int argc,char **argv) { int sockfd,numbytes,servport。s ip address server39。 bzero(amp。 i_aton(argv[1],amp。 if((numbytes=recv(sockfd,buf,MAXDATASIZE,0))==1) { perror(recv)。 printf(Receive from server %s :\n %s,argv[1],buf)。 return 0。由于是為了實(shí)習(xí)目的模擬現(xiàn)實(shí)的郵件系統(tǒng),該郵件系統(tǒng)較現(xiàn)實(shí)中的郵件系統(tǒng)功能上有較大的簡(jiǎn)化。服務(wù)器和客戶 端共同完成的通信功能可使用 LINUX 系統(tǒng)提供的BSD SOCKET 網(wǎng)絡(luò)編程接口實(shí)現(xiàn)。基本結(jié)構(gòu)如下: 服務(wù)器主程序調(diào)用以下兩大模塊: 服務(wù)器文件處理模塊 ⑴信件管理子模塊 (打開(kāi)郵件 列表,打開(kāi)郵件,刪除郵件) ⑵用戶信息管理子模塊 (保存帳號(hào)密碼對(duì),驗(yàn)證密碼) 服務(wù)器通信模塊 (服務(wù)器向客戶傳郵件,服務(wù)器向客戶傳服務(wù)響應(yīng)信息) 客戶端主程序調(diào)用以下兩大模塊 客戶端界面提供模塊 客戶端通信模塊 (客戶向服務(wù)器傳郵件,客戶向服務(wù)器傳服務(wù)請(qǐng)求信息) 我們實(shí)現(xiàn)的郵件系統(tǒng)的運(yùn)行大致過(guò)程為:服務(wù)器和客戶機(jī)分別進(jìn)入主程序,調(diào)用各自通信模塊建立連接。這兩個(gè)子模塊功能上是獨(dú)立的,各自包含一些服務(wù)子程序。 每個(gè)用戶擁有一個(gè)郵件列表文件。用一個(gè)函數(shù)讀取該用戶的郵件信息文件,產(chǎn)生一個(gè)郵件列表的臨時(shí)文件,并通過(guò)通信模塊將該臨時(shí)文件的內(nèi)容傳至客戶機(jī)。根據(jù)用戶名及用戶傳過(guò)來(lái)的待刪郵件的號(hào)碼利用系統(tǒng)調(diào)用將相應(yīng)郵件刪除。 ( 2)驗(yàn)證密碼:在用戶登錄,并發(fā)送帳號(hào)密碼到服務(wù)器后調(diào)用此功能。 服務(wù)器端通信模塊 服務(wù)器程序 在啟動(dòng)時(shí)便調(diào)用 SOCKET 函數(shù)族,創(chuàng)建套接字,綁定端口,開(kāi)始等待客戶端的連接。采用字符菜單界面的形式。 ( 3)進(jìn)入 郵箱界面:打印郵件列表,提供“讀郵件”,“發(fā)郵件”,“刪除郵件”,“退出郵箱”,“注銷(xiāo)用戶”等命令選擇。 ( 5)讀郵件界面:當(dāng)用戶選擇“讀郵件”命令,服務(wù)器將要讀的郵件傳送到客戶端,在標(biāo)準(zhǔn)終端顯示。此模塊與服務(wù)器不同的是需要知道服務(wù)器工作在哪個(gè)端口,這里存在一些技術(shù)問(wèn)題,這個(gè)問(wèn)題將在后面進(jìn)行討論??蛻舳顺绦蚍旁谝粋€(gè)文件 中( 375~758 行)。一個(gè)郵件結(jié)構(gòu)包括以下幾項(xiàng):收信者,Linux 網(wǎng)絡(luò)編程 —— 實(shí)現(xiàn)一個(gè)局域網(wǎng)的電子郵件系統(tǒng) 發(fā)信者,主題,郵件正文,發(fā)信時(shí)間,郵件編號(hào)等等。所以在客戶端與 服務(wù)器通信的過(guò)程中,必須有嚴(yán)格的同步控制。 用于同步的函數(shù)有以下一對(duì): int SendSockChar(int sockfd,char ch):發(fā)送一個(gè)同步字符。函數(shù)實(shí)現(xiàn)見(jiàn) 175~179 行。在利用系統(tǒng)函數(shù) read(),write() 的基礎(chǔ)上,還另外使用了幾個(gè)自編的函數(shù): readline(),sockendl(),CutEndl(),分 別說(shuō)明如下: int readline(int,void*,int): 從套接字中讀取一行內(nèi)容。此函數(shù)引自參考書(shū) [1], P79。函數(shù)SOCKENDLINE 實(shí)現(xiàn)補(bǔ)發(fā)換行符的功能。 CutEndl 函數(shù)在必要的時(shí)候去掉剛剛接收到的字符串的末尾的換行符。 13~16 行定義了一些常量, MAXSIZE 為緩沖區(qū)的最大容量。 主程序 服務(wù)器主程序:主程序用于初始化服務(wù)器的地址信息,創(chuàng)建套接字開(kāi)始傾聽(tīng),等待連接,當(dāng)服務(wù)器進(jìn)程接收到一個(gè)連接,用系統(tǒng)調(diào)用 FORK 創(chuàng)建一個(gè)子進(jìn)程為客戶服務(wù),父進(jìn)程繼續(xù)在端口上等待連接。 客戶端主程序:客戶端的 main()函數(shù)比服務(wù)器的更加簡(jiǎn)單。 “連接函數(shù)” 為了使主程序簡(jiǎn)潔,用套接字建立連接的過(guò)程都寫(xiě)進(jìn)一個(gè)函數(shù),用主程序來(lái)調(diào)用。 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é)束。 b、 客戶端主函數(shù) int ClientMain(int sockfd): 客戶端主程序建立好與服務(wù)器的連接后,調(diào)用此 函數(shù),實(shí)現(xiàn)對(duì)用戶的郵件服務(wù)。這些函數(shù)在服務(wù)器和客戶端成對(duì)出現(xiàn),從而能實(shí)現(xiàn)成功的通信功能。 /*登錄功能服務(wù)器端函數(shù), 192~213 行 */ int MailService(int sockfd,char*Usr)。 /*刪除郵件功能服務(wù)器端函數(shù),299~313 行 */ int SendMailSev(int sockfd,char*Usr)。 /* 登錄功能客戶端函數(shù) ,513~527 行 */ int MailClient(int sockfd)。 /* 發(fā)郵件功能客戶端函數(shù), 714~758 行 */ 流程圖 以下是服務(wù)器程序和客戶端程序的流程圖,從圖中可以看到本地各函數(shù)的調(diào)用關(guān)系,和兩端對(duì)應(yīng)函數(shù)的對(duì)應(yīng)關(guān)系。 保存用戶密碼對(duì)。 驗(yàn)證密碼。 形成郵件列表臨時(shí)文件。 int StoreMail(MailStruct * Mail)。函數(shù)調(diào)用見(jiàn) 366 行。當(dāng)服務(wù)器收到欲讀郵件的客戶發(fā)過(guò)來(lái)的郵件代號(hào),根據(jù)該代號(hào)在相應(yīng)文件中查找到欲讀的郵件,把內(nèi)容寫(xiě)到一個(gè)緩沖里,用 BUF 返回。 Linux 網(wǎng)絡(luò)編程 —— 實(shí)現(xiàn)一個(gè)局域網(wǎng)的電子郵件系統(tǒng) 刪郵件。 以上六個(gè)函數(shù)由合作者唐志軍實(shí)現(xiàn),限于篇幅,不列出具體實(shí)現(xiàn)的源代碼。實(shí)際運(yùn)行環(huán)境為 REDHAT LINUX 。 LINUX 截圖程序得到。用戶選擇注冊(cè)功能,注冊(cè)了一個(gè)新用戶tangweii. 圖四展示用戶 tangzj 的登錄狀況。 tangzj 選擇發(fā)郵件命令,給 ducktang 編輯了一封郵件并發(fā)出。 (1)發(fā)附件:本郵件系統(tǒng)沒(méi)有發(fā)附件功能。也就是附件的文件類(lèi)型應(yīng)該用文本形式另外發(fā)送,這樣才能讓接受者知道福附件到底是什么文件。設(shè)想可以調(diào)用 VI 等編輯程序,將郵件內(nèi)容編輯好了,再采用發(fā)送文件的方式發(fā)郵件。 (4)服務(wù)器端口號(hào)問(wèn)題:在上一節(jié)介紹 客戶端通信模塊時(shí)提到一個(gè)問(wèn)題,即客戶程序必須知道服務(wù)器程序的 IP 地址和端口號(hào), IP 地址是固定的,但端口號(hào)卻不一定固定。我們實(shí)現(xiàn)的郵件系Linux 網(wǎng)絡(luò)編程 —— 實(shí)現(xiàn)一個(gè)局域網(wǎng)的電子郵件系統(tǒng) 統(tǒng)不能使用保留端口號(hào),所以服務(wù)器程序中 綁定的端口號(hào)有可能已被其他程序使用。在這一過(guò)程中,實(shí)現(xiàn)老師給出這一任務(wù)的初衷,不要求做出來(lái)的東西有多完美,只要求在動(dòng)手的過(guò)程中能學(xué)到書(shū)本上學(xué)不到的東西。 鍛煉了自己現(xiàn)學(xué)現(xiàn)用的能力,許多東西以前都沒(méi)有接觸過(guò),通過(guò)查閱參考書(shū)能夠快速的使用。 鍛煉了團(tuán)隊(duì)合作能力。 再次感謝沈明玉老師的指導(dǎo)和唐志軍的合作。 21 char from[MAXSIZE]。 25 }MailStruct。 31 int readline(int,void*,int)。 36 int RecvUsrPswd(int,char* ,char* )。 Linux 網(wǎng)絡(luò)編程 —— 實(shí)現(xiàn)一個(gè)局域網(wǎng)的電子郵件系統(tǒng) 41 42 int ReadMailSev(int sockfd)。 49 struct sockaddr_in their_addr。 57 new_fd=accept(sockfd,(struct sockaddr*)amp。 60 continue。 66 } 67 close(new_fd)。 78 79 ptr = vpt
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報(bào)告相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1