欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      基于linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)

      時(shí)間:2019-05-12 00:05:32下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫寫幫文庫(kù)小編為你整理了多篇相關(guān)的《基于linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫(kù)還可以找到更多《基于linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)》。

      第一篇:基于linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)

      《Linux操作系統(tǒng)》課程設(shè)計(jì)報(bào)告

      學(xué) 院 工商學(xué)院

      專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 班 級(jí) 計(jì)1341 學(xué)生姓名:王慢,韓霞,孫潔茹,李強(qiáng),蔣濤

      課程設(shè)計(jì)任務(wù)書

      題 目

      基于linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)

      實(shí)驗(yàn)?zāi)康模?/p>

      《Linux操作系統(tǒng)課程設(shè)計(jì)B》是一門在課程《Linux操作系統(tǒng)與程序設(shè)計(jì)B》后獨(dú)立開設(shè)的實(shí)驗(yàn)課程。這一門實(shí)驗(yàn)課程的開設(shè)目的是為了通過(guò)學(xué)生獨(dú)立完成一個(gè)基于Linux平臺(tái)的較大型應(yīng)用程序,鞏固課堂上學(xué)到的Linux平臺(tái)上的編程規(guī)范、技術(shù)和技巧,培養(yǎng)學(xué)生的編寫較大型程序的能力和提高學(xué)生綜合應(yīng)用素質(zhì)。

      本課程設(shè)計(jì)實(shí)驗(yàn)主要圍繞Linux平臺(tái)上主流的基礎(chǔ)技術(shù)展開,這些技術(shù)包括:Linux的進(jìn)程、線程通信和同步技術(shù); socket網(wǎng)絡(luò)通信技術(shù)等,這些技術(shù)可以集中體現(xiàn)并應(yīng)用在并發(fā)程序設(shè)計(jì)中。通過(guò)并發(fā)程序的設(shè)計(jì)與開發(fā),培養(yǎng)學(xué)生底層軟件開發(fā)的能力,并為將來(lái)從事UNIX/Linux平臺(tái)開發(fā)、嵌入式開發(fā)等相對(duì)高端的軟件開發(fā)工作打下基礎(chǔ)。

      課程設(shè)計(jì)的具體內(nèi)容與要求:

      1.閱讀(一個(gè))示例代碼,理解并發(fā)程序設(shè)計(jì)并掌握基于Linux平臺(tái)并發(fā)程序設(shè)計(jì)的方法。

      2.在充分理解示例程序的基礎(chǔ)上,重新定義和完善程序的功能,定義數(shù)據(jù)結(jié)構(gòu),劃分程序的功能模塊和接口,明確每個(gè)模塊功能以及相互關(guān)系。

      3.完成程序的詳細(xì)設(shè)計(jì)和編碼,并測(cè)試。

      4.書寫并提交文檔

      目錄

      1引言.................................................................................1

      1.1課程設(shè)計(jì)背景...................................................................1 1.2課程設(shè)計(jì)目的...................................................................2 1.3課程設(shè)計(jì)內(nèi)容...................................................................4 2 技術(shù)介紹............................................................................7 2.1TCP和UDP介紹...................................................................2.2客戶/服務(wù)器模型.................................................................2.3網(wǎng)絡(luò)套接字(socket)的概念......................................................2.4多線程的概念....................................................................3 系統(tǒng)設(shè)計(jì)...........................................................................10 3.1 系統(tǒng)結(jié)構(gòu)設(shè)計(jì)...................................................................3.2通信模塊設(shè)計(jì)....................................................................4模塊實(shí)現(xiàn)............................................................................12 4.1系統(tǒng)調(diào)用相關(guān)函數(shù)................................................................4.2 系統(tǒng)實(shí)現(xiàn)過(guò)程說(shuō)明...............................................................5 運(yùn)行效果..........................................................................15 結(jié)束語(yǔ).................................................................................參考文獻(xiàn).............................................................................18 附錄..............................................................................19-24

      基于linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)

      摘 要 本課程設(shè)計(jì)主要實(shí)現(xiàn)一個(gè)Linux下的局域網(wǎng)聊天工具的設(shè)計(jì)。該設(shè)計(jì)主要分為兩部分,客戶端部分和主機(jī)部分。運(yùn)行服務(wù)器端程序可以和任意運(yùn)行了客戶端程序的主機(jī)進(jìn)行通信,通信內(nèi)容能夠通過(guò)終端顯示出來(lái)。兩個(gè)部分都使用C語(yǔ)言,利用vi編輯器,通過(guò)Berkeley套接口編程實(shí)現(xiàn)相關(guān)功能。引 言

      1.1課程設(shè)計(jì)背景

      Linux是一種針對(duì)PC計(jì)算機(jī)和工作站的操作系統(tǒng),它具有像Windows和Mac那樣的功能齊全的圖形用戶界面(GUI,Graphical User Interface)。Linus Torvald和其它的遍布世界各地的編程人員共同開發(fā)的[1]。

      提到Linux我們不能不提GNU和Unix。Richard M.Stallman建立的自由軟件聯(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(以及同一許可證下的大量其他軟件)不僅現(xiàn)在自由可用,而且皮后經(jīng)過(guò)任何修改這后都仍然可以自由使用。

      Unix是由AT—T貝爾實(shí)驗(yàn)室的Ken Thompson和Dennis Ritchie于1969年在一臺(tái)已經(jīng)廢棄了的PDP-7上開發(fā)的;最初它是一個(gè)用匯編語(yǔ)言寫成的單用戶操作系統(tǒng)。后來(lái),他們又在PDP-11上用C語(yǔ)言重新編寫(發(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版本的Unix。與此同時(shí),其它獨(dú)立開發(fā)的Unix版本也開始萌生。Unix不斷發(fā)展了,各種版本被應(yīng)用到不同的計(jì)算機(jī)使

      用。而Linux最初是專門為基于Intel的個(gè)人計(jì)算機(jī)設(shè)計(jì)的。(1)Linux的昨天

      1991年,一名叫Linus Torvalds的芬蘭大學(xué)生對(duì)Unix各種版本對(duì)于80386類的機(jī)器的脆弱支持十分不滿,他決定要開發(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)核開發(fā)到0.02版,這個(gè)版本已經(jīng)可以運(yùn)行g(shù)cc、bash和很少的一些應(yīng)用程序。后來(lái),他又開始了在因特網(wǎng)上尋求廣泛的幫助。1994年,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桌面提供的圖形用戶界面在易用性和可配置方面都能和微軟的Windows相媲美。(3)Linux的明天

      Linux最強(qiáng)大的生命力在于其公開的開發(fā)過(guò)程。每個(gè)人都有可以自由獲取內(nèi)核源程序,每個(gè)人都有要不得以運(yùn)載源程序加以修改,而后他人也可以自由獲取你修改后的源程序。Linux這種獨(dú)特的自由流暢的開發(fā)模型已被命名為bazaar(集市模型)。Bazaar開發(fā)模型通過(guò)重視實(shí)驗(yàn),征集并充分利用早期的反饋,對(duì)巨大數(shù)量的腦力資源進(jìn)行平衡配置,可以開發(fā)出更優(yōu)秀的軟件。本聯(lián)盟就是想通過(guò)bazaar開發(fā)模型,在網(wǎng)上召集一些Linux的愛(ài)好者,開發(fā)出更優(yōu)秀的操作系統(tǒng)或軟件。

      1.2課程設(shè)計(jì)目的

      本課程設(shè)計(jì)主要實(shí)現(xiàn)一個(gè)Linux下的局域網(wǎng)聊天工具的設(shè)計(jì)。該設(shè)計(jì)主要分為兩部分,客戶端部分和主機(jī)部分。運(yùn)行服務(wù)器端程序可以和任意運(yùn)行了客戶端程序的主機(jī)進(jìn)行通信,通信內(nèi)容能夠通過(guò)終端顯示出來(lái)。兩個(gè)部分都使用C語(yǔ)言,利用vi編輯器,通過(guò)Berkeley套接口編程實(shí)現(xiàn)相關(guān)功能。要求:

      (1)主要實(shí)現(xiàn)一個(gè)Linux下的局域網(wǎng)聊天工具的設(shè)計(jì),進(jìn)一步掌握vi,gcc等工具的使用,并且熟悉Linux下的網(wǎng)絡(luò)編程,以及多線程編程。

      (2)通過(guò)實(shí)際項(xiàng)目的分析、安裝、配置、測(cè)試等工作,掌握用Linux系統(tǒng)下的網(wǎng)絡(luò)聊天

      室的應(yīng)用。

      1.3課程設(shè)計(jì)內(nèi)容

      本課程設(shè)計(jì)主要實(shí)現(xiàn)一個(gè)Linux下的局域網(wǎng)聊天工具的設(shè)計(jì)。該設(shè)計(jì)主要分為兩部分,客戶端部分和主機(jī)部分。運(yùn)行服務(wù)器端程序可以和任意運(yùn)行了客戶端程序的主機(jī)進(jìn)行通信,通信內(nèi)容能夠通過(guò)終端顯示出來(lái)。兩個(gè)部分都使用C語(yǔ)言,利用vi編輯器,通過(guò)Berkeley套接口編程實(shí)現(xiàn)相關(guān)功能。技術(shù)介紹

      2.1TCP和UDP介紹

      (1)UDP通信

      UDP是用戶數(shù)據(jù)報(bào)協(xié)議的簡(jiǎn)稱。它是以中午連接的邏輯通信信道。UDP在傳送數(shù)據(jù)之前不需要先建立連接,遠(yuǎn)地主機(jī)的傳輸層在收到udp數(shù)據(jù)報(bào)后,不需要給出任何確認(rèn),所以不能保證其交付時(shí)可靠。它的特點(diǎn)是:因無(wú)連接,故提供的是不可靠的信道,但也是因無(wú)連接而具有很好的傳輸效率。(2)TCP通信

      TCP是傳輸控制協(xié)議的簡(jiǎn)稱,它是提供一條全雙工的、可靠的信道。TCP提供面向連接的服務(wù),在傳送數(shù)據(jù)之前必須先建立連接,數(shù)據(jù)傳送結(jié)束后要釋放連接。

      由于TCP要提供可靠的、面向連接的運(yùn)輸服務(wù),所以不可避免地增加了許多系統(tǒng)開銷,比如確認(rèn)、流量控制、計(jì)時(shí)器以及連接管理等都需要占用許多系統(tǒng)的時(shí)空資源。兩個(gè)計(jì)算機(jī)之間如果使用TCP通信,其連接過(guò)程需要三次握手實(shí)現(xiàn),如實(shí)驗(yàn)圖2-1所示。

      圖2.1 用三次握手建立TCP連接

      對(duì)于兩個(gè)計(jì)算機(jī)之間連接的釋放過(guò)程也需要類似的3次握手的互相確認(rèn)的過(guò)程,如實(shí)驗(yàn)圖2-2所示。

      圖2.2 TCP連接的釋放過(guò)程

      2.2客戶/服務(wù)器模型

      在客戶/服務(wù)器模型中,多個(gè)相互通信的計(jì)算機(jī)都作為客戶端,與網(wǎng)絡(luò)服務(wù)器進(jìn)行連接,并通過(guò)服務(wù)器進(jìn)行信息的傳遞[3]。所以多個(gè)客戶端之間的通信就變?yōu)榱丝蛻舳伺c服務(wù)端的通信。所以,采用客戶/服務(wù)器模型進(jìn)行網(wǎng)絡(luò)聊天需要分別編寫服務(wù)器端和客戶端的程序,服務(wù)器和客戶端之間相互通信的同步關(guān)系和各自的程序流程如實(shí)驗(yàn)圖2-3所示。

      圖2.3 Socket通信流程圖

      2.3網(wǎng)絡(luò)套接字(socket)的概念

      Socket接口上TCP/IP網(wǎng)絡(luò)應(yīng)用程序接口(API),它提供了許多函數(shù)和例程,程序員可以使用它們來(lá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ī)的一個(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)程去完成呢?

      在網(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è)線程專門負(fù)責(zé)接收信息就可以了。

      因此,對(duì)于從每個(gè)客戶端發(fā)來(lái)的請(qǐng)求,服務(wù)器端都要?jiǎng)?chuàng)建相應(yīng)的線程去接收并處理;同理,對(duì)于客戶端而言,也要?jiǎng)?chuàng)建一個(gè)線程去讀取服務(wù)器端發(fā)來(lái)的信息。系統(tǒng)設(shè)計(jì)

      3.1 系統(tǒng)結(jié)構(gòu)設(shè)計(jì)

      本系統(tǒng)采用客戶/服務(wù)器模型,在TCP/IP網(wǎng)絡(luò)應(yīng)用中,通信的兩個(gè)進(jìn)程間相互作用的主要模式是客戶/服務(wù)器模式(Client/Server model),即客戶向服務(wù)器發(fā)出服務(wù)請(qǐng)求,服務(wù)器接收到請(qǐng)求后,提供相應(yīng)的服務(wù)。客戶/服務(wù)器模式的建立基于以下兩點(diǎn):首先,建立網(wǎng)絡(luò)的起因是網(wǎng)絡(luò)中軟硬件資源、運(yùn)算能力和信息不均等,需要共享,從而造就擁有眾多資源的主機(jī)提供服務(wù),資源較少的客戶請(qǐng)求服務(wù)這一非對(duì)等作用。其次,網(wǎng)間進(jìn)程通信完全是異步的,相互通信的進(jìn)程間既不存在父子關(guān)系,又不共享內(nèi)存緩沖區(qū),因此需要一種機(jī)制為希望通信的進(jìn)程間建立聯(lián)系,為二者的數(shù)據(jù)交換提供同步,這就是客戶端/服務(wù)器模式的TCP/IP。在客戶/服務(wù)器模型中,多個(gè)相互通信的計(jì)算機(jī)都作為客戶端,與網(wǎng)絡(luò)服務(wù)器進(jìn)行連接,并通過(guò)服務(wù)器進(jìn)行信息的傳遞[4]。所以多個(gè)客戶端之間的通信就變?yōu)榱丝蛻舳伺c服務(wù)端的通信。

      服務(wù)器端和客戶端的主要組成如下:

      服務(wù)器端:套接字創(chuàng)建函數(shù)Socket(),端口綁定函數(shù)Bind(),套接口監(jiān)聽(tīng)函數(shù)Listen(),接受連接函數(shù)Accept(),數(shù)據(jù)收發(fā)函數(shù)Read()和Write(),以及套接口關(guān)閉函數(shù)Close()??蛻舳耍禾捉涌趧?chuàng)建函數(shù)Socket(),套接口連接函數(shù)Connect(),數(shù)據(jù)收發(fā)函數(shù)Read()和Write(),以及套接口關(guān)閉函數(shù)Close()。

      3.2通信設(shè)計(jì)

      首先運(yùn)行服務(wù)器端程序,通過(guò)Socket()函數(shù)會(huì)建立一個(gè)套接字,然后通過(guò)Bind()函數(shù)綁定一個(gè)端口,然后調(diào)用Listen()在套接字指定的端口上開始傾聽(tīng),利用Accept()從完全建立連接的隊(duì)列中接受一個(gè)連接,連接獲得后使用Read()和Write()函數(shù)進(jìn)行通信。通信結(jié)束后調(diào)用Close()關(guān)閉套接字描述符。

      運(yùn)行客戶端的程序,調(diào)用Socket()函數(shù)建立一個(gè)套接字,使用Connect()函數(shù)與服務(wù)器端進(jìn)行連接,連接完成后,使用Write()和Read()與服務(wù)器端進(jìn)行通信,通信結(jié)束后調(diào)用close()關(guān)閉套接字描述符。

      4系統(tǒng)實(shí)現(xiàn)

      4.1系統(tǒng)調(diào)用相關(guān)函數(shù)

      (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。其中,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);

      作用:監(jiān)聽(tīng)連接信號(hào),和accepted函數(shù)合同。

      參數(shù)說(shuō)明:

      Sockfd:表示socket調(diào)用返回的文件描述符。

      Backlog:表示接入隊(duì)列允許的連接數(shù)目,大多數(shù)系統(tǒng)允許20個(gè),也可以子定義5~10個(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()格式:

      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 , void *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()

      4.2 系統(tǒng)實(shí)現(xiàn)過(guò)程說(shuō)明

      (1)監(jiān)聽(tīng)連接

      利用socket、bind、listen建立連接,步驟是: 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)分開的十進(jìn)制IP地址轉(zhuǎn)為unsinged long 類型,而在實(shí)驗(yàn)中所使用的為INADDR_ANY,使用利用自已的IP地址自動(dòng)填充。1)利用bind函數(shù)綁定端口和IP地址。

      My_addr.sin_family=AF_INET;

      /*將地址族類型設(shè)定好 */ My_addr.sin_port=htons(MYPORT;

      /* 將端口給其賦值*/ 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綁定*/ 2)利用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ù)通信

      1)主機(jī)利用accept接收請(qǐng)求。2)創(chuàng)建子進(jìn)程,顯示歡迎信息;

      3)接收返回信息,顯示連接成功,并推出連接; 4)關(guān)閉客戶端口socket;

      5)關(guān)閉服務(wù)端socket,結(jié)束子線程。運(yùn)行效果

      (1)在編寫完TCP服務(wù)端程序server.c后,用 gcc –lpthread –o server.c server 生成程序server。

      (2)在編寫完TCP客戶端程序client.c后,用gcc –lpthread –o client.c client 生成程序client(3)在主機(jī)上打開一窗口,運(yùn)行server。

      (4)再打開另一個(gè)窗口或者在另一個(gè)主句上打開一個(gè)窗口,運(yùn)行client,輸入服務(wù)器的IP地址,并檢查器結(jié)果的正確性。輸入:【主】#./server 【從】#./client 127.0.0.1 輸出:【主】#server:got connection from 127.0.0.1(5)客戶端、服務(wù)器端窗口之間以及交錯(cuò)發(fā)送信息的方式相互發(fā)送和接收信息。

      1)客戶端、服務(wù)器端窗皆通過(guò)鍵盤輸入消息內(nèi)容平回車,以發(fā)送消息給對(duì)方; 2)消息中若使用空格,則作為本條消息結(jié)束及下一條消息的開始; 3)輸入exit則推出運(yùn)行。

      開始運(yùn)行后,服務(wù)器端窗口的執(zhí)行順序?yàn)椋?/p>

      1)輸入“hi nihao”發(fā)送給客戶端,如圖5.1所示。

      圖5.1 服務(wù)器發(fā)送消息

      2)接收客戶端發(fā)來(lái)的”ni hao”,如圖5.2所示。

      圖5.2 接收客戶端消息

      3)輸入exit結(jié)束。

      開始運(yùn)行后,客戶端窗口的執(zhí)行順序?yàn)椋?/p>

      1)接收服務(wù)器端發(fā)來(lái)的消息“hinihao”,如圖5.3所示。

      圖5.3接收服務(wù)器端消息

      2)發(fā)送消息“hinihao”給服務(wù)器端如圖5.4所示。

      圖5.4 客戶端發(fā)送消息

      3)鍵入exit結(jié)束。

      上述運(yùn)行結(jié)果表明,客戶端與服務(wù)器端之間傳遞的消息已被對(duì)方成功接收。結(jié)束語(yǔ)

      這次課程設(shè)計(jì)可謂收獲頗大,首先從一開始對(duì) linux一無(wú)所知甚至是畏懼 ,到做完實(shí)驗(yàn)后有了一定程度的了解,如果沒(méi)有這次實(shí)驗(yàn) ,我想我很難有機(jī)會(huì)去接觸從而進(jìn)一步熟悉 linux這個(gè)操作系統(tǒng)以及在 linux下的編程.通過(guò)實(shí)驗(yàn)我認(rèn)識(shí)到了系統(tǒng)調(diào)用的實(shí)現(xiàn)原理 ,系統(tǒng)信息和狀態(tài)的讀取 ,特別是最后一個(gè)實(shí)驗(yàn)應(yīng)該說(shuō)比較具有代表性 ,是一個(gè)很好的 linux環(huán)境下編程的例子.也讓我從中學(xué)到了不少 linux的知識(shí).經(jīng)過(guò)近了兩周的設(shè)計(jì)和開發(fā),網(wǎng)絡(luò)聊天室的設(shè)計(jì)設(shè)計(jì)完畢。其功能基本符合用戶需求,能夠簡(jiǎn)單的網(wǎng)絡(luò)聊天功能。但是由于課程設(shè)計(jì)時(shí)間較短,還有許多不盡如人意的地方,還有待于我們進(jìn)一步完善其功能。但我從中學(xué)到了不少的道理,真正的理解到,理論與實(shí)踐之間還是有很大的距離,這必將有利于我們以后的學(xué)習(xí)。通過(guò)此次課程設(shè)計(jì),使我更加扎實(shí)的掌握了有關(guān)Linux方面的知識(shí),在設(shè)計(jì)過(guò)程中雖然遇到了一些問(wèn)題,但經(jīng)過(guò)一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面的知識(shí)欠缺和經(jīng)驗(yàn)不足。

      回顧起此課程設(shè)計(jì),至今我仍感慨頗多,從理論到實(shí)踐,在這段日子里,可以說(shuō)得是苦多于甜,但是可以學(xué)到很多很多的東西,同時(shí)不僅可以鞏固了以前所學(xué)過(guò)的知識(shí),而且學(xué)到了很多在書本上所沒(méi)有學(xué)到過(guò)的知識(shí)。通過(guò)這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過(guò)程中遇到問(wèn)題,可以說(shuō)得是困難重重,但可喜的是最終都得到了解決。實(shí)驗(yàn)過(guò)程中,也對(duì)團(tuán)隊(duì)精神的進(jìn)行了考察,讓我們?cè)诤献髌饋?lái)更加默契,在成功后一起體會(huì)喜悅的心情。果然是團(tuán)結(jié)就是力量,只有互相之間默契融洽的配合才能換來(lái)最終完美的結(jié)果。

      實(shí)踐出真知,通過(guò)親自動(dòng)手制作,使我們掌握的知識(shí)不再是紙上談兵。在本次課題程序設(shè)計(jì)中,我學(xué)到了很多東西,通過(guò)本次課題程序設(shè)計(jì),無(wú)論在理論上還是在實(shí)踐中,我的計(jì)算機(jī)應(yīng)用水平得到了很大的提升,這對(duì)于今后的工作和學(xué)習(xí)都是一種巨大的財(cái)富。

      參考文獻(xiàn)

      [1]趙敏哲,64位Linux操作系統(tǒng)與應(yīng)用實(shí)例[M].北京:機(jī)械工業(yè)出版社,2001 [2]龐麗萍,操作系統(tǒng)原理(第三版)[M].武漢:華中科技大學(xué)出版社,2000 [3]張饒學(xué),Linux網(wǎng)絡(luò)編程[M].北京:清華大學(xué)出版社,2000 [4]金鐘夫,杜剛.淺析socket網(wǎng)絡(luò)編程[J].微計(jì)算機(jī)信息,2002,3-2,87-89 [5]王群,許中萬(wàn).Linux優(yōu)勢(shì)分析[J].計(jì)算機(jī)與現(xiàn)代化,2003(10):7-8

      附 錄

      服務(wù)端源程序清單如下,文件名為server.c #include #include #include #include #include #include #include #include #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] = '