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

正文內(nèi)容

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

2025-01-07 02:48 上一頁面

下一頁面
 

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