freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

c基于局域網(wǎng)linux環(huán)境下的心跳檢測系統(tǒng)實(shí)現(xiàn)(doc畢業(yè)設(shè)計論文)(編輯修改稿)

2025-07-25 07:57 本頁面
 

【文章內(nèi)容簡介】 定問題定義階段所定義的問題是否值得解決。一般情況下,主要從技術(shù)可行性、經(jīng)濟(jì)可行性和操作可行性三個方面論證系統(tǒng)開發(fā)的可行性。該系統(tǒng)可在小范圍的局域網(wǎng)上進(jìn)行使用,因此從可操作性來講是可行的。其次,設(shè)計開發(fā)這樣的一款心跳檢測系統(tǒng)只需要幾臺電腦構(gòu)成局域網(wǎng)就可以使用。下面主要從技術(shù)可行性進(jìn)行分析:開發(fā)工具和環(huán)境Linux是一款比較成熟的操作系統(tǒng),它有Unix演化發(fā)展而來,和Unix有多相似之處。所用的函數(shù)包基本一致,再加上gcc的強(qiáng)大編譯、調(diào)試的功能,對完成這個系統(tǒng)由很大幫助。② 算法該系統(tǒng)不需要什么復(fù)雜的算法,只需掌握linux環(huán)境下的TCP/IP網(wǎng)絡(luò)方面的知識,能夠熟練運(yùn)用linux下的網(wǎng)絡(luò)編程和線程函數(shù),就可以寫出。幸運(yùn)的是,通過查閱大量豐富的技術(shù)資料,我有信心解決這一問題。③ 自身素質(zhì)因素通過大學(xué)四年的學(xué)習(xí),我打下了堅實(shí)的專業(yè)基礎(chǔ),最重要的是學(xué)會了自主學(xué)習(xí)和查閱資料的能力,這都將為我今后的設(shè)計開發(fā)過程提供強(qiáng)有力的保障。通過以上分析,可以很確定這一系統(tǒng)的可行性,可以放心地開始下一階段的任務(wù)了。三、用戶需求本系統(tǒng)分為外圍節(jié)點(diǎn)和主控節(jié)點(diǎn)的設(shè)計,它們有各自的功能:外圍節(jié)點(diǎn)功能 外圍節(jié)點(diǎn)所需要完成的功能相對簡單,它只需要先發(fā)送登錄報文進(jìn)行注冊,收到主控節(jié)點(diǎn)的反饋報文之后,定期(每隔一秒)發(fā)送心跳報文即可,不涉及太多功能。主控節(jié)點(diǎn)功能 主控節(jié)點(diǎn)是系統(tǒng)的關(guān)鍵部分,它負(fù)責(zé)接收登錄報文和心跳報文,然后根據(jù)報文的內(nèi)容來判斷網(wǎng)絡(luò)連接情況,可以說本系統(tǒng)的主要功能基本上由主控節(jié)點(diǎn)完成:完成接收心跳報文功能主控節(jié)點(diǎn)收到外圍節(jié)點(diǎn)的登錄報文后,就完成對外圍節(jié)點(diǎn)信息的注冊,包括外圍節(jié)點(diǎn)的設(shè)備號和分配的槽口號等,并將槽口號返回給外圍節(jié)點(diǎn)。完成接收心跳報文功能主控節(jié)點(diǎn)接收到心跳報文后,由于心跳報文中帶有槽口號,主控節(jié)點(diǎn)根據(jù)槽口號查找外圍節(jié)點(diǎn)注冊表,修改響應(yīng)信息。完成定期檢查外圍節(jié)點(diǎn)功能 主控節(jié)點(diǎn)要定期檢查外圍節(jié)點(diǎn)注冊表,從而發(fā)現(xiàn)節(jié)點(diǎn)是否正常工作,如果不正常就報告響應(yīng)的故障消息。四、系統(tǒng)整體用例圖 系統(tǒng)用例圖第二節(jié) 概要設(shè)計概括地說,概要設(shè)計進(jìn)行數(shù)據(jù)設(shè)計/數(shù)據(jù)庫設(shè)計和系統(tǒng)體系結(jié)構(gòu)設(shè)計。其目的只是描繪出軟件的總體框架,根據(jù)功能、性能需求和數(shù)據(jù)需求導(dǎo)出軟件的數(shù)據(jù)結(jié)構(gòu)和系統(tǒng)結(jié)構(gòu)。一、設(shè)計指導(dǎo)思想① 模塊化模塊是構(gòu)成程序的基本構(gòu)件,模塊化就是把程序劃分成獨(dú)立命名且可獨(dú)立訪問的模塊,每個模塊完成一個子功能,把這些模塊集成起來就構(gòu)成了一個整體,可以完成指定的功能,以滿助于用戶需求。采用模塊化原理可以使軟件結(jié)構(gòu)清晰,降低了系統(tǒng)的復(fù)雜性,使系統(tǒng)容易設(shè)計、容易修改,而且其推動了系統(tǒng)各部分的并行開發(fā),提高了軟件的生產(chǎn)效率。本心跳檢測系統(tǒng)設(shè)計正是采用了模塊化原理,在主控節(jié)點(diǎn)上有三個線程,每個線程看做一個模塊,方便了主控節(jié)點(diǎn)功能的實(shí)現(xiàn)。② 抽象化在對軟件系統(tǒng)進(jìn)行模塊設(shè)計時,可以有不同的抽象層次,系統(tǒng)設(shè)計過程中的每一步都是對軟件問題解法的又一次更高級抽象??尚行匝芯渴菍φ麄€系統(tǒng)的抽象,需求分析則是對此心跳檢測系統(tǒng)所要實(shí)現(xiàn)功能的抽象。二、心跳檢測系統(tǒng)的整體結(jié)構(gòu)圖使用上節(jié)所提到的模塊化等設(shè)計思想,先是對外圍節(jié)點(diǎn)的發(fā)送報文的流程進(jìn)行了設(shè)計,然后說對主控節(jié)點(diǎn)的完成外圍節(jié)點(diǎn)注冊,完成接收心跳報文,完成定期檢查外圍節(jié)點(diǎn)三個功能進(jìn)行了一一的設(shè)計,下面是整個程序的結(jié)構(gòu)圖。 程序結(jié)構(gòu)圖三、總體設(shè)計心跳檢測的基本原理是每個結(jié)點(diǎn)周期性地向主控節(jié)點(diǎn)發(fā)送消息,主控節(jié)點(diǎn)根據(jù)外圍節(jié)點(diǎn)發(fā)送來的消息判斷這些節(jié)點(diǎn)的狀態(tài)。整個心跳檢測系統(tǒng)包括外圍節(jié)點(diǎn)和主控節(jié)點(diǎn)兩個部分。心跳檢測過程包括以下幾個步驟:連接的建立 外圍節(jié)點(diǎn)啟動,將首先與事先約定的主控節(jié)點(diǎn)IP地址建立TCP連接,并向主控節(jié)點(diǎn)注冊該外圍節(jié)點(diǎn)的設(shè)備號信息。主控節(jié)點(diǎn)在接收到外圍節(jié)點(diǎn)的注冊報文后,將回送許可報文。外圍節(jié)點(diǎn)在接收到許可報文后,將進(jìn)入心跳檢測狀態(tài)。如果外圍節(jié)點(diǎn)在5秒內(nèi)沒有連接到主控節(jié)點(diǎn),或者發(fā)出注冊報文后5秒內(nèi)沒有收到主控節(jié)點(diǎn)的許可報文,則睡眠10秒鐘后重新與主控節(jié)點(diǎn)進(jìn)行連接。心跳檢測 外圍節(jié)點(diǎn)每隔1秒向主控節(jié)點(diǎn)發(fā)送一次心跳報文。主控節(jié)點(diǎn)每隔1秒查詢各個節(jié)點(diǎn)的心跳報文,如果在1秒內(nèi)沒有收到外圍節(jié)點(diǎn)的心跳報文,則顯示相應(yīng)外圍節(jié)點(diǎn)的網(wǎng)絡(luò)連接出現(xiàn)問題。 外圍節(jié)點(diǎn)與主控節(jié)點(diǎn)建立連接時采用了TCP協(xié)議,而心跳檢測過程中使用了UDP協(xié)議。這是由于TCP協(xié)議可以保證傳輸?shù)目煽啃院晚樞蛐?,但是運(yùn)行開銷比較高,而UDP協(xié)議雖然是一中不可靠的協(xié)議,但是傳輸開銷比較小。因此,在嵌入式系統(tǒng)中,為了降低系統(tǒng)運(yùn)行開銷,可以將一些不重要的報文采用代繳比較低但是服務(wù)質(zhì)量比較查的協(xié)議來實(shí)現(xiàn)。第三節(jié) 詳細(xì)設(shè)計 詳細(xì)設(shè)計是該系統(tǒng)的重點(diǎn)部分,介紹了系統(tǒng)具體是如何實(shí)現(xiàn)的,包括了心跳注冊表的設(shè)計,報文格式的設(shè)計,主控節(jié)點(diǎn)和外圍節(jié)點(diǎn)功能的設(shè)計。一、心跳表注冊表的設(shè)計心跳注冊表被設(shè)置成一個靜態(tài)全局的結(jié)構(gòu)體數(shù)組,當(dāng)主控節(jié)點(diǎn)接收到外圍節(jié)點(diǎn)的注冊報文之后就為其在心跳注冊表中找到一個空閑位置分配。而此后,主控節(jié)點(diǎn)在接收到外圍節(jié)點(diǎn)的心跳報文后,也要相應(yīng)的修改心跳注冊表,判斷節(jié)點(diǎn)是否出現(xiàn)故障也是通過掃描心跳注冊表得知,所以這是個很關(guān)鍵的設(shè)計。結(jié)構(gòu)體如下: struct Heart_Beat{ char state。 char flag。 unsigned int device_ID。 struct sockaddr_in addr。}。define HEART_BEAT_TABLE_SIZE 64static struct Heart_Beat hb_table[HEART_BEAT_TABLE_SIZE]。statestate有IDLE和BUSY兩種狀態(tài),各自的定義如下: define IDLE 0define BUSY 1只有設(shè)備正常工作時state才為BUSY,否則為IDLE。flagflag在主控節(jié)點(diǎn)接收到外圍節(jié)點(diǎn)的心跳報文后設(shè)置為1,在檢測心跳表判斷設(shè)備是否工作時重新設(shè)置為0,用于標(biāo)記外圍節(jié)點(diǎn)是否壞掉。device_IDdevice_ID 是外圍節(jié)點(diǎn)注冊時向主控節(jié)點(diǎn)提供的,用于標(biāo)識每個設(shè)備。sockaddr_in addrsockaddr_in addr是外圍節(jié)點(diǎn)的IP地址。主控節(jié)點(diǎn)對心跳注冊表的具體操作如下: 二、報文格式的設(shè)計主控節(jié)點(diǎn)和外圍節(jié)點(diǎn)之間有三種報文:從外圍節(jié)點(diǎn)到主控節(jié)點(diǎn)的登錄報文(login),從主控節(jié)點(diǎn)到外圍節(jié)點(diǎn)的響應(yīng)報文(respond),以及從外圍節(jié)點(diǎn)到主控節(jié)點(diǎn)的心跳報文(heart_beat)。其中前兩者通過TCP協(xié)議發(fā)送,后者通過UDP協(xié)議發(fā)送。在每種類型的報文前均有一個惟一的字節(jié)標(biāo)識type,用于標(biāo)識不同類型的報文。例如,在登錄報文中,其type值為1;在響應(yīng)報文中,其type值為2等。之所以采用這樣的方法,是考慮到未來報文類型擴(kuò)展的需要。由于各種報文均通過一個TCP端口接收,而接收端應(yīng)用程序事先無法知道已經(jīng)被操作系統(tǒng)接收的報文種類,因此也無法判斷應(yīng)該從recv()函數(shù)接口中讀取多少字節(jié)。為了解決這一問題,接收端一般應(yīng)該首先接收第一個字節(jié),以判斷當(dāng)前報文的類型,然后根據(jù)此類型的大小決定從操作系統(tǒng)內(nèi)存讀取多少個字節(jié)到應(yīng)用程序的數(shù)據(jù)結(jié)構(gòu)中,以得到一個完整的報文。這三種報文格式為:define LOGIN_TYPE 0x01define RESPOND_TYPE 0x02define HEART_BEAT_TYPE 0x03登錄報文:struct login{ char type。 unsigned int device_ID。}。type登錄報文的type為0x01device_ID外圍節(jié)點(diǎn)注冊時提供的設(shè)備號登錄報文是外圍節(jié)點(diǎn)向主控節(jié)點(diǎn)進(jìn)行注冊信息時,通過TCP連接發(fā)送的,外圍節(jié)點(diǎn)需要提供自己的設(shè)備號即可,主控節(jié)點(diǎn)修改心跳注冊表完成對外圍節(jié)點(diǎn)的注冊。響應(yīng)報文:struct respond{ char type。 int index。}。type登錄報文的type為0x02index主控節(jié)點(diǎn)接收到外圍節(jié)點(diǎn)注冊成功時2提供給外圍節(jié)點(diǎn)的槽口號主控節(jié)點(diǎn)收到外圍節(jié)點(diǎn)的登錄報文之后,必須要對外圍節(jié)點(diǎn)進(jìn)行響應(yīng),這時就需要發(fā)送具有反饋信息的respond報文,該報文包含了外圍節(jié)點(diǎn)注冊信息表給該外圍節(jié)點(diǎn)提供槽口號index(第一個注冊的為0,第二個注冊的為1,一次類推),外圍節(jié)點(diǎn)必須收到respond報文后才可以開始發(fā)送心跳報文。心跳報文:struct heart_beat{ char type。 int index。 unsigned int device_ID。}。type登錄報文的type為0x03index主控節(jié)點(diǎn)接收到外圍節(jié)點(diǎn)注冊成功時2提供給外圍節(jié)點(diǎn)的槽口號,發(fā)送心跳報文時需提供槽口號以便主控節(jié)點(diǎn)修改hb_table表device_ID外圍節(jié)點(diǎn)注冊時提供的設(shè)備號 心跳報文是外圍節(jié)點(diǎn)定期向主控節(jié)點(diǎn)發(fā)送的UDP報文,包含了外圍節(jié)點(diǎn)的設(shè)備號和槽口號,主控節(jié)點(diǎn)根據(jù)槽口號來修改外圍節(jié)點(diǎn)注冊信息表,從而為定期掃描心跳注冊表做準(zhǔn)備。三、外圍節(jié)點(diǎn)的設(shè)計心跳檢測是外圍節(jié)點(diǎn)軟件系統(tǒng)中的一個模塊。它被設(shè)計成一個獨(dú)立的線程,執(zhí)行如下算法:向主控節(jié)點(diǎn)發(fā)送登錄(login)報文等待主控節(jié)點(diǎn)的反饋(respond)報文的響應(yīng) 接收到respond報文轉(zhuǎn)向4,否則休眠10秒后轉(zhuǎn)向1根據(jù)respond報文的槽口號建立UDP連接 向主控節(jié)點(diǎn)發(fā)送UDP心跳報文 休眠1秒后轉(zhuǎn)向5創(chuàng)建心跳檢測線程其他處理建立與主的TCP連接向主機(jī)發(fā)送登錄信息接受主機(jī)分配的槽口號通過UDP協(xié)議發(fā)送心跳報文休眠10秒休眠100毫秒連接成功是否外圍節(jié)點(diǎn)的時序圖四、主控節(jié)點(diǎn)的設(shè)計 主控節(jié)點(diǎn)完成的功能比較復(fù)雜,包括接收外圍節(jié)點(diǎn)的登錄報文,接收外圍節(jié)點(diǎn)的心跳報文,定期進(jìn)行檢查心跳注冊表等。可以考慮采用三個線程分別實(shí)現(xiàn)這些功能,并通過一個共享的外圍節(jié)點(diǎn)心跳表進(jìn)行交互。 外圍節(jié)點(diǎn)心跳表的數(shù)據(jù)結(jié)構(gòu)如下所示。 define IDLE 0define BUSY 1define HEART_BEAT_TABLE_SIZE 64define NO_DEVICE 0struct Heart_Beat{ char state。 char flag。 unsigned int device_ID。 struct sockaddr_in addr。}。static struct Heart_Beat hb_table[HEART_BEAT_TABLE_SIZE]。主控節(jié)點(diǎn)程序啟動后,將首先初始化互斥量hb_table_lock,初始化hb_table數(shù)組中各個元素的state狀態(tài)IDLE,然后創(chuàng)建三個線程。執(zhí)行函數(shù)分別是accept_connect(),chenk_hb(),accept_hb()三個線程的結(jié)構(gòu)圖如下: 主控節(jié)點(diǎn)線程調(diào)用關(guān)系圖 接收登錄線程接收登錄信息的線程執(zhí)行如下算法: 創(chuàng)建套接字,綁定登錄端口,并建立等待隊列。 使用accept()函數(shù)等待外圍節(jié)點(diǎn)的登錄信息。 從套接字端口讀取登錄報文,獲取外圍節(jié)點(diǎn)的設(shè)備號device_ID和IP地址。 檢查hb_table中的各個表項。 如果當(dāng)前設(shè)備號device_ID已經(jīng)存在于此表,且相關(guān)的狀態(tài)為BUSY,則取此表項號index;否則分配一個state為IDLE的表項index。 設(shè)置hb_table[index]表項中的state為BUSY,設(shè)置此表項中的device_ID何addr為外圍設(shè)備的device_ID和IP地址,設(shè)置此表項中的flag為1。向外圍節(jié)點(diǎn)發(fā)送登錄成功報文,參數(shù)為index。 轉(zhuǎn)至2程序結(jié)構(gòu)圖如下: 登錄線程程序結(jié)構(gòu)圖 接收外圍節(jié)點(diǎn)心跳檢測報文線程接收的線程執(zhí)行如下算法: 使用recvfrom()函數(shù)等待讀取外圍節(jié)點(diǎn)的心跳報文。從心跳報文中獲取槽口號index,外圍設(shè)備號和IP地址。 檢查hb_table[index]中state是否為IDLE,外圍節(jié)點(diǎn)的設(shè)備號device_ID和IP地址是否匹配。 如果不匹配,則轉(zhuǎn)至2,否則設(shè)置hb_table[index]中的flag為1,設(shè)置state為BUSY。轉(zhuǎn)至2 接收外圍節(jié)點(diǎn)心跳檢測報文線程程序結(jié)構(gòu)圖3 、定期檢查節(jié)點(diǎn)注冊表線程執(zhí)行如下算法: 睡眠1秒。 檢查hb_table中的各個表項。 如果發(fā)現(xiàn)有表項的state為BUSY,而且flag為1,則設(shè)置flag為0 如果發(fā)現(xiàn)有表項的state為BUSY,而且flag為0,則設(shè)置此表項的state為IDLE,并向用戶顯示,此外圍節(jié)點(diǎn)連接中斷。 轉(zhuǎn)至1。圖 第四節(jié) 本章小結(jié)本章是重點(diǎn)章節(jié),先是介紹了系統(tǒng)的需求分析,里面著重介紹了主控節(jié)點(diǎn)和外圍節(jié)點(diǎn)所需要實(shí)現(xiàn)的功能,又描述了本系統(tǒng)的用例圖。在詳細(xì)設(shè)計里面則是介紹了報文格式的設(shè)計和主控節(jié)點(diǎn)、外圍節(jié)點(diǎn)的設(shè)計思路和執(zhí)行算法。 第四章 心跳檢測系統(tǒng)的實(shí)現(xiàn)第一節(jié) linux下開發(fā)環(huán)境一、編譯環(huán)境 前面的章節(jié)已經(jīng)介紹了gcc的相關(guān)內(nèi)容,,分別是主控節(jié)點(diǎn)和外圍節(jié)點(diǎn)的運(yùn)行的文件。首先我們?yōu)檫@兩個文件進(jìn)行編譯。首先通過cd /hukai進(jìn)入這兩個文件所在的文件夾。 顯示兩個需要編譯的文件接下來便是編譯,分別輸入gcc –pthread –o
點(diǎn)擊復(fù)制文檔內(nèi)容
電大資料相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1