




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 2014屆畢業設計說明書 基于linux操作系統的聊天軟件的設計 學 院: 電氣與信息工程學院 學生姓名: 指導教師: 職稱 講師 專 業: 電子信息工程 班 級: 電子1002班 完成時間: 2014年5月 摘 要 這篇論文整體是在linux下并通過網絡實現類似于qq的的一篇操作報告。開發的框是c/s框架,由server端和client端組成,首先設置好端口參數和ip地址,在編譯,調試后實現server端與各個client端的連接,連接后以后server端作為中間端來使客戶機實現通訊,因為服務器只存在一個但是客戶端存在多個所以我們必須通過鏈表去管理,client端的信息發送通過封裝在soc
2、ket結構體中進行傳輸。本設計采用tcp/ip協議這樣可以保證連接可靠,而且項目管理中釆用linux流行的gcc和makefile編譯,大大提高了編譯和調試效率,提高了項目完成的效率,但是為了模擬幾個client端我們就需要在pc機上再安裝一個虛擬系統來操作client端。本次設計的聊天通信使用全雙工,主要實現了功能如:用戶的帳號與密碼的注冊與登錄,客戶點對點聊天,客戶之間的群聊,以及文件的發送與接收。測試運行后的可靠性滿足linux網絡聊天的基本要求。關鍵詞:linux, socket, ,server端,client端,網絡編程 abstract this thesis as a whol
3、e is under linux platform and through the local area network to achieve similar qq chat. the overall use of c / s framework, the main server -side and client into two parts , set ip and port number , and linux, compile and debug procedures to achieve client and server connections each client side ,
4、and then as the server -side following transfer to achieve communication between client end . since only one server -side , and you can have multiple client end , so the server side using a single list to manage multiple client side information , client side encapsulated for transmission of informat
5、ion sent through the body in the socket structure . this design uses the tcp / ip protocol ,so you can ensure reliable connection, but also preclude the use of project management in a popular linux gcc and makefile to compile, compile and debug greatly improved efficiency , improve the efficiency of
6、 the completion of the project, but due to simulate multiple client end therefore, in the operating environment need to install a virtual system on the pc to operate multiple client side . the chat tool designed for full-duplex communication using communication , to achieve the five main functions:
7、to-peer chat between new user registration and login, user , group chat among users , file encryption transmission between users. after running the test program to meet the basic needs of network reliability in linux in chat .keywords : linux, socket, server -side , client end , network programming
8、目 錄 1 緒 論11.1 課題研究的背景及意義11.2 tcp/ip介紹21.3 本文的研究內容42 技術說明與方案選擇52.1通信方式52.1.1 udp通信52.1.2 tcp通信52.2客戶/服務器模型62.3網絡套接字(socket)的概念72.4多線程的概念72.5i/o多路復用83 系統實現113.1 linux提供的有關socket的系統調用113.2 實驗過程說明(使用tcp/ip)133.3 tcp通信實現144 運行效果29結束語34致謝35參考文獻36附錄a 服務器程序38附錄b 客戶端程序47 1 緒 論 1.1 課題研究的背景及意義隨著計算機應用技術的日益普及,網絡
9、也遍及到我們生活的每個角落,很好的利用這一資源,將成為我們工作和學習,帶來極大的方便。并且可以極高的提高我們的工作效率。所以,各種聊天軟件應運而生了。如國外的msn等,國內主要的有騰訊的qq,還有ticq和一些在網頁上的即時通訊工具,像chinaren網站上的webmaster等等,都做得即美觀又強大,騰訊的qq有非常大的用戶群。這些網絡聊天軟件極大程度上方便了處于在世界各地的友人之間的聯系,無論你和親人、朋友相隔多遠,你都可以隨時隨地和他們交流。并且,你還可以和外國友人交流學習。在網絡發展上,最早出現的是分布在很大的地理范圍內的遠程網絡(wideareanetwork,wan),例如美國國防
10、部高級研究計劃局首先研制的 arpa 網,它從 1969 年建立,至今已經發展成為跨越幾大洲的巨型網絡。70 年代中期由于微型計算機的出現和微處理器的出現,以及短程通訊技術的迅猛發展,兩者相輔相成,又促進以微機為基礎的各種局域網絡(local area network,lan)的飛快發展,1975 年美國 xerox 公司首先推出了 ethernet,與此時英國劍橋大學研制成劍橋環網,他們是 lan 的代表。lan 與 wan 有所區別,其特點為:1)有限的地理范圍,通常網內的計算機限于一棟大樓,樓群或一個企業及單位。2)較高的通訊速率,大多在每秒 1-100m bps ,而 wan 大多在幾
11、十 kbps。3)通訊介質多樣。4)通常為一個部門所擁有。特別是 80 年代以來,以微機為基礎,lan 技術有了極其迅速的發展。90 年代計算機網絡化大趨勢尤為明顯。具稱 1978 年全世界約有 700 萬人每天使用計算機,而到 1998 年上升到 5000 萬人,目前全世界已經擁有超過一億臺的計算機,預計每天上機人數可達 2 億以上。計算機的性能價格比以每年 25%的速度在提高。微機的應用已經滲透到國民經濟的各個部門,乃至家庭和個人。這標志著正步入信息時代,世界范圍內的社會信息數據正在每年增長 40%到 45%的年增長率在增加,這就是迫切實現網絡化的動力源泉。據稱,約有 65%的計算機要聯網
12、或已經聯網,以求彼此通信,達到資源共享的目標。90 年代計算機網絡化更加向深度和廣度方向發展。人們要求網絡傳輸的內容范圍增加,諸如數據之外,還需傳輸聲音,圖形,圖象和文字,這就是以網絡為基礎的多媒體技術,使網絡的應用廣度更加擴大,并最終為信息化社會的實現所必須的網絡連接奠定基礎。當前國際 lan 的市場上,兩雄稱霸,龍爭虎斗的局面,將可能持續相當長一段時間。正如大家知道的那樣,80 年代后期美國 novell 公司先是以“一花獨秀,壓倒群芳”之勢占據了國際 lan 市場 60%以上,一路領先,扶搖直上,尤其是 netware 386 v3.11 版推出后,受到普遍的注目;隨后,國際上的軟件公司
13、龍頭老大 microsoft 公司先后推出了lan manager v1.0(即 lan 3+ open)、lan manager v2.0 和 v2.1,后來居上,成為世界lan 的兩大支柱之一。1992 年 10 月 microsoft 又搶先發布了 lan managerv2.2,以更加領先于 novell 的 netware 386 v3.11,但后者立即隨后推出了 netware 4.0??梢姟褒垹幓⒍贰保戏质袌龅那榫?。novel lan 采取了“將網絡協議軟件與網絡操作系統 netware 緊密結合起來”的設計構想,可達到節省開銷,提高運行效率之目標。novell lan 最大的
14、特點是與其底層的網卡的無關性,即是說 netware 可以虛擬的在所有流行的 lan 上面運行,使它成為一個理想的開發網絡應用軟件的平臺,吸引了廣大用戶軟件人員為之開發越來越多的網絡應用軟件。反過來又推動其發展,同時 novell lan 采取了開放協議技術(opt),允許各種網絡協議緊密結合,進而在 netware 386 v3.11 版中采用了 nlm 模塊的組合技術,可以實現異機種聯網的難題。此外,novell lan 不需專用服務器,占用工作站內存最小,使用方便,功能強,效率高,兼容性強,可靠性高,保密性強,容錯性好。尤其在 netware 386 v3.11版中實現了服務器軟件的“分
15、布式結構策略”、“橫向信息共享”、“報文傳送”技術、增添了“tcp/ip 棧”、實現了“sna 協議”和“開放式數據鏈路接口”等一系列新技術,使 novelllan 更深入人心,擴大了市場。與此同時,微軟的lan manager v2.1和v2.2局域網版除了有一般的基礎的優點,還應用了“客戶機服務器”(client/server)的強大內網絡體系結構,以及基于多用戶,多任務并發先進的 os/2 作為服務器,并以 os/2,unix, vms 和 windows nt 作為系統的開發平臺,更方便與異類機種訪問網絡。由于 lan manager與 windows 的聯系;使它有更高的的性格比。在
16、網絡化技術飛速發展的今天,tcp/ip 協議可謂是立下了汗馬功勞。起先,tcp/ip(transmission control protocol/internet protocol)是由美國國防部于 70 年代提出來的,將中大型機連成的網絡互連起來,并按 tcp/ip 協議這種模式實現異網之間通訊,接著美國國防部高級計劃局(darpa)于 70 年代末提出了幾種國際互連(internet)技術。這些技術實現了在科學研究,軍事和社會生活迫切需要共享的資料。題1.2 tcp/ip介紹transmission control protocol/internet protocol的簡寫,中譯名為傳輸控
17、制協議/因特網互聯協議,又名網絡通訊協議,是internet最基本的協議,internet國際互聯網絡的基礎,由網絡層的ip協議和傳輸層的tcp協議組成。tcp/ip 定義了電子設備如何連入因特網,以及數據如何在它們之間傳輸的標準。協議采用了4層的層級結構,每一層都呼叫它的下一層所提供的協議來完成自己的需求。通俗而言:tcp負責發現傳輸的問題,一有問題就發出信號,要求重新傳輸,直到所有數據安全正確地傳輸到目的地。而ip是給因特網的每一臺電腦規定一個地址。(1) 協議優勢在社會長期的發展過程中,ip逐步取代了其余的網絡。這是一個簡單的解釋。ip傳輸通用數據。數據能夠用于任何目的,并且能夠很輕易地
18、取代以前由專有數據網絡傳輸的數據。(2)協議的缺點第一,協議在服務,接口方面的區分不明確。好的軟件工程在功能與實現上面是有明確的區分的,tcp/ip沒有很好地做到這點。第二,主機-網絡層本身并不是實際的一層,它定義了網絡層與數據鏈路層的接口。1.3 linux介紹 linux是一種開源的操作系統,它擁有像windows和mac那樣的功能齊全的ui界面(gui,graphical user interface)。linus torvald。作為一種很棒的操作系統,它具有與unix,mac,windows和windows nt相似的的功能,但是其中又會有不同的地方。 提到linux我們一定要知道g
19、nu和unix。richard m.stallman創建的自由軟件聯盟推出了兩種許可證,gnu是通用公共許可證(gnu gneral public license,gpl)和gnu函數庫通用公共許可證(gnu library gneral public license,lgpl)。除了一些庫是以gnu函數庫通用公共許可證發行的,其他基本上gnu工程的軟件和文檔是以gnu通用公共許可證為基礎發布的。按照gnu的相關規定,linux的源代碼可以在網上免費自由獲取,這一點為我們學習者提供了極大的方便。gpl極大的體現了stallman的思想:只要用戶所做的修改是有利于系統發展的,用戶可以自由地使用、
20、拷貝、查詢、重用、修改也可以發布這個修改后的軟件。就這樣gpl保證了linux的優點不僅現在自由可用,而且經過修改后的系統都仍然可以自由使用。 unix是由att貝爾實驗室的ken thompson和dennis ritchie在已經廢棄了的pdp-7上開發的在1969年;剛開始它是一個僅用用匯編語言單編寫的一個建議的單用戶用戶操作系統。后來,又在pdp-11上用c語言重新編寫系統,把unix做成為了一個文本處理系統,這樣極大的促進了unix在貝爾實驗室得的使用。unix的最初版本不收費的供應給眾多的大學的計算機系去使用。加州大學伯克利分校的計算機系就是在這眾多的大學中,并對unix進行了完善
21、并且增加了許多新的特點,這就是被廣大的開發者所熟知的的bsc版本的unix。在這個事間的同時,很多其他的的unix版本也開始萌生。unix不斷發展壯大,許多版本被應用到不同類型的的計算機使用。而linux最初就是專門為intel的個人計算機設計的。(1)linux的昨天 1991年,一名叫linus torvalds的芬蘭大學生覺得unix各種版本對于一個類型的機器的兼容性比較差(80386類的機器),于是他決定要開發出一個全功能的、并且支持posix標準的、類似于unix的操作系統的系統內核,該系統取得了bsd和system v 的精華,同進去除了它們的糟粕。他將內核開發到了0.02版,這個
22、版本中已經可以運行gcc、bash和其他少量的應用程序。后來他在英特網的幫助下在在1994年將linux升級到1.0版本。它的源代碼量也呈指數形式迅速增長,實現了基本的tcp/ip功能,在此同時大約有100000用戶開始使用linux操作系統了,linux系統開始被廣大的用戶所認可。(2) linux的今天 作為服務器級的操作系統,在廣大的開發者的共同努力下linux操作系統已經非常成熟了?,F在的linux內核集成了150萬多行代碼,不僅可以作為web服務器平臺,而且也為越來越多的用戶提供文件和打印服務。它既被當作郵件服務器的一種候選平臺,也被當作一種強壯而安全的防火墻。 linux的企業級特
23、性:linux系統不僅支持多處理器、支持大型文件系統、日志文件系統而且在密集型計算和高可用性集群技術上面也逐步成熟。 現在的linux的ui界面也在繼續完善。kde桌面提供的圖形用戶界面在易用性和可配置方面和微軟的windows不相上下。(3) linux的明天 linux最強大的生命力在于其開源。每學習者都有可以輕松自由的獲取內核源代碼,每個人都可以運載源程序并對其加以修改,而后的他人也可以自由獲取你修改后的源程序。集市模型就是為linux這種獨特的自由流暢的開發模型已被命名。集市模型是通過重視實驗征集和充分利用早期的反饋,通過平衡的配置腦力資源,從而開發出更優秀的軟件。 1.4 本文的研究
24、內容本課題的任務是設計一個支持多人群聊以及用戶間私聊和文件傳送的聊天系統。首先服務器會初始化,然后等待客戶端的連接。每連接一個客戶端就簡歷一個線程去監聽客戶端請求。客戶端是注冊好了的,只需要登陸??蛻舳俗猿晒芽蛻舳诵畔⒈4娴芥湵砗臀募?。注銷時會把對應的鏈表節點銷毀,并且刪除文件對應信息。當有多個客戶端登陸時,客戶端界面會顯示其他用戶的用戶名??梢詫崿F用鍵選擇,然后按回車鍵進入與其的私聊界面。然后可以和其進行私聊和文件傳送。而好友界面的倒數第二個為群聊選擇,當進入群聊時,可以實現多人同時聊天。另外,如果其他人下線時。你的顯示好友界面里的那個客戶端就會消失,同時,有人上線時,會在好友欄加上
25、新加的客戶端。最后一個選項是退出,銷毀對應線程及文件描述符。 2 技術說明與方案選擇 2.1 通信方式2.1.1 udp通信 udp是用戶數據報協議的簡稱。udp在傳送數據之前不需要先建立連接,遠地主機的傳輸層在收到udp數據后,不能給出任何確認信息,所以不能保證其交付時信息的可靠性。它的特點是:無連接,不能提供的可靠的信道,但正是因為無連接這個特點使udp具有很好的傳輸效率。2.1.2 tcp通信 tcp是傳輸控制協議的簡稱,tcp可以提供一條全雙工的、可靠的信道。tcp在數據傳送之前必須先建立相應的連接,數據傳送完成后必須釋放連接。但是tcp不能提供廣播和多播這些信息服務。 正是因為tcp
26、要提供可靠的、面向連接的運輸等多樣的服務,所以增加了額外的系統開銷,例如確認、流量的控制、計時器以及連接管理等服務都需要消耗許多系統資源。 如果計算機之間使用通信方式是tcp通信,則計算機之間的連接過程需要三次握手實現,如下圖1-1所示。 圖1-1 用三次握手建立tcp連接 對于計算機連接的釋放過程也需要類似的3次握手的互相確認的過程,如實驗圖1-2所示。 圖1-2 tcp連接的釋放過程通過以上兩種方案的比較,考慮適用性,本次課題我選擇了選擇tcp通信協議。2.2 c/s模型c/s模型將應用程序分為server端和client端兩基本的部分,client端對server端發送請求,server
27、端對其作出相應的回應并開始提供服務。在tcp/ip應用中,多數網絡應用程序是使用c/s模型設計的。server端一直處于等待狀態,當一個client端提出請求時。server端馬上會根據client端發送的請求從而執行對應操作以至于達到server端的要求。通常,c/s模型必須包含兩個獨立的應用程序:client端和server端的應用程序。在c/s模型中,多個在同樣的內網中的計算機都作為client端,與端口號和ip進行連接,并通過server端傳遞信息。所以client端的通信既可以理解為client端和server端之間的通信。所以采用c/s模型進行網絡聊天系統的設計需要分別編寫clie
28、nt端和server端的源代碼,client端和server端之間相互通信的程序流程如實驗圖1-3所示。 圖1-3 socket通信流程圖2.3 網絡套接字(socket)的概念socket接口是tcp/ip的api,它提供了相應的功能函數與例程,我們可以使用對應的函數與例程進行tcp/ip應用程序的開發與維護。使用socket套接字進行網絡通信的開發過程如下面的步驟:(1) 建立一個socket套接字(2) 按我們所需要的要求配置好socket套接字,將socket連接到遠程server端或者是本機server端或給socket套接字指定本地協議端口號。(3) 按要求通過socket套接字發
29、送和接受相應的數據與信息。(4) 完成通信以后我們需要關閉此socket套接字并且釋放相應的其他銷耗系統的操作。以上就是通過socket套接字來實現點對點信息通信的4個編程的核心要點。2.4 系統的選擇方案一:紅帽子系統即red ha系統是目前銷售量最高、安裝最簡便、最適合初學者的linux發行版,也是目前世界上最流行的linux發行套件,它的市場營銷、包裝及服務做的相當不錯,自行開發了rpm套件管理程序及x桌面環境gnome的眾多軟件并將其源代碼回饋給open source community。也正是因為red hat的方便性,安裝程序將系統的構架或軟件安裝方式全部做了包裝,用戶學到的都是g
30、ui界面(圖形用戶界面)上輸入一些設置值的粗淺知識,至于軟件安裝了那些文件、安裝到哪個文件目錄、系統作了哪些設置,使用者則一無所知,一旦真正遇到系統程序發生問題時,要解決問題也就比較困難。方案二:caldera openlinux系統,caldera將openlinux這套系統定位為容易使用與設置的發行版,以集成使用環境與最終用戶辦公環境,容易安裝使用與簡便管理為系統目標,有望成為最流行的公司團體臺式linux操作系統,適合初學者使用,全部安裝需要1gb的硬盤空間。caldera有自行研發的圖形界面的安裝程序向導,安裝過程可以玩俄羅斯方塊,提供完整的kde桌面環境,附贈功能強大的商業軟件,如s
31、taroffice、圖形界面的硬盤分割工具partition magic等。方案三:suse linux系統,suse是歐洲最流行的linux發行版,而且suse是軟件國際化的先驅,讓軟件支持各國語系,貢獻頗豐,suse也是用rpm作為軟件安裝管理程序,不過suse并不適合新手使用,提供了非常多的工具軟件,全部安裝需4.5gb的硬盤空間,安裝過程也較為復雜。通過以上三種方案的比較,考慮適用性,和可操作性,選擇red hat linux 操作系統。2.5 開發工具的選擇方案一:vi編輯器,vi編輯器是linux上最基本的文本編輯器,它是以字符模式為核心的。由于去除了ui界面,使vi編輯器效率提高
32、了很多。在linux上也有許多ui界面的編輯器,但vi在系統和服務器管理中的相應的功能是ui編輯器不可以達到的。vi編輯器在linux上的重要性是與edit在dos上的地位是一樣。vi編輯器可以執行文字輸出、文字刪除、文字查找、文字替換、文件塊操作等眾多文本操作,用戶也可以根據自身的需要對其進行相應的定制和二次開發,這是其他編輯程序所不能達到的效果。加上紅帽子系統中自帶的gcc編譯器和gdb調試工具,所以linux系統目前最主流的開發工具。方案二:用eclipse 加cdt+gcc+gdb,雖然eclipse 擁有方便的ui界面,配置開發環境有點復雜,如果配置好了,開發的效率還是不錯的。和在w
33、indows下開發基本相似。用eclipse+cdt可以自動生成makefile文件,比較適合偏愛圖形界面的開發人員。通過以上兩種方案的比較,考慮適用性,和編程習慣,選擇方案一。 2.6 多線程與多進程點對點通信的實現知識,了解了主機進程與服務器進程之間的連接關系,建立連接了一對一的進程聯系,即主機的一個進程必須與服務器的一個進程之間建立相應的連接。而對于每一個client端服務器都要建立一個相應的進程去實現和client端的通信。 對于線程的并發情況我們就要建立多個線程去出來。由于服務端接受信息的行為是被動的,當服務端沒有信息可以接收時,該進程就應該自動的阻塞,發送任務也應該一起被阻塞。不同
34、端口的收發之間就存在并發情況,這樣我們就應該應該建立多個不同的進程去分別完成信息的收發。這樣,當一個client端的請求被阻塞時,不至于影響其它的client端的正常工作。關于多進程和多線程,我覺得最核心的一句話是“進程是資源分配的最小單位,線程是cpu調度的最小單位”。方案一:多進程,數據共享非常復雜,需要用ipc處理;數據是分開處理的,同步比較簡單;但是內存耗的多,切換相應的會比較復雜,cpu利用率低創建銷毀、切換復雜,速度慢;編程簡單,調試簡單;適應于多核、多機分布式;如果一臺機器不夠,擴展到多臺機器比較簡單。方案二:多線程,他的優點在于共享進程間的數據,數據共享就變的十分的簡單,并且創
35、建銷毀、切換簡單,速度很快,缺點也由于這個原因導致同步復雜;雖然占用內存少,切換簡單,但是cpu利用率高,編程復雜,調試復雜;一個線程死掉將導致整個進程失去功能,。通過以上兩種方案的比較,考慮適用性,選擇多線程實現對客戶端的監聽。2.7 i/o多路復用除了可以采用多進程和多線程方法去實現并發情況之外,還可以采用i/o多路復用這門技術來實現。通過該技術,系統內核首先會緩沖i/o數據,當某個i/o準備好后,系統自動通知相應的應用程序去完成i/o讀或寫操作,這樣應用程序可以迅速的完成對應的i/o操作,因而系統不需要等待完成相應i/o操作,從而應用程序設置阻塞。因此我在收發信息方面使用了i/o多路復用
36、去處理,即在處理群聊私聊的信息傳送時。對于client端,一旦我們輸入了一行文字發,系統會自動的讀取,進而發送給系統內的server端,然后由server端反饋給對應的目標client端。方案一:當我們使用的poll函數返回時,會返回一個文件是讀寫標志,應用程序根據不同的返回標志去讀寫相應的文件,實現不用阻塞就可以完成讀寫。這允許進程來決定那個client端是可讀或寫一個或多個文件而不用阻塞的。poll返回不同的標志,這些標志告訴主進程文件是否可以讀寫,其原型(定義在 ):unsigned int (*poll) (struct file *filp, poll_table *wait);實現
37、這個設備的方法分為下面的兩步:1. 在一個或多個可指示查詢狀態變化的等待隊列上調用 poll_wait. 當文件描述符不可以可用來執行 i/o時, 內核將使這個進程在處于等待狀態,一旦又來可使用的文件描述符時,. 驅動自動的通過調用函數 poll_wait增加一個新的等待隊列到 poll_table結構,原型:void poll_wait (struct file *, wait_queue_head_t *, poll_table *);2. 返回一個位掩碼:我們在處理某一些功能時不必要阻塞,需要立刻進行的操作,那么我們就需要下面的幾個標志(通過 定義)用來指示可能的操作,如表2-1所示:標
38、志 含義 pollin 如果設備無阻塞的讀,就返回該值 pollrdnorm 通常的數據已經準備好,可以讀了,就返回該值。通常的做法是會返回(polllin|pollrdnora) pollrdband 如果可 以從設備讀出帶外數據,就返回該值,它只可在linux內 核的某些網絡代碼中使用,通常不用在設備驅動程序中 pollpri 如果可 以無阻塞的讀取高優先級(帶外)數據,就返回該值,返回該值會導致select報告文件發生異常,以為select八帶外數據當作異常處理 pollhup 當讀設 備的進程到達文件尾時,驅動程序必須返回該值,依照select的功能描述,調用select的進程被告知進
39、程時可讀的。 pollerr 如果設 備發生錯誤,就返回該值。 pollout 如果設備可以無阻塞地些,就返回該值 pollwrnorm 設備已經準備好,可以寫了,就返回該值。通常地做法是(pollout|pollnorm) pollwrband 于pollrdband類似表2-1 poll函數返回的位掩碼及其含義 方案二:select函數:select()函數的接口主要以fd_set類型為基礎而建立的。fd_set)是一組文件描述符(fd)的大集合。由于在不同的平臺上fd_set類型的長度是不同的,因此規定用一組標準的宏定義來處理此類變量顯得尤其重要: fd_set set;fd_zero(
40、&set); fd_set(fd, &set); fd_clr(fd, &set); fd_isset(fd, &set); 在過去,一個fd_set通常是小于32個文件描述符的,因為fd_set其實僅僅使用了一個int的比特矢量來實現它。在大多數情況下系統的責任之一包括檢查 fd_set能包括任意值的文件描述符,但是當我們知道我們的文件描述符的多少時你應該檢查/修改宏fd_setsize的值。這個值是與系統相關的,同時我們也要檢查linux系統中的自帶的select() 的man手冊。因為有一些系統對多于1024個文件描述符的fd_set是存在支持的問題的。譯者注: linux就是這樣的系統
41、!你會發現sizeof(fd_set)的結果是128(*8 = fd_setsize=1024) 盡管很少你會遇到這種情況。select的基本接口其實是非常的簡單的:int select(int nfds, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout); 其中: nfds 需要檢查的文件描述符個數,數值應該比是三組fd_set中最大數 更大,而不是實際文件描述符的總數。readset 用來檢查可讀性的一組文件描述符。writeset 用來檢查可寫性的一組文件描述符。exceptset
42、 用來檢查意外狀態的文件描述符。(注:錯誤并不是意外狀態)timeout null指針代表一直等待,否則是指向timeval結構的指針,代表最 長等待時間。(如果其中tv_sec和tv_usec都等于0, 則文件描述符 的狀態不被影響,但函數并不掛起) 函數將返回響應操作的總的響應了的描述符,且三組數據均在恰當位置被修改,只有響應操作的那一些沒有修改。接著應該用fd_isset宏來查找返回的文件描述符組。通過以上兩種方案的比較,考慮適用性,選擇調用poll函數實現i/o多路復用。 3 系統實現 3.1 linux提供的有關socket的系統調用(1) socket() 作用:socket函數為
43、client端或server端創建一個sokcet套接字格式:int socket(int family,int type,int protocol); 參數說明: family:表示地址族(ip地址),可以去af_unlx和af_int。其中,af_unlx只能夠用于unix系統進程間通信;af_int是可以用于internet的,因而可以允許在遠程主機之間通信,實驗中使用af_int。 type:網絡程序所采用的通信協議,可以取sock_stream或sock_dgram。其中,sock_stream表明使用的是tcp協議,;socke_dgram表明使用的是udp協議。(2) bind(
44、 )格式: int bind(int sockfd,struct sockaddr *addr,int addrlen); 參數說明: sockfd:socket套接字的的文件描述符。 sockaddr:ip地址和端口 addrlen:設置結構大小長度。(3) listen()格式: int listen(int sockfd, int backlog); 作用:監聽。 參數說明: sockfd:表示調用返回的文件描述符。 backlog:表示接入隊列允許的連接數目。(4) accept()格式:int accept (int sockfd, void *addr, int *addrlen)
45、; 作用:與listen函數合用,監聽信息、接收client端請求。 參數說明:sockfd:表示socket的文件描述符。addr:表示指向局部的數據結構struct sockaddr-in的指針。addrlen:表示地址的長度。(5) connect()格式: int connect( int sockfd , struct sockaddr *serv_addr , int addrlen); 作用:在面向連接的系統中client端連接server端時使用,connect必須在bind后使用。 參數作用: sockfd:表示socket的文件描述符。serv-addr:表示村訪目的端口和
46、ip地址(套接字)的數據結構。(6) send() 和 recv() 格式1:int send (int sockfd, const vod *msg,int len, int flags); 功能:發送信息。格式2:int recv (int sockfd , void *buf,int len, usigned int flags); 作用:用于流式socket、數據報socket內部之間的通信。close() 和 shutdown()格式:close( int sockfd) 或int shutdown(int sockfd , int how);參數說明:how的值為下面一種: 0-不
47、允許繼續接收; 1-不允許繼續發送; 2-不允許繼續發送和接收。(7) 有關線程的系統調用函數pthread_create()、pthread_detach()3.2 實驗過程說明(使用tcp/ip)(1) 監聽連接 利用socket、bind、listen建立連接,步驟是:1) 先用socket函數初始化socket,創建新的sockfd。sockfd = socket(af_int,sock_stream,0)2) 此步驟涉及到ip地址及其處理過程。參數說明:inet_addr 函數 inaddr_any該函數把由小數點分開的十進制ip地址轉為unsinged long 類型,而在實驗中所
48、使用的為inaddr_any,使用利用自已的ip地址自動填充。a) 利用bind函數綁定端口和ip地址。my_addr.sin_family=af_inet; /*將地址族類型設定好 */my_addr.sin_port=htons(myport); /* 將端口給其賦值*/my_addr.sin_addr.s_addr=inaddr_any; /*用連接地址自動填充ip*/bind(sockfd,(stuct sockaddr*)&my_addr,sizeof(stuct sockaddr);/*sockfd 是分配的socket名字,my-addr則便是分配好的端口與ip,用bind綁定*
49、/b) 利用listen監聽請求 (2) 發送請求 1)先用socket函數初始化socket,創建新的sockfd。 2)初始化要連接的服務器地址。 3)利用connect函數將自己的ip地址等信息發送到主機,等待主機調用accept函數來接受請求。(3) 主機接收請求,進行數據通信1)主機利用accept接收請求。2)創建子進程,顯示歡迎信息;3)接收返回信息,顯示連接成功,并退出連接;4)關閉客戶端口socket;3.3系統方案說明 linux下的聊天軟件涉及的一個server端和多個client端.client端向server端發送請求,server端對請求作出響應.client端嘗試
50、與server端建立連接.一旦連接建立起來,client端和server端就可以通過socket套節字進行通信.本系統中,主要有兩個應用程序,分別為server端程序和client端,client端主要是用于消息轉發、客戶登陸信息的管理以及向所有用戶發送系統消息等。本系統采用c/s(client/server)體系結構(見圖3-1),即client端/server端體系結構.其特點是client端只裝載應用軟件,消息處理、用戶監控等復雜的處理放在server端中實現,這樣就可以大大簡化client端的代碼,增加了系統的穩定性。 圖3-1 c/s體系結構圖其大致實現模型是:(1)server端設
51、置一個固定的端口號.一旦server端啟動,既使用listenthread線程對端口進行不間斷監聽.如果client端請求一個連接,server端使用accept()方法打開一個socket連接.(2)客戶在host和port端口建立連接.(3)server端和client端使用inputstream和outputstream進行通信.3.4結構流程3.4.1. server端結構流程圖server端通過socket()系統調用創建一個socket數組后(即設定了接受連接客戶的最大數目),與指定的本地端口綁定bind(),就可以在端口進行listen().如果有client端連接請求,則在數組
52、中選擇一個空socket,將client端地址賦給這個socket.然后登錄成功的客戶就可以在server端上聊天了。 圖3-2 server端結構流程圖 3.4.2客戶端結構流程圖客戶通過socket套接字建立與server端的連接。server端與客戶都通過調用recv()和send()來實現相互的通信,然后雙方通過該通信方式來相互傳遞信息,一旦收到客戶方的連接請求,server端accept()方法返回一個新建的socket對象??蛻舳巳缓笙騭erver端發送消息,比如聊天等,server端收到來自客戶的請求后,針對不同的消息處理請求。 圖3-3 客戶端結構流程圖 3.4.3登錄結構流程
53、圖用戶登錄,首先要有一個提供用戶登錄的存儲方式。用戶登錄的表單應該嵌入整體的結構當中。在實際的應用中,可以這樣設計,如果用戶沒有登錄,則在頁面中顯示用戶登錄的選項,用戶登錄后,則可隱藏用戶登錄的界面,并且顯示登陸成功后的其他信息。首先,用戶要自己輸入用戶名和密碼。網絡聊天需要很高的穩定性和安全性,因此對用戶名不允許重復使用。同時對密碼也要求保密,將密碼加密后再存入數據文件。 圖3-4登錄結構流程圖4 運行效果 (1) 在編寫完tcp服務端程序server.c后,編寫一個makefile文件:all:gcc ./cirlist.c *.c -lpthread -wallrm client.dat
54、touch client.dat執行make。(2) 在編寫完tcp客戶端程序client.c后,編寫一個makefile文件:all:gcc ./cirlist.c *.c -lpthread -lcrypt執行make。(3) 在主機上打開一窗口,運行server。(4) 再打開另一個窗口,運行client 1001。(5) 再打開另一個窗口,運行client 1002。(6) 再打開另一個窗口,運行client 1003。(7) 輸入:【主】# ./a.out(8) 【從】# ./a.out(9) 客戶端、server端端窗口之間以及交錯發送信息的方式相互發送和接收信息。(10) 客戶端
55、登錄時若有其他人在線,則可用調整,并按回車選擇與其私聊。還可以選擇群聊和退出。在私聊中在$file$后加文件名可實現文件傳輸,在$moon$后加數字(0-9)可發送表情。 開始運行后,客戶端1001窗口的執行順序為:1) 注冊;2) 登陸;3) 選中新登陸的好友1002,進行私聊;4) 發送文件hello.txt給客戶端1002;5) 輸入quit!結束私聊。6) 進入群聊7) 輸入quit!結束群聊。8) 注銷 開始運行后,客戶端1002窗口的執行順序為:1) 注冊;2) 登陸;3) 選中好友1001,進行私聊;4) 接收客戶端1001發來的文件 hello.txt;5) 鍵入quit!結束私聊。6) 進入群聊7)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 33796-2025熱塑性淀粉通用技術要求
- 證券從業資格證內部控制制度試題及答案
- 項目管理考試的備戰策略試題及答案
- 注會學習過程中提問試題與答案
- 證券市場基礎知識的證券從業資格證試題及答案
- 主管年度工作計劃的團隊激勵與引導
- 小班音樂教學的多樣化嘗試計劃
- 項目管理影響力分析及答案
- 優化倉庫配貨效率的個人計劃
- 制定S目標的重要性計劃
- 湖北省武漢市2025屆高中畢業生四月調研考試英語試題(無答案)
- 護理不良事件報告及管理制度
- 小米供應鏈管理案例分析
- 黃岡市2025年春季九年級調研考試道德與法治試卷
- 2025至2030年中國集成電路(IC)制造產業全景調查及投資咨詢報告
- 2025年鄉村全科執業助理醫師考試目的明確試題及答案
- 北京市海淀區2025屆高三一模思想政治試卷(含答案)
- 心腎綜合征診療實踐指南解讀
- 5.1人民代表大會:我國的國家權力機關課件高中政治統編版必修三政治與法治
- 2025年福建省公務員省考《行測》聯考真題(含答案)
- 小學生游泳安全常識
評論
0/150
提交評論