第一篇:基于linux網絡聊天室的設計
《Linux操作系統》課程設計報告
學 院 工商學院
專 業 計算機科學與技術 班 級 計1341 學生姓名:王慢,韓霞,孫潔茹,李強,蔣濤
課程設計任務書
題 目
基于linux網絡聊天室的設計
實驗目的:
《Linux操作系統課程設計B》是一門在課程《Linux操作系統與程序設計B》后獨立開設的實驗課程。這一門實驗課程的開設目的是為了通過學生獨立完成一個基于Linux平臺的較大型應用程序,鞏固課堂上學到的Linux平臺上的編程規范、技術和技巧,培養學生的編寫較大型程序的能力和提高學生綜合應用素質。
本課程設計實驗主要圍繞Linux平臺上主流的基礎技術展開,這些技術包括:Linux的進程、線程通信和同步技術; socket網絡通信技術等,這些技術可以集中體現并應用在并發程序設計中。通過并發程序的設計與開發,培養學生底層軟件開發的能力,并為將來從事UNIX/Linux平臺開發、嵌入式開發等相對高端的軟件開發工作打下基礎。
課程設計的具體內容與要求:
1.閱讀(一個)示例代碼,理解并發程序設計并掌握基于Linux平臺并發程序設計的方法。
2.在充分理解示例程序的基礎上,重新定義和完善程序的功能,定義數據結構,劃分程序的功能模塊和接口,明確每個模塊功能以及相互關系。
3.完成程序的詳細設計和編碼,并測試。
4.書寫并提交文檔
目錄
1引言.................................................................................1
1.1課程設計背景...................................................................1 1.2課程設計目的...................................................................2 1.3課程設計內容...................................................................4 2 技術介紹............................................................................7 2.1TCP和UDP介紹...................................................................2.2客戶/服務器模型.................................................................2.3網絡套接字(socket)的概念......................................................2.4多線程的概念....................................................................3 系統設計...........................................................................10 3.1 系統結構設計...................................................................3.2通信模塊設計....................................................................4模塊實現............................................................................12 4.1系統調用相關函數................................................................4.2 系統實現過程說明...............................................................5 運行效果..........................................................................15 結束語.................................................................................參考文獻.............................................................................18 附錄..............................................................................19-24
基于linux網絡聊天室的設計
摘 要 本課程設計主要實現一個Linux下的局域網聊天工具的設計。該設計主要分為兩部分,客戶端部分和主機部分。運行服務器端程序可以和任意運行了客戶端程序的主機進行通信,通信內容能夠通過終端顯示出來。兩個部分都使用C語言,利用vi編輯器,通過Berkeley套接口編程實現相關功能。引 言
1.1課程設計背景
Linux是一種針對PC計算機和工作站的操作系統,它具有像Windows和Mac那樣的功能齊全的圖形用戶界面(GUI,Graphical User Interface)。Linus Torvald和其它的遍布世界各地的編程人員共同開發的[1]。
提到Linux我們不能不提GNU和Unix。Richard M.Stallman建立的自由軟件聯盟出版了兩種許可證,GNU通用公共許可證(GNU Gneral Public License,GPL)和GNU函數庫通用公共許可證(GNU Library Gneral Public License,LGPL)。大部分GNU工程的軟件和文檔是以GNU通用公共許可證發行的,但是有一些庫是以GNU函數庫通用公共許可證發行的。按照GNU通用公共許可證的規定,Linux的源代碼可以自由獲取,這滿足了我們學習該系統的強烈愿望。GPL充分體現了Stallman的思想:只要用戶所做的修改是同等自由的,用戶可以自由地使用、拷貝、查詢、重用、修改甚至發布這個軟件。通過這種方式,GPL保證了Linux(以及同一許可證下的大量其他軟件)不僅現在自由可用,而且皮后經過任何修改這后都仍然可以自由使用。
Unix是由AT—T貝爾實驗室的Ken Thompson和Dennis Ritchie于1969年在一臺已經廢棄了的PDP-7上開發的;最初它是一個用匯編語言寫成的單用戶操作系統。后來,他們又在PDP-11上用C語言重新編寫(發明C語言的部分目的就在于此),把Unix做成為了一個文本處理系統,這使Unix在貝爾實驗室得到廣泛的應用。Unix的最初版本免費提供給許多知名的大學的計算機系使用。加州大學伯克利分校的計算機系就是其中的一名,并地Unix進行了修改增加了許多新的特點,這就是主為人知的BSC版本的Unix。與此同時,其它獨立開發的Unix版本也開始萌生。Unix不斷發展了,各種版本被應用到不同的計算機使
用。而Linux最初是專門為基于Intel的個人計算機設計的。(1)Linux的昨天
1991年,一名叫Linus Torvalds的芬蘭大學生對Unix各種版本對于80386類的機器的脆弱支持十分不滿,他決定要開發出一個全功能的、支持POSIX標準的、類Unix的操作系統內核,該系統吸收了BSD和System V 的優點,同進摒棄了它們的缺點。他獨立把這個內核開發到0.02版,這個版本已經可以運行gcc、bash和很少的一些應用程序。后來,他又開始了在因特網上尋求廣泛的幫助。1994年,Linux已經升級到1.0版本。它的源代碼量也呈指數形式增長,實現了基本的TCP/IP功能,此時Linux已經擁有大約10萬的用戶。(2)Linux的今天
作為一各服務器級的操作系統,Linux已經成熟了?,F在的Linux內核由150多行代碼組成,能作為Web服務器平臺,也為越來越多的商業用戶提供文件和打印服務。它既被當作郵件服務器的一種候選平臺,也被當作一種強壯而安全的防火墻。
Linux的企業級特性,比如支持多處理器、支持大型文件系統、日志文件系統以及密集型計算和高可用性集群技術,也逐步成熟。
桌面上的Linux也在繼續完善。KDE桌面提供的圖形用戶界面在易用性和可配置方面都能和微軟的Windows相媲美。(3)Linux的明天
Linux最強大的生命力在于其公開的開發過程。每個人都有可以自由獲取內核源程序,每個人都有要不得以運載源程序加以修改,而后他人也可以自由獲取你修改后的源程序。Linux這種獨特的自由流暢的開發模型已被命名為bazaar(集市模型)。Bazaar開發模型通過重視實驗,征集并充分利用早期的反饋,對巨大數量的腦力資源進行平衡配置,可以開發出更優秀的軟件。本聯盟就是想通過bazaar開發模型,在網上召集一些Linux的愛好者,開發出更優秀的操作系統或軟件。
1.2課程設計目的
本課程設計主要實現一個Linux下的局域網聊天工具的設計。該設計主要分為兩部分,客戶端部分和主機部分。運行服務器端程序可以和任意運行了客戶端程序的主機進行通信,通信內容能夠通過終端顯示出來。兩個部分都使用C語言,利用vi編輯器,通過Berkeley套接口編程實現相關功能。要求:
(1)主要實現一個Linux下的局域網聊天工具的設計,進一步掌握vi,gcc等工具的使用,并且熟悉Linux下的網絡編程,以及多線程編程。
(2)通過實際項目的分析、安裝、配置、測試等工作,掌握用Linux系統下的網絡聊天
室的應用。
1.3課程設計內容
本課程設計主要實現一個Linux下的局域網聊天工具的設計。該設計主要分為兩部分,客戶端部分和主機部分。運行服務器端程序可以和任意運行了客戶端程序的主機進行通信,通信內容能夠通過終端顯示出來。兩個部分都使用C語言,利用vi編輯器,通過Berkeley套接口編程實現相關功能。技術介紹
2.1TCP和UDP介紹
(1)UDP通信
UDP是用戶數據報協議的簡稱。它是以中午連接的邏輯通信信道。UDP在傳送數據之前不需要先建立連接,遠地主機的傳輸層在收到udp數據報后,不需要給出任何確認,所以不能保證其交付時可靠。它的特點是:因無連接,故提供的是不可靠的信道,但也是因無連接而具有很好的傳輸效率。(2)TCP通信
TCP是傳輸控制協議的簡稱,它是提供一條全雙工的、可靠的信道。TCP提供面向連接的服務,在傳送數據之前必須先建立連接,數據傳送結束后要釋放連接。
由于TCP要提供可靠的、面向連接的運輸服務,所以不可避免地增加了許多系統開銷,比如確認、流量控制、計時器以及連接管理等都需要占用許多系統的時空資源。兩個計算機之間如果使用TCP通信,其連接過程需要三次握手實現,如實驗圖2-1所示。
圖2.1 用三次握手建立TCP連接
對于兩個計算機之間連接的釋放過程也需要類似的3次握手的互相確認的過程,如實驗圖2-2所示。
圖2.2 TCP連接的釋放過程
2.2客戶/服務器模型
在客戶/服務器模型中,多個相互通信的計算機都作為客戶端,與網絡服務器進行連接,并通過服務器進行信息的傳遞[3]。所以多個客戶端之間的通信就變為了客戶端與服務端的通信。所以,采用客戶/服務器模型進行網絡聊天需要分別編寫服務器端和客戶端的程序,服務器和客戶端之間相互通信的同步關系和各自的程序流程如實驗圖2-3所示。
圖2.3 Socket通信流程圖
2.3網絡套接字(socket)的概念
Socket接口上TCP/IP網絡應用程序接口(API),它提供了許多函數和例程,程序員可以使用它們來開發TCP/IP網絡應用程序。
使用Socket接口進行網絡通信的過程如圖1-3所示,簡要步驟如下:(1)建立一個Socket.(2)按要求配置socket,將socket連接到遠程主機或給socket指定以各本地協議端口。(3)按要求通過socket發送和接受數據。(4)關閉此socket。
這是通過Socket實現點對點通信需要掌握的4個編程要點。
2.4多線程的概念
上述點對點通信的實現知識完成了主機進程與服務器進程之間的連接,建立連接的進程之間是一對一的聯系,即主機的一個進程與服務器的一個進程之間建立的連接。而每個進程進行通信的環節都包括了發送信息和接口信息兩個任務,這兩個任務通過一個端口地址發送和接收。
對于多個并發的任務需要創建多個線程或線程去實現。使用一個進程去完成發送信息是沒有問題的,因為發送總是主動的;而使用同一個進程再去完成接受信息去不一定會成功,因為接受信息是被動的,所以當沒有信息可以接收時,該進程就會被阻塞,從而導致發送任務也一起被阻塞。同一個端口的發送和接收是兩個并發任務,應該由兩個不同的任務去分別完成信息的發送和接收。這樣,當接收信息任務因沒有信息而被阻塞時,不至于影響發送任務的執行。
那么,發送和接收兩個任務是使用兩個進程還是兩個進程去完成呢?
在網絡通信中,端口地址是以進程為單位進程分配的,而一個進程與外界的消息發送與接收必須通過分配給它的同一個端口進行。因此,不能通過創建進程方式來解決上訴問題,因為兩個進程會分別對應兩個不同的端口,而發送和接收必須使用同一端口。線程不是資源分配的單位,所以如果使用兩個線程不會對線程分配新的端口。因此,本實驗需要使用兩個線程去分別完成發送和接收信息的任務,這兩個線程共享其進程擁有的統一個端口地址。由于創建進程的進程本身會作為一個線程來調度,所以只需要再創建一個線程專門負責接收信息就可以了。
因此,對于從每個客戶端發來的請求,服務器端都要創建相應的線程去接收并處理;同理,對于客戶端而言,也要創建一個線程去讀取服務器端發來的信息。系統設計
3.1 系統結構設計
本系統采用客戶/服務器模型,在TCP/IP網絡應用中,通信的兩個進程間相互作用的主要模式是客戶/服務器模式(Client/Server model),即客戶向服務器發出服務請求,服務器接收到請求后,提供相應的服務??蛻?服務器模式的建立基于以下兩點:首先,建立網絡的起因是網絡中軟硬件資源、運算能力和信息不均等,需要共享,從而造就擁有眾多資源的主機提供服務,資源較少的客戶請求服務這一非對等作用。其次,網間進程通信完全是異步的,相互通信的進程間既不存在父子關系,又不共享內存緩沖區,因此需要一種機制為希望通信的進程間建立聯系,為二者的數據交換提供同步,這就是客戶端/服務器模式的TCP/IP。在客戶/服務器模型中,多個相互通信的計算機都作為客戶端,與網絡服務器進行連接,并通過服務器進行信息的傳遞[4]。所以多個客戶端之間的通信就變為了客戶端與服務端的通信。
服務器端和客戶端的主要組成如下:
服務器端:套接字創建函數Socket(),端口綁定函數Bind(),套接口監聽函數Listen(),接受連接函數Accept(),數據收發函數Read()和Write(),以及套接口關閉函數Close()??蛻舳耍禾捉涌趧摻ê瘮礢ocket(),套接口連接函數Connect(),數據收發函數Read()和Write(),以及套接口關閉函數Close()。
3.2通信設計
首先運行服務器端程序,通過Socket()函數會建立一個套接字,然后通過Bind()函數綁定一個端口,然后調用Listen()在套接字指定的端口上開始傾聽,利用Accept()從完全建立連接的隊列中接受一個連接,連接獲得后使用Read()和Write()函數進行通信。通信結束后調用Close()關閉套接字描述符。
運行客戶端的程序,調用Socket()函數建立一個套接字,使用Connect()函數與服務器端進行連接,連接完成后,使用Write()和Read()與服務器端進行通信,通信結束后調用close()關閉套接字描述符。
4系統實現
4.1系統調用相關函數
(1)Socket()
作用:socket函數為客戶機或服務器創建一個sokcet 格式:
int socket(int family,int type,int protocol);
參數說明:
Family:表示地址族,可以去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()格式:
int bind(int sockfd,struct sockaddr *addr,int addrlen);
參數說明:
Sockfd:socket的文件描述符號。
Sockaddr:表示名字所用的一個數據結構,用來保存地址(包括IP地址和端口)
Addrlen:設置結構大小長度。(3)listen()格式:
int listen(int sockfd, int backlog);
作用:監聽連接信號,和accepted函數合同。
參數說明:
Sockfd:表示socket調用返回的文件描述符。
Backlog:表示接入隊列允許的連接數目,大多數系統允許20個,也可以子定義5~10個。(4)accept()
格式:
Int accept(int sockfd, void *addr, int *addrlen);
作用:與listen函數合用,監聽信息、接收客戶端請求。
參數說明:
Sockfd:表示socket的文件描述符。
Addr:表示指向局部的數據結構struct sockaddr-in的指針。
Addrlen:表示地址的長度。(5)connect()格式:
int connect(int sockfd , struct sockaddr *serv_addr , int addrlen);作用:在面向連接的系統中客戶及連接服務器時使用,connect必須在bind后使用。
參數作用:
Sockfd:表示socket的文件描述符。
Serv-addr:表示村訪目的端口和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內部之間的通信。(7)close()和 shutdown()格式:
Close(int sockfd)或
Int shutdown(int sockfd , int how);
參數說明:
How的值為下面一種:
0----不允許繼續接收;
1----不允許繼續發送;
2---不允許繼續發送和接收。
(8)有關線程的系統調用函數pthread_create()、pthread_join()
4.2 系統實現過程說明
(1)監聽連接
利用socket、bind、listen建立連接,步驟是: 1)
先用socket函數初始化socket,創建新的sockfd。
Sockfd = socket(AF_INT,SOCK_STREAM,0)2)此步驟涉及到IP地址及其處理過程。參數說明:
inet_addr 函數 INADDR_ANY 該函數把由小數點分開的十進制IP地址轉為unsinged long 類型,而在實驗中所使用的為INADDR_ANY,使用利用自已的IP地址自動填充。1)利用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綁定*/ 2)利用listen監聽請求(2)
發送請求
1)利用gethostbyname獲取主機信息。2)初始化socket端口。
3)利用connect函數將自己的IP地址等信息發送到主機,等待主機調用accept函數來接受請求。
(3)主機接收請求,進行數據通信
1)主機利用accept接收請求。2)創建子進程,顯示歡迎信息;
3)接收返回信息,顯示連接成功,并推出連接; 4)關閉客戶端口socket;
5)關閉服務端socket,結束子線程。運行效果
(1)在編寫完TCP服務端程序server.c后,用 gcc –lpthread –o server.c server 生成程序server。
(2)在編寫完TCP客戶端程序client.c后,用gcc –lpthread –o client.c client 生成程序client(3)在主機上打開一窗口,運行server。
(4)再打開另一個窗口或者在另一個主句上打開一個窗口,運行client,輸入服務器的IP地址,并檢查器結果的正確性。輸入:【主】#./server 【從】#./client 127.0.0.1 輸出:【主】#server:got connection from 127.0.0.1(5)客戶端、服務器端窗口之間以及交錯發送信息的方式相互發送和接收信息。
1)客戶端、服務器端窗皆通過鍵盤輸入消息內容平回車,以發送消息給對方; 2)消息中若使用空格,則作為本條消息結束及下一條消息的開始; 3)輸入exit則推出運行。
開始運行后,服務器端窗口的執行順序為:
1)輸入“hi nihao”發送給客戶端,如圖5.1所示。
圖5.1 服務器發送消息
2)接收客戶端發來的”ni hao”,如圖5.2所示。
圖5.2 接收客戶端消息
3)輸入exit結束。
開始運行后,客戶端窗口的執行順序為:
1)接收服務器端發來的消息“hinihao”,如圖5.3所示。
圖5.3接收服務器端消息
2)發送消息“hinihao”給服務器端如圖5.4所示。
圖5.4 客戶端發送消息
3)鍵入exit結束。
上述運行結果表明,客戶端與服務器端之間傳遞的消息已被對方成功接收。結束語
這次課程設計可謂收獲頗大,首先從一開始對 linux一無所知甚至是畏懼 ,到做完實驗后有了一定程度的了解,如果沒有這次實驗 ,我想我很難有機會去接觸從而進一步熟悉 linux這個操作系統以及在 linux下的編程.通過實驗我認識到了系統調用的實現原理 ,系統信息和狀態的讀取 ,特別是最后一個實驗應該說比較具有代表性 ,是一個很好的 linux環境下編程的例子.也讓我從中學到了不少 linux的知識.經過近了兩周的設計和開發,網絡聊天室的設計設計完畢。其功能基本符合用戶需求,能夠簡單的網絡聊天功能。但是由于課程設計時間較短,還有許多不盡如人意的地方,還有待于我們進一步完善其功能。但我從中學到了不少的道理,真正的理解到,理論與實踐之間還是有很大的距離,這必將有利于我們以后的學習。通過此次課程設計,使我更加扎實的掌握了有關Linux方面的知識,在設計過程中雖然遇到了一些問題,但經過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面的知識欠缺和經驗不足。
回顧起此課程設計,至今我仍感慨頗多,從理論到實踐,在這段日子里,可以說得是苦多于甜,但是可以學到很多很多的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,但可喜的是最終都得到了解決。實驗過程中,也對團隊精神的進行了考察,讓我們在合作起來更加默契,在成功后一起體會喜悅的心情。果然是團結就是力量,只有互相之間默契融洽的配合才能換來最終完美的結果。
實踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵。在本次課題程序設計中,我學到了很多東西,通過本次課題程序設計,無論在理論上還是在實踐中,我的計算機應用水平得到了很大的提升,這對于今后的工作和學習都是一種巨大的財富。
參考文獻
[1]趙敏哲,64位Linux操作系統與應用實例[M].北京:機械工業出版社,2001 [2]龐麗萍,操作系統原理(第三版)[M].武漢:華中科技大學出版社,2000 [3]張饒學,Linux網絡編程[M].北京:清華大學出版社,2000 [4]金鐘夫,杜剛.淺析socket網絡編程[J].微計算機信息,2002,3-2,87-89 [5]王群,許中萬.Linux優勢分析[J].計算機與現代化,2003(10):7-8
附 錄
服務端源程序清單如下,文件名為server.c #include #define MYPORT 3490 #define BACKLOG 10 #define MAXDATASIZE 1024 int sockfd,new_fd;pthread_t accthread,recthread; void recmessage(void){ while(1){ int numbytes; char buf[MAXDATASIZE]; if((numbytes = recv(new_fd,buf,MAXDATASIZE,0))==-1){ perror(“recv”); exit(1); } buf[numbytes] = '
主站蜘蛛池模板:
亚洲精品天堂无码中文字幕|
99国产欧美久久久精品|
青青草原综合久久大伊人|
伊伊人成亚洲综合人网7777|
黑人粗大猛烈进出高潮视频|
精品永久久福利一区二区|
久久精品中文字幕第一页|
国内精品久久人妻朋友|
亚洲人成网站色www|
熟妇人妻无乱码中文字幕真矢织江|
在线观看国产日韩亚洲中|
精品少妇ay一区二区三区|
日本真人边吃奶边做爽动态图|
国产在热线精品视频|
欧美黑人xxxx高潮猛交|
av无码国产在线看岛国|
亚洲av无码乱码国产麻豆穿越|
亚洲欧美日韩综合在线一|
天天射寡妇射|
成人亚洲区无码区在线点播|
亚洲欧美日韩成人一区在线|
国产精品videossex久久发布|
国产精品sp调教打屁股|
久久婷婷五月综合色高清|
亚洲精品久久久久久久久久久捆绑|
国产成人无码a区精油按摩|
亚洲精品中文字幕久久久久下载|
又粗又猛又黄又爽无遮挡|
久青草影院在线观看国产|
白丝女仆被??免费网站|
成人无码做爰www免费|
无码精品一区二区三区免费视频|
亚洲性色av性色在线观看|
久久久无码精品亚洲日韩按摩|
欧美日韩精品一区二区三区高清视频|
欧美裸体xxxx极品少妇|
婷婷色综合视频在线观看|
国产精品人妻一码二码|
免费人成再在线观看网站|
中文字幕av无码免费久久|
亚洲精品一品区二品区三品区|