C++基于局域網(wǎng)Linux環(huán)境下的心跳檢測(cè)系統(tǒng)實(shí)現(xiàn).doc_第1頁(yè)
C++基于局域網(wǎng)Linux環(huán)境下的心跳檢測(cè)系統(tǒng)實(shí)現(xiàn).doc_第2頁(yè)
C++基于局域網(wǎng)Linux環(huán)境下的心跳檢測(cè)系統(tǒng)實(shí)現(xiàn).doc_第3頁(yè)
C++基于局域網(wǎng)Linux環(huán)境下的心跳檢測(cè)系統(tǒng)實(shí)現(xiàn).doc_第4頁(yè)
C++基于局域網(wǎng)Linux環(huán)境下的心跳檢測(cè)系統(tǒng)實(shí)現(xiàn).doc_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

編 號(hào): 審定成績(jī): 重慶郵電大學(xué)畢業(yè)設(shè)計(jì)(論文)設(shè)計(jì)(論文)題目:c+基于局域網(wǎng)linux環(huán)境下的心跳檢測(cè)系統(tǒng)實(shí)現(xiàn)學(xué) 院 名 稱(chēng) :計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院學(xué) 生 姓 名 :胡 凱專(zhuān) 業(yè) :計(jì)算機(jī)科學(xué)與技術(shù)專(zhuān)業(yè)班 級(jí) :0490601學(xué) 號(hào) :06100107指 導(dǎo) 教 師 :易 芝答辯組 負(fù)責(zé)人 :填表時(shí)間: 2010 年 6 月重慶郵電大學(xué)教務(wù)處-58-摘 要當(dāng)今世界的網(wǎng)絡(luò)飛速發(fā)展,但也因此也產(chǎn)生了許多網(wǎng)絡(luò)故障,心跳檢測(cè)技術(shù)作為一種故障檢測(cè)技術(shù),在當(dāng)今服務(wù)器市場(chǎng)有很大需求。心跳檢測(cè)技術(shù)是一種檢測(cè)網(wǎng)絡(luò)連接故障的技術(shù),它通過(guò)在服務(wù)器端和客戶(hù)端裝上各自的心跳檢測(cè)軟件,就可以根據(jù)發(fā)送的心跳報(bào)文來(lái)監(jiān)測(cè)故障,判斷各個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)的連接是否正常1。 本文研究了心跳檢測(cè)技術(shù)在linux平臺(tái)下的實(shí)現(xiàn),設(shè)計(jì)了一款能在局域網(wǎng)上運(yùn)行的心跳檢測(cè)系統(tǒng)。該系統(tǒng)采用tcp/udp協(xié)議,以c/s模式進(jìn)行開(kāi)發(fā)。服務(wù)器充當(dāng)主控節(jié)點(diǎn),客戶(hù)端充當(dāng)外圍節(jié)點(diǎn),通過(guò)客戶(hù)端發(fā)送心跳報(bào)文的方法來(lái)實(shí)現(xiàn)心跳檢測(cè)。系統(tǒng)在節(jié)點(diǎn)的局域網(wǎng)中使用,能達(dá)到很高的成功率?!娟P(guān)鍵詞】心跳檢測(cè) 主控節(jié)點(diǎn) 外圍節(jié)點(diǎn) 報(bào)文 linuxabstractnetwork technology of todays world has the rapid development ,but also produces so many network failure, heartbeat detection technology is a detection technology as a network failure detection , and has much demand in todays server market.heartbeat detection technology is a network connection failure detection technology, server and client need only install on each heartbeat detection software, you can send packets to monitor heart failure, determine whether the various network nodes is in the normal .in this paper, the heartbeat detection technology implementation in the linux platform, designed a run in lan heartbeat detection system. the system uses tcp / udp protocol, to c / s model for development. server acts as the master node, the client acts as the external nodes, through the heartbeat messages sent by the client to achieve the heartbeat detection methods. system used in local area network node can achieve a high success rate.【key words】heartbeat detection master node peripheral node message linux目 錄abstract2前 言4第一章 系統(tǒng)簡(jiǎn)介6第一節(jié) 心跳檢測(cè)機(jī)制6第二節(jié) 本文設(shè)計(jì)的心跳檢測(cè)系統(tǒng)6第三節(jié) 本章小結(jié)7第二章開(kāi)發(fā)環(huán)境、工具和技術(shù)8第一節(jié)linux的介紹8第二節(jié)gcc簡(jiǎn)介9一、什么是gcc9二、gcc的基本規(guī)則10三、gcc的基本用法10四、執(zhí)行過(guò)程11第三節(jié) linux下的網(wǎng)絡(luò)編程技術(shù)11一、socket編程介紹11二、tcp/udp開(kāi)發(fā)簡(jiǎn)介16第四節(jié) 本章小結(jié)17第三章 系統(tǒng)的分析與設(shè)計(jì)18第一節(jié) 需求分析18一、問(wèn)題定義18二、可行性研究18三、用戶(hù)需求18四、系統(tǒng)整體用例圖19第二節(jié) 概要設(shè)計(jì)19一、設(shè)計(jì)指導(dǎo)思想20二、心跳檢測(cè)系統(tǒng)的整體結(jié)構(gòu)圖20三、總體設(shè)計(jì)21第三節(jié)詳細(xì)設(shè)計(jì)22一、心跳表注冊(cè)表的設(shè)計(jì)22二、報(bào)文格式的設(shè)計(jì)24三、外圍節(jié)點(diǎn)的設(shè)計(jì)26四、主控節(jié)點(diǎn)的設(shè)計(jì)27第四節(jié) 本章小結(jié)31第四章 心跳檢測(cè)系統(tǒng)的實(shí)現(xiàn)32第一節(jié) linux下開(kāi)發(fā)環(huán)境32一、編譯環(huán)境32二、運(yùn)行環(huán)境33第二節(jié) 程序的實(shí)現(xiàn)35一、外圍節(jié)點(diǎn)的實(shí)現(xiàn)35二、主控節(jié)點(diǎn)的設(shè)計(jì)37第三節(jié) 本章小節(jié)40第五章 系統(tǒng)測(cè)試41第一節(jié) 測(cè)試環(huán)境41第二節(jié) 測(cè)試方法41一、黑盒測(cè)試42二、測(cè)試步驟42第三節(jié) 本章小結(jié)48結(jié) 論49參考文獻(xiàn)51附 錄52一、英文原文52二、中文翻譯56前 言網(wǎng)絡(luò)是一個(gè)龐大復(fù)雜的系統(tǒng),有成千上萬(wàn)臺(tái)設(shè)備節(jié)點(diǎn),經(jīng)常會(huì)出現(xiàn)連接故障,我們不可能用人力去監(jiān)測(cè),這時(shí)負(fù)責(zé)監(jiān)測(cè)網(wǎng)絡(luò)故障的心跳檢測(cè)軟件由此產(chǎn)生。心跳檢測(cè)系統(tǒng)是基于c/s架構(gòu)開(kāi)發(fā)的網(wǎng)絡(luò)檢測(cè)系統(tǒng),隨著網(wǎng)絡(luò)技術(shù)的發(fā)展而發(fā)展,在當(dāng)今服務(wù)器市場(chǎng)上有很大需求,也日趨成熟化。比如linux平臺(tái)下的heartbeat集群軟件包就是成功的典型。我相信,在當(dāng)今it技術(shù)的推動(dòng)下,心跳檢測(cè)在未來(lái)幾年會(huì)有更廣闊的發(fā)展空間。在了解了心跳檢測(cè)的基本原理和linux網(wǎng)絡(luò)編程的基本方法之后,我設(shè)計(jì)了一個(gè)可以在局域網(wǎng)上進(jìn)行網(wǎng)絡(luò)連接檢測(cè)的心跳檢測(cè)系統(tǒng)。并對(duì)里面涉及的技術(shù)原理,設(shè)計(jì)思想進(jìn)行了相關(guān)討論。第一章 系統(tǒng)簡(jiǎn)介第一節(jié) 心跳檢測(cè)機(jī)制在分布式系統(tǒng)中,有成千上萬(wàn)個(gè)設(shè)備節(jié)點(diǎn)通過(guò)有線或者無(wú)線網(wǎng)絡(luò)連接。這些節(jié)點(diǎn)和網(wǎng)絡(luò)隨時(shí)可能發(fā)生故障,從而導(dǎo)致部分節(jié)點(diǎn)或者網(wǎng)絡(luò)癱瘓。為了確保整個(gè)系統(tǒng)正常工作,主控節(jié)點(diǎn)應(yīng)該能隨時(shí)知道其他節(jié)點(diǎn)當(dāng)前是否在正常工作。如果用人力去監(jiān)控,則會(huì)造成很大的開(kāi)銷(xiāo),且節(jié)點(diǎn)是否癱瘓有時(shí)無(wú)法從外表判斷。心跳檢測(cè)系統(tǒng)可以節(jié)省人力,根據(jù)外圍節(jié)點(diǎn)定期發(fā)送的報(bào)文來(lái)判斷設(shè)備和網(wǎng)絡(luò)是否發(fā)生故障。心跳檢測(cè)技術(shù)是分布式嵌入式系統(tǒng)中一種常見(jiàn)的故障檢測(cè)方法。在心跳檢測(cè)中,外圍節(jié)點(diǎn)將周期性向主控節(jié)點(diǎn)發(fā)送心跳報(bào)文。如果過(guò)一段時(shí)間之后,主控節(jié)點(diǎn)沒(méi)有收到外圍節(jié)點(diǎn)的心跳報(bào)文,則認(rèn)為此節(jié)點(diǎn)或相關(guān)網(wǎng)絡(luò)出現(xiàn)故障,并向管理員報(bào)告。它有如下特點(diǎn):基于c/s模式,主控節(jié)點(diǎn)(服務(wù)器端)判斷外圍節(jié)點(diǎn)(客戶(hù)端)是否正常運(yùn)行,一般采用定時(shí)發(fā)送簡(jiǎn)單的心跳報(bào)文,如果在指定時(shí)間段內(nèi)未收到對(duì)方響應(yīng),則判斷連接出現(xiàn)故障。用于檢測(cè)網(wǎng)絡(luò)的異常斷開(kāi)。發(fā)包方可以是客戶(hù)端也可以是服務(wù)器端,看哪邊實(shí)現(xiàn)方便合理。一般是客戶(hù)端,服務(wù)器也可以定時(shí)輪詢(xún)發(fā)心跳下去(我的系統(tǒng)是采用客戶(hù)端發(fā)報(bào)文)。檢測(cè)方法就是外圍節(jié)點(diǎn)每隔幾分鐘發(fā)送一個(gè)心跳報(bào)文給主控節(jié)點(diǎn),服務(wù)端收到后回復(fù)一個(gè)響應(yīng)報(bào)文。如果服務(wù)端在規(guī)定時(shí)間內(nèi)沒(méi)有收到客戶(hù)端信息則視連接斷開(kāi)。第二節(jié) 本文設(shè)計(jì)的心跳檢測(cè)系統(tǒng)在介紹了心跳檢測(cè)系統(tǒng)的概念、特點(diǎn)、作用之后,下面介紹了我所設(shè)計(jì)的系統(tǒng)的一些情況。由于該設(shè)計(jì)主要是針對(duì)10臺(tái)左右的小范圍的局域網(wǎng)設(shè)計(jì)的心跳檢測(cè)系統(tǒng),沒(méi)有涉及到數(shù)據(jù)庫(kù)存儲(chǔ)的相關(guān)知識(shí),因此該系統(tǒng)的優(yōu)點(diǎn)是所需要的硬件代價(jià)小,實(shí)現(xiàn)起來(lái)的網(wǎng)絡(luò)連接相對(duì)簡(jiǎn)單,能針對(duì)自己組建的局域網(wǎng)來(lái)測(cè)試。當(dāng)然,該設(shè)計(jì)的功能差了很多,比如在數(shù)據(jù)庫(kù)中記錄節(jié)點(diǎn)出錯(cuò)時(shí)間,監(jiān)控節(jié)點(diǎn)數(shù)量的多少,網(wǎng)絡(luò)阻塞引起的延時(shí)等方面并沒(méi)有涉及到。我相信,我今后在學(xué)習(xí)更多網(wǎng)絡(luò)故障檢測(cè)技術(shù)和網(wǎng)絡(luò)編程技術(shù)后,會(huì)將上述功能一一實(shí)現(xiàn)。 我的設(shè)計(jì)在linux平臺(tái)下,采用了c/s模式,服務(wù)器端充當(dāng)主控節(jié)點(diǎn),客戶(hù)端充當(dāng)外圍節(jié)點(diǎn),外圍節(jié)點(diǎn)先發(fā)送tcp報(bào)文進(jìn)行和主控節(jié)點(diǎn)建立連接,在建立連接成功后,發(fā)送心跳報(bào)文,心跳報(bào)文則采用udp格式設(shè)計(jì)。而后每隔一秒發(fā)送一次心跳報(bào)文,主控節(jié)點(diǎn)根據(jù)心跳報(bào)文來(lái)檢測(cè)網(wǎng)絡(luò)連接是否正常。第三節(jié) 本章小結(jié)本章先從心跳檢測(cè)的用途出發(fā),介紹了心跳檢測(cè)的概念,以及它使用的原理,使大家對(duì)心跳檢測(cè)有了大致的了解。最后大致介紹了我自己設(shè)計(jì)的心跳檢測(cè)系統(tǒng)的一些情況,包括優(yōu)缺點(diǎn)和大致的實(shí)現(xiàn)情況。第二章 開(kāi)發(fā)環(huán)境、工具和技術(shù)第一節(jié) linux的介紹linux是一類(lèi)unix計(jì)算機(jī)操作系統(tǒng)的統(tǒng)稱(chēng)。linux操作系統(tǒng)的內(nèi)核的名字也是“l(fā)inux”。linux操作系統(tǒng)也是自由軟件和開(kāi)放源代碼發(fā)展中最著名的例子。嚴(yán)格來(lái)講,linux這個(gè)詞本身只表示linux內(nèi)核,但在實(shí)際上人們已經(jīng)習(xí)慣了用linux來(lái)形容整個(gè)基于linux內(nèi)核,并且使用gnu 工程各種工具和數(shù)據(jù)庫(kù)的操作系統(tǒng)。linux得名于計(jì)算機(jī)業(yè)余愛(ài)好者linus torvalds。當(dāng)時(shí)他是芬蘭赫爾辛基大學(xué)的學(xué)生。他的目的是想設(shè)計(jì)一個(gè)代替minix(是由一位名叫andrew tannebaum的計(jì)算機(jī)教授編寫(xiě)的一個(gè)操作系統(tǒng)示教程序)的操作系統(tǒng),這個(gè)操作系統(tǒng)可用于386、486或奔騰處理器的個(gè)人計(jì)算機(jī)上,并且具有unix操作系統(tǒng)的全部功能,因而開(kāi)始了linux雛形的設(shè)計(jì)。出于愛(ài)好,他根據(jù)可在低檔機(jī)上使用的minix設(shè)計(jì)了一個(gè)系統(tǒng)核心linux 0.01,但沒(méi)有使用任何minix或unix的源代碼。他通過(guò)usenet(就是新聞組)宣布這是一個(gè)免費(fèi)的系統(tǒng),主要在x86電腦上使用,希望大家一起來(lái)將它完善,并將源代碼放到了芬蘭的ftp站點(diǎn)上任人免費(fèi)下載。linux以它的靈活性和高效性著稱(chēng)。能夠在個(gè)人計(jì)算機(jī)上面實(shí)現(xiàn)全部的unix的特性。具有多任務(wù)、多用戶(hù)的能力。linux在gnu的gpl公共許可權(quán)下免費(fèi)獲得。linux不僅僅包括完整的操作系統(tǒng),還包括文本編輯器、高級(jí)語(yǔ)言編譯器等應(yīng)用軟件。它還包括帶有多個(gè)窗口管理器的x-windows圖形用戶(hù)界面。目前,linux能夠運(yùn)用于各種版本的cpu的計(jì)算機(jī)上,還能運(yùn)用于一些手持設(shè)備,比如說(shuō),pda,游戲機(jī),手機(jī),嵌入式產(chǎn)品等等。由于linux的開(kāi)源性以及免費(fèi)性,很多廠家都選擇應(yīng)用linux開(kāi)發(fā),以降低成本,在增強(qiáng)競(jìng)爭(zhēng)力的同時(shí)也推進(jìn)了linux系統(tǒng)的發(fā)展。 絕大多數(shù)基于linux內(nèi)核的操作系統(tǒng)使用了大量的gnu軟件,包括了shell程序、工具、程序庫(kù)、編譯器及工具,還有許多其他程序,例如emacs。linux的基本思想有兩點(diǎn):第一,一切都是文件;第二,每個(gè)軟件都有確定的用途。其中第一條詳細(xì)來(lái)講就是系統(tǒng)中的所有都?xì)w結(jié)為一個(gè)文件,包括命令、硬件和軟件設(shè)備、操作系統(tǒng)、進(jìn)程等等對(duì)于操作系統(tǒng)內(nèi)核而言,都被視為擁有各自特性或類(lèi)型的文件。至于說(shuō)linux是基于unix的,很大程度上也是因?yàn)檫@兩者的基本思想十分相近。linux的優(yōu)點(diǎn)集中體現(xiàn)在以下幾點(diǎn):低廉性:基于其低廉成本與高度可設(shè)定性,linux常常被應(yīng)用于嵌入式系統(tǒng),例如機(jī)頂盒、移動(dòng)電話及行動(dòng)裝置等。在移動(dòng)電話上,linux已經(jīng)成為與symbian os、windows mobile系統(tǒng)并列的三大智能手機(jī)操作系統(tǒng)之一;而在移動(dòng)裝置上,則成為windows ce與palm os外之另一個(gè)選擇。廣泛性:基于linux的開(kāi)源性給人們帶來(lái)的巨大誘惑,linux的的應(yīng)用越來(lái)越廣,linux社區(qū)的人員的增多,致使基于linux的開(kāi)發(fā)越來(lái)越方便容易。根據(jù)2005年11月號(hào)的top500超級(jí)電腦列表,顯示世上最快速的兩組超級(jí)電腦都是使用linux作為其操作系統(tǒng)。而在表列的500套系統(tǒng)里,采用linux為操作系統(tǒng)的,占了371組(即74.2%),其中的前十位者,有7組是使用linux的。目前,除了一部分專(zhuān)家之外,大多數(shù)人都不自己選擇每一樣組件或自行設(shè)置,而是直接使用linux套件。靈活性:linux以它的高效性和靈活性著稱(chēng)。它能夠在pc計(jì)算機(jī)上實(shí)現(xiàn)全部的unix特性,具有多任務(wù)、多用戶(hù)的能力。linux是在gnu公共許可權(quán)限下免費(fèi)獲得的,是一個(gè)符合posix標(biāo)準(zhǔn)的操作系統(tǒng)。linux操作系統(tǒng)軟件包不僅包括完整的linux操作系統(tǒng),而且還包括了文本編輯器、高級(jí)語(yǔ)言編譯器等應(yīng)用軟件。它還包括帶有多個(gè)窗口管理器的x-window圖形用戶(hù)界面,如同我們使用windows nt一樣,允許我們使用窗口、圖標(biāo)和菜單對(duì)系統(tǒng)進(jìn)行操作。總的來(lái)說(shuō),linux由于有著諸多windows操作系統(tǒng)所缺乏的優(yōu)點(diǎn),能夠讓我們?cè)谇度胧綉?yīng)用中如魚(yú)得水2。第二節(jié) gcc簡(jiǎn)介一、 什么是gccgcc是gnu公社的一個(gè)項(xiàng)目。是一個(gè)用于編程開(kāi)發(fā)的自由編譯器。最初,gcc只是一個(gè)c語(yǔ)言編譯器,它是gnu c compiler 的英文縮寫(xiě)。隨著眾多自由開(kāi)發(fā)者的加入和gcc自身的發(fā)展,如今的gcc已經(jīng)是一個(gè)包含眾多語(yǔ)言的編譯器了。其中包括 c,c+,ada,object c和java等。所以,gcc也由原來(lái)的gnu c compiler變?yōu)間nu compiler collection。也就是 gnu編譯器家族的意思。當(dāng)然,如今的gcc借助于它的特性,可以交叉編譯,即在一個(gè)平臺(tái)下編譯另一個(gè)平臺(tái)的代碼。直到現(xiàn)在,gcc的歷史仍然在繼續(xù),它的傳奇仍然被人所傳頌。而且更重要的是gcc完全是一款免費(fèi)的自由軟件,加之其強(qiáng)大的功能所以深受廣大用戶(hù)的喜愛(ài)。二、gcc的基本規(guī)則gcc所遵循的部分約定規(guī)則: .c為后綴的文件,c語(yǔ)言源代碼文件; .a為后綴的文件,是由目標(biāo)文件構(gòu)成的檔案庫(kù)文件; .c,.cc或.cxx 為后綴的文件,是c+源代碼文件; .h為后綴的文件,是程序所包含的頭文件; .i 為后綴的文件,是已經(jīng)預(yù)處理過(guò)的c源代碼文件; .ii為后綴的文件,是已經(jīng)預(yù)處理過(guò)的c+源代碼文件; .m為后綴的文件,是objective-c源代碼文件; .o為后綴的文件,是編譯后的目標(biāo)文件; .s為后綴的文件,是匯編語(yǔ)言源代碼文件; .s為后綴的文件,是經(jīng)過(guò)預(yù)編譯的匯編語(yǔ)言源代碼文件。三、gcc的基本用法在使用gcc編譯器的時(shí)候,我們必須給出一系列必要的調(diào)用參數(shù)和文件名稱(chēng)。gcc編譯器的調(diào)用參數(shù)大約有100多個(gè),其中多數(shù)參數(shù)我們可能根本就用不到,這里只介紹其中最基本、最常用的參數(shù)。 gcc最基本的用法是gcc options filenames 其中options就是編譯器所需要的參數(shù),filenames給出相關(guān)的文件名稱(chēng)。 -c,只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。 -o output_filename,確定輸出文件的名稱(chēng)為output_filename,同時(shí)這個(gè)名稱(chēng)不能和源文件同名。如果不給出這個(gè)選項(xiàng),gcc就給出預(yù)設(shè)的可執(zhí)行文件a.out。 -g,產(chǎn)生符號(hào)調(diào)試工具(gnu的gdb)所必要的符號(hào)資訊,要想對(duì)源代碼進(jìn)行調(diào)試,我們就必須加入這個(gè)選項(xiàng)。 -o,對(duì)程序進(jìn)行優(yōu)化編譯、連接,采用這個(gè)選項(xiàng),整個(gè)源代碼會(huì)在編譯、連接過(guò)程中進(jìn)行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應(yīng)地要慢一些。 -o2,比-o更好的優(yōu)化編譯、連接,當(dāng)然整個(gè)編譯、連接過(guò)程會(huì)更慢。 -idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過(guò)程中使用的參數(shù)。c程序中的頭文件包含兩種情況 a)#include b)#include “myinc.h” 其中,a類(lèi)使用尖括號(hào)(),b類(lèi)使用雙引號(hào)(“ ”)。對(duì)于a類(lèi),預(yù)處理程序cpp在系統(tǒng)預(yù)設(shè)包含文件目錄(如/usr/include)中搜尋相應(yīng)的文件,而b類(lèi),預(yù)處理程序在目標(biāo)文件的文件夾內(nèi)搜索相應(yīng)文件。四、執(zhí)行過(guò)程 雖然我們稱(chēng)gcc是c語(yǔ)言的編譯器,但使用gcc由c語(yǔ)言源代碼文件生成可執(zhí)行文件的過(guò)程不僅僅是編譯的過(guò)程,而是要經(jīng)歷四個(gè)相互關(guān)聯(lián)的步驟:預(yù)編譯,編譯,匯編和鏈接 命令gcc首先調(diào)用cpp進(jìn)行預(yù)處理,在預(yù)處理過(guò)程中,對(duì)源代碼文件中的文件包含(include)、預(yù)編譯語(yǔ)句(如宏定義define等)進(jìn)行分析。接著調(diào)用cc1進(jìn)行編譯,這個(gè)階段根據(jù)輸入文件生成以.o為后綴的目標(biāo)文件。匯編過(guò)程是針對(duì)匯編語(yǔ)言的步驟,調(diào)用as進(jìn)行工作,一般來(lái)講,.s為后綴的匯編語(yǔ)言源代碼文件和匯編、.s為后綴的匯編語(yǔ)言文件經(jīng)過(guò)預(yù)編譯和匯編之后都生成以.o為后綴的目標(biāo)文件。當(dāng)所有的目標(biāo)文件都生成之后,gcc就調(diào)用ld來(lái)完成最后的關(guān)鍵性工作,這個(gè)階段就是連接。在連接階段,所有的目標(biāo)文件被安排在可執(zhí)行程序中的恰當(dāng)?shù)奈恢?,同時(shí),該程序所調(diào)用到的庫(kù)函數(shù)也從各自所在的檔案庫(kù)中連到合適的地方3。第三節(jié) linux下的網(wǎng)絡(luò)編程技術(shù)一、socket編程介紹在介紹心跳檢測(cè)的詳細(xì)設(shè)計(jì)之前,首先介紹linux下的網(wǎng)絡(luò)程序設(shè)計(jì)方法。在linux系統(tǒng)中,最常用的網(wǎng)絡(luò)應(yīng)用編程結(jié)構(gòu)是unix bsd的套接字接口。socket編程有字節(jié)流和數(shù)據(jù)報(bào)兩種主要類(lèi)型,分別對(duì)應(yīng)tcp協(xié)議和udp協(xié)議。其中字節(jié)流socket定義了一種可靠的面向連接的服務(wù),實(shí)現(xiàn)了無(wú)差錯(cuò)無(wú)重復(fù)的順序數(shù)據(jù)傳輸。數(shù)據(jù)報(bào)socket定義了一種無(wú)連接的服務(wù),數(shù)據(jù)通過(guò)相互獨(dú)立的報(bào)文進(jìn)行傳輸,是無(wú)序的,并且無(wú)法保證可靠無(wú)差錯(cuò)。無(wú)連接服務(wù)器一般都是面向事務(wù)處理的,一個(gè)請(qǐng)求一個(gè)應(yīng)答就完成了客戶(hù)和服務(wù)器之間的交互。下面就是本系統(tǒng)所用到的socket編程函數(shù): 創(chuàng)建套接字:int socket( int domain, int type, int protocol ); 應(yīng)用程序調(diào)用socket函數(shù)來(lái)創(chuàng)建一個(gè)能夠進(jìn)行網(wǎng)絡(luò)通信的套接字。domain:指定應(yīng)用程序使用的通信協(xié)議的協(xié)議族,對(duì)于tcp/ip協(xié)議族,該參數(shù)置af_inet;type:指定要?jiǎng)?chuàng)建的套接字類(lèi)型,流套接字類(lèi)型為sock_stream、數(shù)據(jù)報(bào)套接字類(lèi)型為sock_dgram;protocol:指定應(yīng)用程序所使用的通信協(xié)議,一般設(shè)置為0。該函數(shù)如果調(diào)用成功就返回新創(chuàng)建的套接字的描述符,套接字描述符是一個(gè)整數(shù)類(lèi)型的值;如果失敗就返回-1。 綁定套接字#includeint bind(int socket, const struct sockaddr *address, size_t address_len);socket:由socket()調(diào)用返回的套接字描述符;addreess:結(jié)構(gòu)指針指向了與協(xié)議名稱(chēng)和協(xié)議相關(guān)的信息;address_len:指明了address數(shù)據(jù)結(jié)構(gòu)的大小。如果調(diào)用成功,bind()函數(shù)返回0;否則返回-1,并設(shè)置錯(cuò)誤代碼到errno。 等待客戶(hù)端連接服務(wù)器端應(yīng)用軟件通過(guò)調(diào)用accept()函數(shù)將自身阻塞,直至有新的客戶(hù)端連接。#includeint accept(int socket,struct sockaddr *address,socketlen_t address_len);socket:創(chuàng)建并綁定的套接字;address:返回連接服務(wù)器的客戶(hù)端地址信息;address_len:指明了address數(shù)據(jù)結(jié)構(gòu)的大小。如果調(diào)用成功,則返回非負(fù)的連接套接字;否則返回-1,并設(shè)置錯(cuò)誤代碼到errno。 連接服務(wù)器客戶(hù)端通過(guò)connect()函數(shù)和服務(wù)器進(jìn)行tcp連接。#include int connect(int socket, const struct sockaddr *address, size_t address_len);socket:創(chuàng)建并綁定套接字;address:指明要連接服務(wù)器的ip地址和端口號(hào);address_len:指明了address數(shù)據(jù)結(jié)構(gòu)的大小。如果調(diào)用成功,返回0;否則返回-1,并設(shè)置錯(cuò)誤代碼到errno。 udp協(xié)議的發(fā)送數(shù)據(jù)udp協(xié)議需要通過(guò)sendto()函數(shù)實(shí)現(xiàn)一個(gè)數(shù)據(jù)包的發(fā)送,這是因?yàn)閡dp協(xié)議提供的是以數(shù)據(jù)包為單位的傳輸,而tcp協(xié)議提供的是以字節(jié)流為單位的傳輸。#includessize_t sendto(int socket,const void*message,size_t length,int flags,const struct sockaddr*dest_addr,socklen_t dest_len);socket:已經(jīng)創(chuàng)建的套接字;message:指明要發(fā)送的數(shù)據(jù)包的地址;length:數(shù)據(jù)包大?。籪lags:設(shè)置發(fā)送的屬性,一般可設(shè)置為0;dest_addr:指明目的端的ip地址和端口號(hào);dest_len:指明dest_addr數(shù)據(jù)結(jié)構(gòu)的大小。如果調(diào)用成功,返回實(shí)際發(fā)送的數(shù)據(jù)數(shù)目;否則返回-1,并設(shè)置錯(cuò)誤代碼到errno。 udp協(xié)議的接收數(shù)據(jù)udp協(xié)議需要通過(guò)recvfrom()函數(shù)接收一個(gè)數(shù)據(jù)包。#includessize_t recvfrom(int socket,void* buffer,size_t length,int flags,struct sockaddr* address,socklen_t address_len);socket:已經(jīng)創(chuàng)建的套接字;message:指明要接收的數(shù)據(jù)包的地址;length:數(shù)據(jù)包大??;flags:設(shè)置發(fā)送的屬性,一般可設(shè)置為0;dest_addr:指明目的端的ip地址和端口號(hào);dest_len:指明dest_addr數(shù)據(jù)結(jié)構(gòu)的大小。如果調(diào)用成功,返回實(shí)際發(fā)送的數(shù)據(jù)數(shù)目;否則返回-1,并設(shè)置錯(cuò)誤代碼到errno。 向一個(gè)已連接的套接口發(fā)送數(shù)據(jù)。#include ssize_t send(int socket, const char void* buffer, int length, int flags);socket:一個(gè)用于標(biāo)識(shí)已連接套接口的描述字;buffer:包含待發(fā)送數(shù)據(jù)的緩沖區(qū);length:緩沖區(qū)中數(shù)據(jù)的長(zhǎng)度;flags:調(diào)用執(zhí)行方式;若無(wú)錯(cuò)誤發(fā)生,send()返回所發(fā)送數(shù)據(jù)的總數(shù);否則的話,返回-1并把錯(cuò)誤保存到errno。 從一個(gè)已連接的套接口接收數(shù)據(jù)。#include ssize_t recv( int socket, char * buffer, int length, int flags);socket:一個(gè)標(biāo)識(shí)已連接套接口的描述字;buffer:用于接收數(shù)據(jù)的緩沖區(qū);length:緩沖區(qū)長(zhǎng)度;flags:指定調(diào)用方式;若無(wú)錯(cuò)誤發(fā)生,recv()返回讀入的字節(jié)數(shù)。如果連接已中止,返回0;否則的話,返回-1并把錯(cuò)誤保存到errno。 ip地址的轉(zhuǎn)換和獲取在上述套接字程序設(shè)計(jì)中,服務(wù)器和客戶(hù)端的ipv4地址采用了32為無(wú)符號(hào)整數(shù)表示。在用戶(hù)方面,廣泛使用的是十進(jìn)制字符串表示(例如2)或者主機(jī)名稱(chēng)(例如)。linux操作系統(tǒng)提供了一系列函數(shù)實(shí)現(xiàn)這幾種格式之間的轉(zhuǎn)換。#includein_addr_t inet_addr(char* cp);cp:指向十進(jìn)制字符串表示的ipv4地址。如果調(diào)用成功,返回ipv4地址的32位無(wú)符號(hào)整數(shù)表示;否則返回in_addr_t-l。 gethostbyname()函數(shù)可以實(shí)現(xiàn)從主機(jī)名稱(chēng)到32位無(wú)符號(hào)整數(shù)表示的轉(zhuǎn)換。#includestruct hostent char *h_name; char *h_aliases; int h_addrtype; int h_length; char *h_addr_list;struct hostent *gethostbyname(const char *name);name:指明了主機(jī)名稱(chēng)的字符串。如果調(diào)用成功,返回指向hostent的指針;否則返回null,并設(shè)置錯(cuò)誤代碼到h_erno。其中hostent中的h_length指明了主機(jī)地址的長(zhǎng)度,在ipv4協(xié)議下始終為1。h_addr_list指明了主機(jī)的所有網(wǎng)絡(luò)地址。一般情況下,h_addr_list0就表明了此主機(jī)ipv4地址的32位無(wú)符號(hào)整數(shù)表示。 gethostbyaddr()函數(shù)可以實(shí)現(xiàn)從32為無(wú)符號(hào)整數(shù)到主機(jī)名稱(chēng)的轉(zhuǎn)換。#includestruct hostent *gethostbyaddr(const void *addr,socklen_t len,int type);addr:指明了32位無(wú)符號(hào)整數(shù)表示的ipv4地址;len:指明了地址長(zhǎng)度;type:在ipv4協(xié)議下,可以設(shè)置為af_inet。如果調(diào)用成功,返回指向hostent的指針;否則返回null,并設(shè)置錯(cuò)誤代碼到h_errno。 線程創(chuàng)建函數(shù)#includeint pthread_create(pthread_t *thread,pthread_ayyr_t *attr,void*(*start_routine)(void *),void *arg)thread:這是一個(gè)指向pthread_t類(lèi)型數(shù)據(jù)的指針。線程被創(chuàng)建時(shí),這個(gè)指針指向的變量中將被寫(xiě)入一個(gè)標(biāo)識(shí)符,我們用該標(biāo)識(shí)符來(lái)引用線程。attr:這個(gè)參數(shù)一般用于設(shè)置線程的屬性,我們一般不需要設(shè)置特殊的屬性,所以可以簡(jiǎn)單的設(shè)置該參數(shù)為null。start_routine :這個(gè)參數(shù)告訴線程將要啟動(dòng)的函數(shù)。arg:這個(gè)參數(shù)將傳遞啟動(dòng)函數(shù)的參數(shù) 。二、tcp/udp開(kāi)發(fā)簡(jiǎn)介1、tcp開(kāi)發(fā)介紹在基于tcp協(xié)議的程序設(shè)計(jì)中一般采用客戶(hù)端/服務(wù)器的程序設(shè)計(jì)模式。在服務(wù)器端首先使用socket()函數(shù)創(chuàng)建套接字,然后使用bind()函數(shù)將本機(jī)ip地址和服務(wù)端口綁定至套接字,并通過(guò)listen()函數(shù)建立等待隊(duì)列,隨后就可以使用accept()函數(shù)等待客戶(hù)端的連接。accept()函數(shù)將一直阻塞,直至有一個(gè)客戶(hù)端連接到本地服務(wù)器端口為止。該函數(shù)將返回一個(gè)新的套接字值,隨后服務(wù)器就可以通過(guò)新的套接字接口與連接上的客戶(hù)端利用rend()或write()函數(shù)進(jìn)行交互??蛻?hù)端在訪問(wèn)服務(wù)器時(shí)首先要通過(guò)socket()函數(shù)調(diào)用,然后通過(guò)connect()函數(shù)連接服務(wù)器的ip地址和相應(yīng)的服務(wù)器端口號(hào)。連接成功后,就可以通過(guò)read()或者write()函數(shù)與服務(wù)器進(jìn)行數(shù)據(jù)交互了。客戶(hù)端/服務(wù)器結(jié)構(gòu)下的tcp應(yīng)用程序框架如圖所示5:socket():創(chuàng)建套接字bind():綁定本機(jī)地址和端口號(hào)listen():設(shè)置等待隊(duì)列accept():等待客戶(hù)端連接sendto()和recv()與客戶(hù)端交換數(shù)據(jù)close()關(guān)閉特定客戶(hù)端套接字socket:創(chuàng)建套接字connect()連接服務(wù)器sendto()和recv()與服務(wù)器端交換數(shù)據(jù)close()關(guān)閉套接字建立請(qǐng)求圖2.1客戶(hù)端/服務(wù)器結(jié)構(gòu)下的tcp協(xié)議程序結(jié)構(gòu)圖2、udp開(kāi)發(fā)介紹基于udp協(xié)議的應(yīng)用程序設(shè)計(jì)比較簡(jiǎn)單。首先通信雙方都要利用socket()函數(shù)創(chuàng)建套接字,然后將本機(jī)ip地址和端口通過(guò)bind()函數(shù)與套接字綁定。綁定后,可以直接使用sendto()函數(shù)向?qū)Ψ桨l(fā)送消息。使用recvfrom()函數(shù)可以接收指定端口的udp包,并通過(guò)返回的address結(jié)構(gòu)獲知發(fā)送方的ip地址和端口號(hào)。第四節(jié) 本章小結(jié)本章主要介紹了該系統(tǒng)開(kāi)發(fā)的環(huán)境和平臺(tái),linux是一款流行的網(wǎng)絡(luò)操作系統(tǒng),由unix演化了來(lái),具有豐富和網(wǎng)絡(luò)功能,開(kāi)發(fā)的函數(shù)庫(kù)較多,功能強(qiáng)大。gcc是一款開(kāi)源的編譯器,有強(qiáng)大的編譯調(diào)試的能力,使本系統(tǒng)的開(kāi)發(fā)、測(cè)試,輕松了很多。最后介紹了本章的網(wǎng)絡(luò)編程的一些知識(shí),包括tcp/udp技術(shù)檢測(cè)和一些系統(tǒng)開(kāi)發(fā)用到的socket函數(shù)。第三章 系統(tǒng)的分析與設(shè)計(jì)第一節(jié) 需求分析一、問(wèn)題定義本系統(tǒng)的問(wèn)題概述如下:基本問(wèn)題是linux以及網(wǎng)絡(luò)編程的研究,基本目標(biāo)是設(shè)計(jì)一個(gè)基于linux環(huán)境的心跳檢測(cè)的系統(tǒng)來(lái)判斷局域網(wǎng)的網(wǎng)絡(luò)連接是否正常。 二、可行性研究可行性分析的任務(wù)不是研究如何解決問(wèn)題,而是要用最小的代價(jià)在最短的時(shí)間內(nèi),確定問(wèn)題定義階段所定義的問(wèn)題是否值得解決。一般情況下,主要從技術(shù)可行性、經(jīng)濟(jì)可行性和操作可行性三個(gè)方面論證系統(tǒng)開(kāi)發(fā)的可行性。該系統(tǒng)可在小范圍的局域網(wǎng)上進(jìn)行使用,因此從可操作性來(lái)講是可行的。其次,設(shè)計(jì)開(kāi)發(fā)這樣的一款心跳檢測(cè)系統(tǒng)只需要幾臺(tái)電腦構(gòu)成局域網(wǎng)就可以使用。下面主要從技術(shù)可行性進(jìn)行分析:開(kāi)發(fā)工具和環(huán)境linux是一款比較成熟的操作系統(tǒng),它有unix演化發(fā)展而來(lái),和unix有多相似之處。所用的函數(shù)包基本一致,再加上gcc的強(qiáng)大編譯、調(diào)試的功能,對(duì)完成這個(gè)系統(tǒng)由很大幫助。 算法該系統(tǒng)不需要什么復(fù)雜的算法,只需掌握l(shuí)inux環(huán)境下的tcp/ip網(wǎng)絡(luò)方面的知識(shí),能夠熟練運(yùn)用linux下的網(wǎng)絡(luò)編程和線程函數(shù),就可以寫(xiě)出。幸運(yùn)的是,通過(guò)查閱大量豐富的技術(shù)資料,我有信心解決這一問(wèn)題。 自身素質(zhì)因素通過(guò)大學(xué)四年的學(xué)習(xí),我打下了堅(jiān)實(shí)的專(zhuān)業(yè)基礎(chǔ),最重要的是學(xué)會(huì)了自主學(xué)習(xí)和查閱資料的能力,這都將為我今后的設(shè)計(jì)開(kāi)發(fā)過(guò)程提供強(qiáng)有力的保障。通過(guò)以上分析,可以很確定這一系統(tǒng)的可行性,可以放心地開(kāi)始下一階段的任務(wù)了。三、用戶(hù)需求本系統(tǒng)分為外圍節(jié)點(diǎn)和主控節(jié)點(diǎn)的設(shè)計(jì),它們有各自的功能:1、外圍節(jié)點(diǎn)功能 外圍節(jié)點(diǎn)所需要完成的功能相對(duì)簡(jiǎn)單,它只需要先發(fā)送登錄報(bào)文進(jìn)行注冊(cè),收到主控節(jié)點(diǎn)的反饋報(bào)文之后,定期(每隔一秒)發(fā)送心跳報(bào)文即可,不涉及太多功能。2、主控節(jié)點(diǎn)功能 主控節(jié)點(diǎn)是系統(tǒng)的關(guān)鍵部分,它負(fù)責(zé)接收登錄報(bào)文和心跳報(bào)文,然后根據(jù)報(bào)文的內(nèi)容來(lái)判斷網(wǎng)絡(luò)連接情況,可以說(shuō)本系統(tǒng)的主要功能基本上由主控節(jié)點(diǎn)完成:完成接收心跳報(bào)文功能主控節(jié)點(diǎn)收到外圍節(jié)點(diǎn)的登錄報(bào)文后,就完成對(duì)外圍節(jié)點(diǎn)信息的注冊(cè),包括外圍節(jié)點(diǎn)的設(shè)備號(hào)和分配的槽口號(hào)等,并將槽口號(hào)返回給外圍節(jié)點(diǎn)。完成接收心跳報(bào)文功能主控節(jié)點(diǎn)接收到心跳報(bào)文后,由于心跳報(bào)文中帶有槽口號(hào),主控節(jié)點(diǎn)根據(jù)槽口號(hào)查找外圍節(jié)點(diǎn)注冊(cè)表,修改響應(yīng)信息。完成定期檢查外圍節(jié)點(diǎn)功能 主控節(jié)點(diǎn)要定期檢查外圍節(jié)點(diǎn)注冊(cè)表,從而發(fā)現(xiàn)節(jié)點(diǎn)是否正常工作,如果不正常就報(bào)告響應(yīng)的故障消息。四、系統(tǒng)整體用例圖圖3.1 系統(tǒng)用例圖第二節(jié) 概要設(shè)計(jì)概括地說(shuō),概要設(shè)計(jì)進(jìn)行數(shù)據(jù)設(shè)計(jì)/數(shù)據(jù)庫(kù)設(shè)計(jì)和系統(tǒng)體系結(jié)構(gòu)設(shè)計(jì)。其目的只是描繪出軟件的總體框架,根據(jù)功能、性能需求和數(shù)據(jù)需求導(dǎo)出軟件的數(shù)據(jù)結(jié)構(gòu)和系統(tǒng)結(jié)構(gòu)。一、設(shè)計(jì)指導(dǎo)思想 模塊化模塊是構(gòu)成程序的基本構(gòu)件,模塊化就是把程序劃分成獨(dú)立命名且可獨(dú)立訪問(wèn)的模塊,每個(gè)模塊完成一個(gè)子功能,把這些模塊集成起來(lái)就構(gòu)成了一個(gè)整體,可以完成指定的功能,以滿(mǎn)助于用戶(hù)需求。采用模塊化原理可以使軟件結(jié)構(gòu)清晰,降低了系統(tǒng)的復(fù)雜性,使系統(tǒng)容易設(shè)計(jì)、容易修改,而且其推動(dòng)了系統(tǒng)各部分的并行開(kāi)發(fā),提高了軟件的生產(chǎn)效率。本心跳檢測(cè)系統(tǒng)設(shè)計(jì)正是采用了模塊化原理,在主控節(jié)點(diǎn)上有三個(gè)線程,每個(gè)線程看做一個(gè)模塊,方便了主控節(jié)點(diǎn)功能的實(shí)現(xiàn)。 抽象化在對(duì)軟件系統(tǒng)進(jìn)行模塊設(shè)計(jì)時(shí),可以有不同的抽象層次,系統(tǒng)設(shè)計(jì)過(guò)程中的每一步都是對(duì)軟件問(wèn)題解法的又一次更高級(jí)抽象。可行性研究是對(duì)整個(gè)系統(tǒng)的抽象,需求分析則是對(duì)此心跳檢測(cè)系統(tǒng)所要實(shí)現(xiàn)功能的抽象。二、心跳檢測(cè)系統(tǒng)的整體結(jié)構(gòu)圖使用上節(jié)所提到的模塊化等設(shè)計(jì)思想,先是對(duì)外圍節(jié)點(diǎn)的發(fā)送報(bào)文的流程進(jìn)行了設(shè)計(jì),然后說(shuō)對(duì)主控節(jié)點(diǎn)的完成外圍節(jié)點(diǎn)注冊(cè),完成接收心跳報(bào)文,完成定期檢查外圍節(jié)點(diǎn)三個(gè)功能進(jìn)行了一一的設(shè)計(jì),下面是整個(gè)程序的結(jié)構(gòu)圖,如圖3.2示。圖3.2 程序結(jié)構(gòu)圖三、總體設(shè)計(jì)心跳檢測(cè)的基本原理是每個(gè)結(jié)點(diǎn)周期性地向主控節(jié)點(diǎn)發(fā)送消息,主控節(jié)點(diǎn)根據(jù)外圍節(jié)點(diǎn)發(fā)送來(lái)的消息判斷這些節(jié)點(diǎn)的狀態(tài)。整個(gè)心跳檢測(cè)系統(tǒng)包括外圍節(jié)點(diǎn)和主控節(jié)點(diǎn)兩個(gè)部分,其結(jié)構(gòu)如圖3.3所示。心跳檢測(cè)過(guò)程包括以下幾個(gè)步驟:連接的建立 外圍節(jié)點(diǎn)啟動(dòng),將首先與事先約定的主控節(jié)點(diǎn)ip地址建立tcp連接,并向主控節(jié)點(diǎn)注冊(cè)該外圍節(jié)點(diǎn)的設(shè)備號(hào)信息。主控節(jié)點(diǎn)在接收到外圍節(jié)點(diǎn)的注冊(cè)報(bào)文后,將回送許可報(bào)文。外圍節(jié)點(diǎn)在接收到許可報(bào)文后,將進(jìn)入心跳檢測(cè)狀態(tài)。如果外圍節(jié)點(diǎn)在5秒內(nèi)沒(méi)有連接到主控節(jié)點(diǎn),或者發(fā)出注冊(cè)報(bào)文后5秒內(nèi)沒(méi)有收到主控節(jié)點(diǎn)的許可報(bào)文,則睡眠10秒鐘后重新與主控節(jié)點(diǎn)進(jìn)行連接。心跳檢測(cè) 外圍節(jié)點(diǎn)每隔1秒向主控節(jié)點(diǎn)發(fā)送一次心跳報(bào)文。主控節(jié)點(diǎn)每隔1秒查詢(xún)各個(gè)節(jié)點(diǎn)的心跳報(bào)文,如果在1秒內(nèi)沒(méi)有收到外圍節(jié)點(diǎn)的心跳報(bào)文,則顯示相應(yīng)外圍節(jié)點(diǎn)的網(wǎng)絡(luò)連接出現(xiàn)問(wèn)題。 圖3.3心跳檢測(cè)的結(jié)構(gòu)圖外圍節(jié)點(diǎn)與主控節(jié)點(diǎn)建立連接時(shí)采用了tcp協(xié)議,而心跳檢測(cè)過(guò)程中使用了udp協(xié)議。這是由于tcp協(xié)議可以保證傳輸?shù)目煽啃院晚樞蛐?,但是運(yùn)行開(kāi)銷(xiāo)比較高,而udp協(xié)議雖然是一中不可靠的協(xié)議,但是傳輸開(kāi)銷(xiāo)比較小。因此,在嵌入式系統(tǒng)中,為了降低系統(tǒng)運(yùn)行開(kāi)銷(xiāo),可以將一些不重要的報(bào)文采用代繳比較低但是服務(wù)質(zhì)量比較查的協(xié)議來(lái)實(shí)現(xiàn)。第三節(jié) 詳細(xì)設(shè)計(jì) 詳細(xì)設(shè)計(jì)是該系統(tǒng)的重點(diǎn)部分,介紹了系統(tǒng)具體是如何實(shí)現(xiàn)的,包括了心跳注冊(cè)表的設(shè)計(jì),報(bào)文格式的設(shè)計(jì),主控節(jié)點(diǎn)和外圍節(jié)點(diǎn)功能的設(shè)計(jì)。一、心跳表注冊(cè)表的設(shè)計(jì)心跳注冊(cè)表被設(shè)置成一個(gè)靜態(tài)全局的結(jié)構(gòu)體數(shù)組,當(dāng)主控節(jié)點(diǎn)接收到外圍節(jié)點(diǎn)的注冊(cè)報(bào)文之后就為其在心跳注冊(cè)表中找到一個(gè)空閑位置分配。而此后,主控節(jié)點(diǎn)在接收到外圍節(jié)點(diǎn)的心跳報(bào)文后,也要相應(yīng)的修改心跳注冊(cè)表,判斷節(jié)點(diǎn)是否出現(xiàn)故障也是通過(guò)掃描心跳注冊(cè)表得知,所以這是個(gè)很關(guān)鍵的設(shè)計(jì)。結(jié)構(gòu)體如下: struct heart_beatchar state;char flag;unsigned int device_id;struct sockaddr_in addr;#define heart_beat_table_size 64static struct heart_beat hb_tableheart_beat_table_size;表3.1statestate有idle和busy兩種狀態(tài),各自的定義如下: #define idle 0#define busy 1只有設(shè)備正常工作時(shí)state才為busy,否則為idle。flagflag在主控節(jié)點(diǎn)接收到外圍節(jié)點(diǎn)的心跳報(bào)文后設(shè)置為1,在檢測(cè)心跳表判斷設(shè)備是否工作時(shí)重新設(shè)置為0,用于標(biāo)記外圍節(jié)點(diǎn)是否壞掉。device_iddevice_id 是外圍節(jié)點(diǎn)注冊(cè)時(shí)向主控節(jié)點(diǎn)提供的,用于標(biāo)識(shí)每個(gè)設(shè)備。sockaddr_in addrsockaddr_in addr是外圍節(jié)點(diǎn)的ip地址。主控節(jié)點(diǎn)對(duì)心跳注冊(cè)表的具體操作如下: 圖3.4主控節(jié)點(diǎn)對(duì)心跳注冊(cè)表的操作二、報(bào)文格式的設(shè)計(jì)主控節(jié)點(diǎn)和外圍節(jié)點(diǎn)之間有三種報(bào)文:從外圍節(jié)點(diǎn)到主控節(jié)點(diǎn)的登錄報(bào)文(login),從主控節(jié)點(diǎn)到外圍節(jié)點(diǎn)的響應(yīng)報(bào)文(respond),以及從外圍節(jié)點(diǎn)到主控節(jié)點(diǎn)的心跳報(bào)文(heart_beat)。其中前兩者通過(guò)tcp協(xié)議發(fā)送,后者通過(guò)udp協(xié)議發(fā)送。在每種類(lèi)型的報(bào)文前均有一個(gè)惟一的字節(jié)標(biāo)識(shí)type,用于標(biāo)識(shí)不同類(lèi)型的報(bào)文。例如,在登錄報(bào)文中,其type值為1;在響應(yīng)報(bào)文中,其type值為2等。之所以采用這樣的方法,是考慮到未來(lái)報(bào)文類(lèi)型擴(kuò)展的需要。由于各種報(bào)文均通過(guò)一個(gè)tcp端口接收,而接收端應(yīng)用程序事先無(wú)法知道已經(jīng)被操作系統(tǒng)接收的報(bào)文種類(lèi),因此也無(wú)法判斷應(yīng)該從recv()函數(shù)接口中讀取多少字節(jié)。為了解決這一問(wèn)題,接收端一般應(yīng)該首先接收第一個(gè)字節(jié),以判斷當(dāng)前報(bào)文的類(lèi)型,然后根據(jù)此類(lèi)型的大小決定從操作系統(tǒng)內(nèi)存讀取多少個(gè)字節(jié)到應(yīng)用程序的數(shù)據(jù)結(jié)構(gòu)中,以得到一個(gè)完整的報(bào)文。這三種報(bào)文格式為:#define login_type 0x01#define respond_type 0x02#define heart_beat_type 0x03登錄報(bào)文:struct login char type;unsigned int device_id;表3.2type登錄報(bào)文的type為0x01device_id外圍節(jié)點(diǎn)注冊(cè)時(shí)提供的設(shè)備號(hào)登錄報(bào)文是外圍節(jié)點(diǎn)向主控節(jié)點(diǎn)進(jìn)行注冊(cè)信息時(shí),通過(guò)tcp連接發(fā)送的,外圍節(jié)點(diǎn)需要提供自己的設(shè)備號(hào)即可,主控節(jié)點(diǎn)修改心跳注冊(cè)表完成對(duì)外圍節(jié)點(diǎn)的注冊(cè)。響應(yīng)報(bào)文:struct respond char type;int index;表3.3type登錄報(bào)文的type為0x02index主控節(jié)點(diǎn)接收到外圍節(jié)點(diǎn)注冊(cè)成功時(shí)2提供給外圍節(jié)點(diǎn)的槽口號(hào)主控節(jié)點(diǎn)收到外圍節(jié)點(diǎn)的登錄報(bào)文之后,必須要對(duì)外圍節(jié)點(diǎn)進(jìn)行響應(yīng),這時(shí)就需要發(fā)送具有反饋信息的respond報(bào)文,該報(bào)文包含了外圍節(jié)點(diǎn)注冊(cè)信息表給該外圍節(jié)點(diǎn)提供槽口號(hào)index(第一個(gè)注冊(cè)的為0,第二個(gè)注冊(cè)的為1,一次類(lèi)推),外圍節(jié)點(diǎn)必須收到respond報(bào)文后才可以開(kāi)始發(fā)送心跳報(bào)文。心跳報(bào)文:struct heart_beat char type;int index;unsigned int device_id;表3.4type登錄報(bào)文的type為0x03index主控節(jié)點(diǎn)接收到外圍節(jié)點(diǎn)注冊(cè)成功時(shí)2提供給外圍節(jié)點(diǎn)的槽口號(hào),發(fā)送心跳報(bào)文時(shí)需提供槽口號(hào)以便主控節(jié)點(diǎn)修改hb_table表device_id外圍節(jié)點(diǎn)注冊(cè)時(shí)提供的設(shè)備號(hào) 心跳報(bào)文是外圍節(jié)點(diǎn)定期向主控節(jié)點(diǎn)發(fā)送的udp報(bào)文,包含了外圍節(jié)點(diǎn)的設(shè)備號(hào)和槽口號(hào),主控節(jié)點(diǎn)根據(jù)槽口號(hào)來(lái)修改外圍節(jié)點(diǎn)注冊(cè)信息表,從而為定期掃描心跳注冊(cè)表做準(zhǔn)備。三、外圍節(jié)點(diǎn)的設(shè)計(jì)心跳檢測(cè)是外圍節(jié)點(diǎn)軟件系統(tǒng)中的一個(gè)模塊。它被設(shè)計(jì)成一個(gè)獨(dú)立的線程,執(zhí)行如下算法:向主控節(jié)點(diǎn)發(fā)送登錄(login)報(bào)文等待主控節(jié)點(diǎn)的反饋(respond)報(bào)文的響應(yīng) 接收到respond報(bào)文轉(zhuǎn)向4,否則休眠10秒后轉(zhuǎn)向1根據(jù)respond報(bào)文的槽口號(hào)建立udp連接 向主控節(jié)點(diǎn)發(fā)送udp心跳報(bào)文 休眠1秒后轉(zhuǎn)向5創(chuàng)建心跳檢測(cè)線程其他處理建立與主的tcp連接向主機(jī)發(fā)送登錄信息接受主機(jī)分配的槽口號(hào)通過(guò)udp協(xié)議發(fā)送心跳報(bào)文休眠10秒休眠100毫秒連接成功是否圖3.5外圍節(jié)點(diǎn)程序結(jié)構(gòu)圖2、外圍節(jié)點(diǎn)的時(shí)序圖3.6外圍節(jié)點(diǎn)的時(shí)序圖四、主控節(jié)點(diǎn)的設(shè)計(jì) 主控節(jié)點(diǎn)完成的功能比較復(fù)雜,包括接收外圍節(jié)點(diǎn)的登錄報(bào)文,接收外圍節(jié)點(diǎn)的心跳報(bào)文,定期進(jìn)行檢查心跳注冊(cè)表等??梢钥紤]采用三個(gè)線程分別實(shí)現(xiàn)這些功能,并通過(guò)一個(gè)共享的外圍節(jié)點(diǎn)心跳表進(jìn)行交互。 外圍節(jié)點(diǎn)心跳表的數(shù)據(jù)結(jié)構(gòu)如下所示。 #define idle 0#define busy 1#define heart_beat_table_size 64#define no_device 0struct heart_beatchar state;char flag;unsigned int device_id;struct sockaddr_in addr;static struct heart_beat hb_tableheart_beat_table_size;主控節(jié)點(diǎn)程序啟動(dòng)后,將首先初始化互斥量hb_table_lock,初始化hb_table數(shù)組中各個(gè)元素的state狀態(tài)idle,然后創(chuàng)建三個(gè)線程。執(zhí)行函數(shù)分別是accept_connect(),chenk_hb(),accept_hb()三個(gè)線程的結(jié)構(gòu)圖如下:圖3.7 主控節(jié)點(diǎn)線程調(diào)用關(guān)系圖1、 接收登錄線程接收登錄信息的線程執(zhí)行如下算法: 創(chuàng)建套接字,綁定登錄端口,并建立等待隊(duì)列。 使用accept()函數(shù)等待外圍節(jié)點(diǎn)的登錄信息。 從套接字端口讀取登錄報(bào)文,獲取外圍節(jié)點(diǎn)的設(shè)備號(hào)device_id和ip地址。 檢查hb_table中的各個(gè)表項(xiàng)。 如果當(dāng)前設(shè)備號(hào)device_id已經(jīng)存在于此表,且相關(guān)的狀態(tài)為busy,則取此表項(xiàng)號(hào)index;否則分配一個(gè)state為idle的表項(xiàng)index。 設(shè)置hb_tableindex表項(xiàng)中的state為busy,設(shè)置此表項(xiàng)中的device_id何addr為外圍設(shè)備的device_id和ip地址,設(shè)置此表項(xiàng)中的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論