畢業(yè)設(shè)計(jì)(論文)基于Linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)_第1頁(yè)
畢業(yè)設(shè)計(jì)(論文)基于Linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)_第2頁(yè)
畢業(yè)設(shè)計(jì)(論文)基于Linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)_第3頁(yè)
畢業(yè)設(shè)計(jì)(論文)基于Linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)_第4頁(yè)
畢業(yè)設(shè)計(jì)(論文)基于Linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 基于linux網(wǎng)絡(luò)聊天室的設(shè)計(jì) 第頁(yè) 共21頁(yè) 基于linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)學(xué)生姓名: 指導(dǎo)老師: 摘要 本課程設(shè)計(jì)實(shí)現(xiàn)了在linux下簡(jiǎn)單的網(wǎng)絡(luò)聊天室。在linux下編寫(xiě)并調(diào)試服務(wù)器端程序和客戶端程序,實(shí)現(xiàn)了客戶、服務(wù)器之間的連接和通信??梢栽趩螜C(jī)上開(kāi)辟兩個(gè)窗口分別運(yùn)行客戶、服務(wù)器端的程序,或者將兩臺(tái)主機(jī)連接分別作為客戶和服務(wù)器的方式。本設(shè)計(jì)使用網(wǎng)絡(luò)套接字socket和多線程在網(wǎng)絡(luò)中的應(yīng)用,并基于linux下的vi編輯器。本方案經(jīng)gcc調(diào)試器調(diào)試成功,可以在單機(jī)網(wǎng)絡(luò)聊天中使用。關(guān)鍵詞 網(wǎng)絡(luò)聊天室 ;linux ;socket ;vi abstract design and impleme

2、ntation of the course in under linux simple network chat rooms. prepared in the linux and debugging server-side processes and client to achieve the client, server and communications link between. can open up two windows on the stand-alone operation, respectively, customers, server-side procedures, o

3、r to connect two hosts, respectively, as the way the client and server. the design of the network socket using the socket and multi-threaded applications in the network, and under linux based vi editor. the program by the success of gcc debug debugger, you can chat in the use of stand-alone network.

4、 key words network chat rooms; linux; socket; vi基于linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)1背景1.1 linux介紹2 技術(shù)說(shuō)明2.1 tcp和udp通信的概念2.1.1 udp通信2.1.2 tcp通信2.2客戶/服務(wù)器模型2.3網(wǎng)絡(luò)套接字(socket)的概念2.4多線程的概念3 系統(tǒng)實(shí)現(xiàn)3.1 linux提供的有關(guān)socket的系統(tǒng)調(diào)用3.2 實(shí)驗(yàn)過(guò)程說(shuō)明(使用tcp/ip)3.3 tcp通信實(shí)現(xiàn)4 運(yùn)行效果結(jié)束語(yǔ)參考文獻(xiàn)1背景 1.1 開(kāi)發(fā)背景在網(wǎng)絡(luò)無(wú)所不在的今天,在internet上,有icq、msn、gtalk、oicq等網(wǎng)絡(luò)聊天軟件,極大程度

5、上方便了處于在世界各地的友人之間的相互聯(lián)系,也使世界好像一下子縮小了,不管你在哪里,只要你上了網(wǎng),打開(kāi)這些軟件,就可以給你的朋友發(fā)送信息,不管對(duì)方是否也同時(shí)在線,只要知道他有號(hào)碼。linux 操作系統(tǒng)作為一個(gè)開(kāi)源的操作系統(tǒng)被越來(lái)越多的人所應(yīng)用,它的好處在于操作系統(tǒng)源代碼的公開(kāi)化!只要是基于gnu公約的軟件你都可以任意使用并修改它的源代碼。但對(duì)很多習(xí)慣于windows操作系統(tǒng)的人來(lái)說(shuō),linux的操作不夠人性化、交互界面不夠美觀,這給linux操作系統(tǒng)的普及帶來(lái)了很大的阻礙。因此制作一個(gè)linux 操作系統(tǒng)下的擁有人性化界面的實(shí)時(shí)通訊工具,將給那些剛剛接觸linux操作系統(tǒng)的用戶帶來(lái)極大的方便,

6、而且通過(guò)設(shè)計(jì)這樣的一個(gè)應(yīng)用程序還能更好的學(xué)習(xí)網(wǎng)絡(luò)編程知識(shí)和掌握l(shuí)inux平臺(tái)上應(yīng)用程序設(shè)計(jì)開(kāi)發(fā)的過(guò)程,將大學(xué)四年所學(xué)知識(shí)綜合運(yùn)用,以達(dá)到檢驗(yàn)學(xué)習(xí)成果的目的1.2 linux介紹 linux是一種針對(duì)pc計(jì)算機(jī)和工作站的操作系統(tǒng),它具有像windows和mac那樣的功能齊全的圖形用戶界面(gui,graphical user interface)。linus torvald和其它的遍布世界各地的編程人員共同開(kāi)發(fā)的。作為一種操作系統(tǒng),它具有與unix,mac,windows和windows nt同樣的功能。 提到linux我們不能不提gnu和unix。richard m.stallman建立的自由

7、軟件聯(lián)盟出版了兩種許可證,gnu通用公共許可證(gnu gneral public license,gpl)和gnu函數(shù)庫(kù)通用公共許可證(gnu library gneral public license,lgpl)。大部分gnu工程的軟件和文檔是以gnu通用公共許可證發(fā)行的,但是有一些庫(kù)是以gnu函數(shù)庫(kù)通用公共許可證發(fā)行的。按照gnu通用公共許可證的規(guī)定,linux的源代碼可以自由獲取,這滿足了我們學(xué)習(xí)該系統(tǒng)的強(qiáng)烈愿望。gpl充分體現(xiàn)了stallman的思想:只要用戶所做的修改是同等自由的,用戶可以自由地使用、拷貝、查詢、重用、修改甚至發(fā)布這個(gè)軟件。通過(guò)這種方式,gpl保證了linux(以及

8、同一許可證下的大量其他軟件)不僅現(xiàn)在自由可用,而且皮后經(jīng)過(guò)任何修改這后都仍然可以自由使用。 unix是由att貝爾實(shí)驗(yàn)室的ken thompson和dennis ritchie于1969年在一臺(tái)已經(jīng)廢棄了的pdp-7上開(kāi)發(fā)的;最初它是一個(gè)用匯編語(yǔ)言寫(xiě)成的單用戶操作系統(tǒng)。后來(lái),他們又在pdp-11上用c語(yǔ)言重新編寫(xiě)(發(fā)明c語(yǔ)言的部分目的就在于此),把unix做成為了一個(gè)文本處理系統(tǒng),這使unix在貝爾實(shí)驗(yàn)室得到廣泛的應(yīng)用。unix的最初版本免費(fèi)提供給許多知名的大學(xué)的計(jì)算機(jī)系使用。加州大學(xué)伯克利分校的計(jì)算機(jī)系就是其中的一名,并地unix進(jìn)行了修改增加了許多新的特點(diǎn),這就是主為人知的bsc版本的un

9、ix。與此同時(shí),其它獨(dú)立開(kāi)發(fā)的unix版本也開(kāi)始萌生。unix不斷發(fā)展了,各種版本被應(yīng)用到不同的計(jì)算機(jī)使用。而linux最初是專門(mén)為基于intel的個(gè)人計(jì)算機(jī)設(shè)計(jì)的。(1)linux的昨天 1991年,一名叫l(wèi)inus torvalds的芬蘭大學(xué)生對(duì)unix各種版本對(duì)于80386類的機(jī)器的脆弱支持十分不滿,他決定要開(kāi)發(fā)出一個(gè)全功能的、支持posix標(biāo)準(zhǔn)的、類unix的操作系統(tǒng)內(nèi)核,該系統(tǒng)吸收了bsd和system v 的優(yōu)點(diǎn),同進(jìn)摒棄了它們的缺點(diǎn)。他獨(dú)立把這個(gè)內(nèi)核開(kāi)發(fā)到0.02版,這個(gè)版本已經(jīng)可以運(yùn)行g(shù)cc、bash和很少的一些應(yīng)用程序。后來(lái),他又開(kāi)始了在因特網(wǎng)上尋求廣泛的幫助。 1994年,

10、linux已經(jīng)升級(jí)到1.0版本。它的源代碼量也呈指數(shù)形式增長(zhǎng),實(shí)現(xiàn)了基本的tcp/ip功能,此時(shí)linux已經(jīng)擁有大約10萬(wàn)的用戶。(2) linux的今天 作為一各服務(wù)器級(jí)的操作系統(tǒng),linux已經(jīng)成熟了?,F(xiàn)在的linux內(nèi)核由150多行代碼組成,能作為web服務(wù)器平臺(tái),也為越來(lái)越多的商業(yè)用戶提供文件和打印服務(wù)。它既被當(dāng)作郵件服務(wù)器的一種候選平臺(tái),也被當(dāng)作一種強(qiáng)壯而安全的防火墻。 linux的企業(yè)級(jí)特性,比如支持多處理器、支持大型文件系統(tǒng)、日志文件系統(tǒng)以及密集型計(jì)算和高可用性集群技術(shù),也逐步成熟。 桌面上的linux也在繼續(xù)完善。kde桌面提供的圖形用戶界面在易用性和可配置方面都能和微軟的w

11、indows相媲美。(3) linux的明天 linux最強(qiáng)大的生命力在于其公開(kāi)的開(kāi)發(fā)過(guò)程。每個(gè)人都有可以自由獲取內(nèi)核源程序,每個(gè)人都有要不得以運(yùn)載源程序加以修改,而后他人也可以自由獲取你修改后的源程序。linux這種獨(dú)特的自由流暢的開(kāi)發(fā)模型已被命名為bazaar(集市模型)。bazaar開(kāi)發(fā)模型通過(guò)重視實(shí)驗(yàn),征集并充分利用早期的反饋,對(duì)巨大數(shù)量的腦力資源進(jìn)行平衡配置,可以開(kāi)發(fā)出更優(yōu)秀的軟件。本聯(lián)盟就是想通過(guò)bazaar開(kāi)發(fā)模型,在網(wǎng)上召集一些linux的愛(ài)好者,開(kāi)發(fā)出更優(yōu)秀的操作系統(tǒng)或軟件。 2 技術(shù)說(shuō)明2.1 tcp和udp通信的概念2.1.1 udp通信 udp是用戶數(shù)據(jù)報(bào)協(xié)議的簡(jiǎn)稱。它

12、是以中午連接的邏輯通信信道。udp在傳送數(shù)據(jù)之前不需要先建立連接,遠(yuǎn)地主機(jī)的傳輸層在收到udp數(shù)據(jù)報(bào)后,不需要給出任何確認(rèn),所以不能保證其交付時(shí)可靠。它的特點(diǎn)是:因無(wú)連接,故提供的是不可靠的信道,但也是因無(wú)連接而具有很好的傳輸效率。 2.1.2 tcp通信 tcp是傳輸控制協(xié)議的簡(jiǎn)稱,它是提供一條全雙工的、可靠的信道。tcp提供面向連接的服務(wù),在傳送數(shù)據(jù)之前必須先建立連接,數(shù)據(jù)傳送結(jié)束后要釋放連接。tcp不提供廣播和多播服務(wù)。 由于tcp要提供可靠的、面向連接的運(yùn)輸服務(wù),所以不可避免地增加了許多系統(tǒng)開(kāi)銷(xiāo),比如確認(rèn)、流量控制、計(jì)時(shí)器以及連接管理等都需要占用許多系統(tǒng)的時(shí)空資源。 兩個(gè)計(jì)算機(jī)之間如果

13、使用tcp通信,其連接過(guò)程需要三次握手實(shí)現(xiàn),如實(shí)驗(yàn)圖1-1所示。圖1-1 用三次握手建立tcp連接 對(duì)于兩個(gè)計(jì)算機(jī)之間連接的釋放過(guò)程也需要類似的3次握手的互相確認(rèn)的過(guò)程,如實(shí)驗(yàn)圖1-2所示。圖1-2 tcp連接的釋放過(guò)程2.2客戶/服務(wù)器模型在客戶/服務(wù)器模型中,多個(gè)相互通信的計(jì)算機(jī)都作為客戶端,與網(wǎng)絡(luò)服務(wù)器進(jìn)行連接,并通過(guò)服務(wù)器進(jìn)行信息的傳遞。所以多個(gè)客戶端之間的通信就變?yōu)榱丝蛻舳伺c服務(wù)端的通信。所以,采用客戶/服務(wù)器模型進(jìn)行網(wǎng)絡(luò)聊天需要分別編寫(xiě)服務(wù)器端和客戶端的程序,服務(wù)器和客戶端之間相互通信的同步關(guān)系和各自的程序流程如實(shí)驗(yàn)圖1-3所示。圖1-3 socket通信流程圖2.3網(wǎng)絡(luò)套接字(s

14、ocket)的概念socket接口上tcp/ip網(wǎng)絡(luò)應(yīng)用程序接口(api),它提供了許多函數(shù)和例程,程序員可以使用它們來(lái)開(kāi)發(fā)tcp/ip網(wǎng)絡(luò)應(yīng)用程序。使用socket接口進(jìn)行網(wǎng)絡(luò)通信的過(guò)程如圖1-3所示,簡(jiǎn)要步驟如下:(1) 建立一個(gè)socket.(2) 按要求配置socket,將socket連接到遠(yuǎn)程主機(jī)或給socket指定以各本地協(xié)議端口。(3) 按要求通過(guò)socket發(fā)送和接受數(shù)據(jù)。(4) 關(guān)閉此socket。這是通過(guò)socket實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信需要掌握的4個(gè)編程要點(diǎn)。2.4多線程的概念上述點(diǎn)對(duì)點(diǎn)通信的實(shí)現(xiàn)知識(shí)完成了主機(jī)進(jìn)程與服務(wù)器進(jìn)程之間的連接,建立連接的進(jìn)程之間是一對(duì)一的聯(lián)系,即主機(jī)的

15、一個(gè)進(jìn)程與服務(wù)器的一個(gè)進(jìn)程之間建立的連接。而每個(gè)進(jìn)程進(jìn)行通信的環(huán)節(jié)都包括了發(fā)送信息和接口信息兩個(gè)任務(wù),這兩個(gè)任務(wù)通過(guò)一個(gè)端口地址發(fā)送和接收。 對(duì)于多個(gè)并發(fā)的任務(wù)需要?jiǎng)?chuàng)建多個(gè)線程或線程去實(shí)現(xiàn)。使用一個(gè)進(jìn)程去完成發(fā)送信息是沒(méi)有問(wèn)題的,因?yàn)榘l(fā)送總是主動(dòng)的;而使用同一個(gè)進(jìn)程再去完成接受信息去不一定會(huì)成功,因?yàn)榻邮苄畔⑹潜粍?dòng)的,所以當(dāng)沒(méi)有信息可以接收時(shí),該進(jìn)程就會(huì)被阻塞,從而導(dǎo)致發(fā)送任務(wù)也一起被阻塞。同一個(gè)端口的發(fā)送和接收是兩個(gè)并發(fā)任務(wù),應(yīng)該由兩個(gè)不同的任務(wù)去分別完成信息的發(fā)送和接收。這樣,當(dāng)接收信息任務(wù)因沒(méi)有信息而被阻塞時(shí),不至于影響發(fā)送任務(wù)的執(zhí)行。那么,發(fā)送和接收兩個(gè)任務(wù)是使用兩個(gè)進(jìn)程還是兩個(gè)進(jìn)程去

16、完成呢?在網(wǎng)絡(luò)通信中,端口地址是以進(jìn)程為單位進(jìn)程分配的,而一個(gè)進(jìn)程與外界的消息發(fā)送與接收必須通過(guò)分配給它的同一個(gè)端口進(jìn)行。因此,不能通過(guò)創(chuàng)建進(jìn)程方式來(lái)解決上訴問(wèn)題,因?yàn)閮蓚€(gè)進(jìn)程會(huì)分別對(duì)應(yīng)兩個(gè)不同的端口,而發(fā)送和接收必須使用同一端口。線程不是資源分配的單位,所以如果使用兩個(gè)線程不會(huì)對(duì)線程分配新的端口。因此,本實(shí)驗(yàn)需要使用兩個(gè)線程去分別完成發(fā)送和接收信息的任務(wù),這兩個(gè)線程共享其進(jìn)程擁有的統(tǒng)一個(gè)端口地址。由于創(chuàng)建進(jìn)程的進(jìn)程本身會(huì)作為一個(gè)線程來(lái)調(diào)度,所以只需要再創(chuàng)建一個(gè)線程專門(mén)負(fù)責(zé)接收信息就可以了。因此,對(duì)于從每個(gè)客戶端發(fā)來(lái)的請(qǐng)求,服務(wù)器端都要?jiǎng)?chuàng)建相應(yīng)的線程去接收并處理;同理,對(duì)于客戶端而言,也要?jiǎng)?chuàng)建

17、一個(gè)線程去讀取服務(wù)器端發(fā)來(lái)的信息。3 系統(tǒng)實(shí)現(xiàn)3.1 linux提供的有關(guān)socket的系統(tǒng)調(diào)用(1) socket() 作用:socket函數(shù)為客戶機(jī)或服務(wù)器創(chuàng)建一個(gè)sokcet格式:int socket(int family,int type,int protocol); 參數(shù)說(shuō)明: family:表示地址族,可以去af_unlx和af_int。其中,af_unlx只能夠用于單一的unix系統(tǒng)進(jìn)程間通信;af_int是針對(duì)internet的,因而可以允許在遠(yuǎn)程主機(jī)之間通信,實(shí)驗(yàn)中使用af_int。 type:網(wǎng)絡(luò)程序所采用的通信協(xié)議,可以取sock_stream或sock_dgram。其中

18、,sock_stream表明使用的是tcp協(xié)議,這樣提供按順序的、可靠的、雙向、面向連接的比特流;socke_dgram表明使用的是udp協(xié)議,這樣只會(huì)提供定長(zhǎng)、不可靠、無(wú)連接的通信。(2) bind( )格式: int bind(int sockfd,struct sockaddr *addr,int addrlen); 參數(shù)說(shuō)明: sockfd:socket的文件描述符號(hào)。 sockaddr:表示名字所用的一個(gè)數(shù)據(jù)結(jié)構(gòu),用來(lái)保存地址(包括ip地址和端口) addrlen:設(shè)置結(jié)構(gòu)大小長(zhǎng)度。(3) listen()格式: int listen(int sockfd, int backlog)

19、; 作用:監(jiān)聽(tīng)連接信號(hào),和accepted函數(shù)合同。 參數(shù)說(shuō)明: sockfd:表示socket調(diào)用返回的文件描述符。 backlog:表示接入隊(duì)列允許的連接數(shù)目,大多數(shù)系統(tǒng)允許20個(gè),也可以子定義510個(gè)。(4) accept() 格式: int accept (int sockfd, void *addr, int *addrlen); 作用:與listen函數(shù)合用,監(jiān)聽(tīng)信息、接收客戶端請(qǐng)求。 參數(shù)說(shuō)明: sockfd:表示socket的文件描述符。 addr:表示指向局部的數(shù)據(jù)結(jié)構(gòu)struct sockaddr-in的指針。 addrlen:表示地址的長(zhǎng)度。(5) connect()格式

20、: int connect( int sockfd , struct sockaddr *serv_addr , int addrlen); 作用:在面向連接的系統(tǒng)中客戶及連接服務(wù)器時(shí)使用,connect必須在bind后使用。 參數(shù)作用: sockfd:表示socket的文件描述符。 serv-addr:表示村訪目的端口和ip地址(套接字)的數(shù)據(jù)結(jié)構(gòu)。(6) send() 和 recv() 格式1: int send (int sockfd, const vod *msg,int len, int flags); 功能:發(fā)送信息。 格式2: int recv (int sockfd , voi

21、d *buf,int len, usigned int flags); 作用:用于流式socket、數(shù)據(jù)報(bào)socket內(nèi)部之間的通信。(7) close( ) 和 shutdown ( )格式: close( int sockfd)或 int shutdown(int sockfd , int how); 參數(shù)說(shuō)明: how的值為下面一種: 0-不允許繼續(xù)接收; 1-不允許繼續(xù)發(fā)送; 2-不允許繼續(xù)發(fā)送和接收。(8) 有關(guān)線程的系統(tǒng)調(diào)用函數(shù)pthread_create()、pthread_join()3.2 實(shí)驗(yàn)過(guò)程說(shuō)明(使用tcp/ip)(1) 監(jiān)聽(tīng)連接 利用socket、bind、list

22、en建立連接,步驟是:1) 先用socket函數(shù)初始化socket,創(chuàng)建新的sockfd。sockfd = socket(af_int,sock_stream,0)2) 此步驟涉及到ip地址及其處理過(guò)程。參數(shù)說(shuō)明: inet_addr 函數(shù) inaddr_any該函數(shù)把由小數(shù)點(diǎn)分開(kāi)的十進(jìn)制ip地址轉(zhuǎn)為unsinged long 類型,而在實(shí)驗(yàn)中所使用的為inaddr_any,使用利用自已的ip地址自動(dòng)填充。a) 利用bind函數(shù)綁定端口和ip地址。my_addr.sin_family=af_inet; /*將地址族類型設(shè)定好 */my_addr.sin_port=htons(myport; /

23、* 將端口給其賦值*/my_addr.sin_addr.s_addr=inaddr_any; /*用連接地址自動(dòng)填充ip*/bind(sockfd,(stuct sockaddr*)&my_addr,sizeof(stuct sockaddr);/*sockfd 是分配的socket名字,my-addr則便是分配好的端口與ip,用bind綁定*/b) 利用listen監(jiān)聽(tīng)請(qǐng)求(2) 發(fā)送請(qǐng)求1)利用gethostbyname獲取主機(jī)信息。2)初始化socket端口。3)利用connect函數(shù)將自己的ip地址等信息發(fā)送到主機(jī),等待主機(jī)調(diào)用accept函數(shù)來(lái)接受請(qǐng)求。(3) 主機(jī)接收請(qǐng)求,進(jìn)行數(shù)據(jù)

24、通信1)主機(jī)利用accept接收請(qǐng)求。2)創(chuàng)建子進(jìn)程,顯示歡迎信息;3)接收返回信息,顯示連接成功,并推出連接;4)關(guān)閉客戶端口socket;5)關(guān)閉服務(wù)端socket,結(jié)束子線程。3.3 tcp通信實(shí)現(xiàn)(1) 服務(wù)端源程序清單如下,設(shè)文件名為server.c#include#include#include#include#include#include#include#include#include#define myport 3490#define backlog 10 #define maxdatasize 1024int sockfd,new_fd;pthread_t accthrea

25、d,recthread;void recmessage(void) while(1) int numbytes; char bufmaxdatasize; if(numbytes = recv(new_fd,buf,maxdatasize,0) = -1)perror(recv); exit(1); bufnumbytes = 0; if(strcmp(buf,exit) = 0)printf(client is closedn);close(new_fd);close(sockfd);exit(1);printf(client:%sn,buf); void acceptconnect(voi

26、d) struct sockaddr_in their_addr; int sin_size; sin_size = sizeof(struct sockaddr_in); if(new_fd = accept(sockfd,(struct sockaddr*)&their_addr,&sin_size) = -1) perror(accept); exit(1); printf(server:got connection from %sn,inet_ntoa(their_addr.sin_addr); if(pthread_create(&recthread,null,(void *)rec

27、message,null)!= 0) printf(create thread error!rn); exit(1); int main(void) struct sockaddr_in my_addr; if(sockfd = socket(af_inet,sock_stream,0) = -1) perror(socket); exit(1); my_addr.sin_family = af_inet; my_addr.sin_port = htons(myport); my_addr.sin_addr.s_addr = inaddr_any; bzero(&(my_addr.sin_ze

28、ro),8); if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr) = -1) perror(bind); exit(1); if(listen(sockfd,backlog) = -1) perror(listen); exit(1); if(pthread_create(&accthread,null,(void *)acceptconnect,null) != 0) printf(create thread error!rn); exit(1); while(1) char msgmaxdatasize; s

29、canf(%s,msg); if(send(new_fd,msg,strlen(msg),0) = -1) perror(send); close(new_fd); exit(1); if(strcmp(msg,exit) = 0) printf(byebye!n); close(new_fd); close(sockfd); exit(1); return 0;(2) 客戶端源程序清單如下,設(shè)文件名為client.c#include#include#include#include#include#include#include#include#include#define port 3490

30、#define maxdatasize 1024int sockfd;pthread_t recthread;void recmessage(void) while(1) int numbytes; char bufmaxdatasize; if(numbytes = recv(sockfd,buf,maxdatasize,0) = -1) perror(recv); exit(1); bufnumbytes=0; if(strcmp(buf,exit) = 0) printf(server is closedn); close(sockfd); exit(1); printf(server:

31、%sn,buf); int main(int argc,char *argv) struct hostent *he; struct sockaddr_in their_addr; if(argc != 2) fprintf(stderr,usage:client hostnamen); exit(1); if(he=gethostbyname(argv1) = null) herror(gethostbyname); exit(1); if(sockfd = socket(af_inet,sock_stream,0) = -1) perror(socket); exit(1); their_

32、addr.sin_family = af_inet; their_addr.sin_port = htons(port); their_addr.sin_addr = *(struct in_addr *)he-h_addr); bzero(&(their_addr.sin_zero),8); if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr) = -1) perror(connect); exit(1); if(pthread_create(&recthread,null,(void *)recme

33、ssage,null)!=0) printf(create thread error!rn); exit(1); while(1) char msgmaxdatasize; scanf(%s,msg); if(send(sockfd,msg,strlen(msg),0) = -1) perror(send); close(sockfd); exit(1); if(strcmp(msg,exit) = 0) printf(byebye!n); close(sockfd); exit(1); return 0;4 運(yùn)行效果程序測(cè)試環(huán)境:linux、unix、debian等操作系統(tǒng)。測(cè)試軟件:put

34、ty、vmware虛擬機(jī)(1) 在編寫(xiě)完tcp服務(wù)端程序server.c后,用 gcc lpthread o server.c server 生成程序server。(2) 在編寫(xiě)完tcp客戶端程序client.c后,用gcc lpthread o client.c client 生成程序client(3) 在主機(jī)上打開(kāi)一窗口,運(yùn)行server。(4) 再打開(kāi)另一個(gè)窗口或者在另一個(gè)主機(jī)上打開(kāi)一個(gè)窗口,運(yùn)行client,輸入服務(wù)器的ip地址,并檢查器結(jié)果的正確性。輸入:【主】# ./server【從】# ./client 127.0.0.1(127.0.0.1為本機(jī)的ip地址) 輸出:【主】#server:got connection from 127.0.0.1(5) 客戶端、服務(wù)器端窗口之間以及交錯(cuò)發(fā)送信息的方式相互發(fā)送和接收信息。1) 客戶端、服務(wù)器端窗皆通過(guò)鍵盤(pán)輸入消息內(nèi)容平回車(chē),以發(fā)送消息給對(duì)方;2) 消息中若使用空格,則作為本條消息結(jié)束及下一條消息的開(kāi)始;3) 輸入exit則推出運(yùn)行。開(kāi)始運(yùn)行后,服務(wù)器端窗口的執(zhí)行順序?yàn)椋?) 鍵入“hello,world!”發(fā)送給客戶端2) 接收客戶端發(fā)來(lái)的兩個(gè)消息;3) 鍵入“ok!”發(fā)送個(gè)客戶端;4) 輸入exit結(jié)束。服務(wù)器端運(yùn)行結(jié)果如實(shí)驗(yàn)圖4-1所示。圖4-1 服務(wù)器端窗口開(kāi)始

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論