




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
.......C++基于局域網Linux環(huán)境下的心跳檢測系統(tǒng)實現摘要當今世界的網絡飛速發(fā)展,但也因此也產生了許多網絡故障,心跳檢測技術作為一種故障檢測技術,在當今服務器市場有很大需求。心跳檢測技術是一種檢測網絡連接故障的技術,它通過在服務器端和客戶端裝上各自的心跳檢測軟件,就可以根據發(fā)送的心跳報文來監(jiān)測故障,判斷各個網絡節(jié)點的連接是否正常[1]。本文研究了心跳檢測技術在Linux平臺下的實現,設計了一款能在局域網上運行的心跳檢測系統(tǒng)。該系統(tǒng)采用TCP/UDP協(xié)議,以C/S模式進行開發(fā)。服務器充當主控節(jié)點,客戶端充當外圍節(jié)點,通過客戶端發(fā)送心跳報文的方法來實現心跳檢測。系統(tǒng)在節(jié)點的局域網中使用,能達到很高的成功率。【關鍵詞】心跳檢測主控節(jié)點外圍節(jié)點報文Linux
ABSTRACTNetworktechnologyoftoday'sworldhastherapiddevelopment,butalsoproducessomanynetworkfailure,heartbeatdetectiontechnologyisadetectiontechnologyasanetworkfailuredetection,andhasmuchdemandintoday'sservermarket..Heartbeatdetectiontechnologyisanetworkconnectionfailuredetectiontechnology,serverandclientneedonlyinstalloneachheartbeatdetectionsoftware,youcansendpacketstomonitorheartfailure,determinewhetherthevariousnetworknodesisinthenormal.Inthispaper,theheartbeatdetectiontechnologyimplementationintheLinuxplatform,designedaruninLANheartbeatdetectionsystem.ThesystemusesTCP/UDPprotocol,toC/Smodelfordevelopment.Serveractsasthemasternode,theclientactsastheexternalnodes,throughtheheartbeatmessagessentbytheclienttoachievetheheartbeatdetectionmethods.Systemusedinlocalareanetworknodecanachieveahighsuccessrate.【Keywords】HeartbeatdetectionMasternodePeripheralnodeMessageLinux目錄ABSTRACT 2前言 4第一章系統(tǒng)簡介 6第一節(jié)心跳檢測機制 6第二節(jié)本文設計的心跳檢測系統(tǒng) 6第三節(jié)本章小結 7第二章 開發(fā)環(huán)境、工具和技術 8第一節(jié) Linux的介紹 8第二節(jié) GCC簡介 9一、什么是GCC 9二、GCC的基本規(guī)則 10三、GCC的基本用法 10四、執(zhí)行過程 11第三節(jié)linux下的網絡編程技術 11一、socket編程介紹 11二、TCP/UDP開發(fā)簡介 16第四節(jié)本章小結 17第三章系統(tǒng)的分析與設計 18第一節(jié)需求分析 18一、問題定義 18二、可行性研究 18三、用戶需求 18四、系統(tǒng)整體用例圖 19第二節(jié)概要設計 19一、設計指導思想 20二、心跳檢測系統(tǒng)的整體結構圖 20三、總體設計 21第三節(jié) 詳細設計 22一、心跳表注冊表的設計 22二、報文格式的設計 24三、外圍節(jié)點的設計 26四、主控節(jié)點的設計 27第四節(jié)本章小結 31第四章心跳檢測系統(tǒng)的實現 32第一節(jié)linux下開發(fā)環(huán)境 32一、編譯環(huán)境 32二、運行環(huán)境 33第二節(jié)程序的實現 35一、外圍節(jié)點的實現 35二、主控節(jié)點的設計 37第三節(jié)本章小節(jié) 40第五章系統(tǒng)測試 41第一節(jié)測試環(huán)境 41第二節(jié)測試方法 41一、黑盒測試 42二、測試步驟 42第三節(jié)本章小結 48結論 49參考文獻 51附錄 52一、英文原文 52二、中文翻譯 56前言網絡是一個龐大復雜的系統(tǒng),有成千上萬臺設備節(jié)點,經常會出現連接故障,我們不可能用人力去監(jiān)測,這時負責監(jiān)測網絡故障的心跳檢測軟件由此產生。心跳檢測系統(tǒng)是基于C/S架構開發(fā)的網絡檢測系統(tǒng),隨著網絡技術的發(fā)展而發(fā)展,在當今服務器市場上有很大需求,也日趨成熟化。比如Linux平臺下的HeartBeat集群軟件包就是成功的典型。我相信,在當今IT技術的推動下,心跳檢測在未來幾年會有更廣闊的發(fā)展空間。在了解了心跳檢測的基本原理和Linux網絡編程的基本方法之后,我設計了一個可以在局域網上進行網絡連接檢測的心跳檢測系統(tǒng)。并對里面涉及的技術原理,設計思想進行了相關討論。
第一章系統(tǒng)簡介第一節(jié)心跳檢測機制在分布式系統(tǒng)中,有成千上萬個設備節(jié)點通過有線或者無線網絡連接。這些節(jié)點和網絡隨時可能發(fā)生故障,從而導致部分節(jié)點或者網絡癱瘓。為了確保整個系統(tǒng)正常工作,主控節(jié)點應該能隨時知道其他節(jié)點當前是否在正常工作。如果用人力去監(jiān)控,則會造成很大的開銷,且節(jié)點是否癱瘓有時無法從外表判斷。心跳檢測系統(tǒng)可以節(jié)省人力,根據外圍節(jié)點定期發(fā)送的報文來判斷設備和網絡是否發(fā)生故障。心跳檢測技術是分布式嵌入式系統(tǒng)中一種常見的故障檢測方法。在心跳檢測中,外圍節(jié)點將周期性向主控節(jié)點發(fā)送心跳報文。如果過一段時間之后,主控節(jié)點沒有收到外圍節(jié)點的心跳報文,則認為此節(jié)點或相關網絡出現故障,并向管理員報告。它有如下特點:eq\o\ac(○,1)基于C/S模式,主控節(jié)點(服務器端)判斷外圍節(jié)點(客戶端)是否正常運行,一般采用定時發(fā)送簡單的心跳報文,如果在指定時間段未收到對方響應,則判斷連接出現故障。用于檢測網絡的異常斷開。eq\o\ac(○,2)發(fā)包方可以是客戶端也可以是服務器端,看哪邊實現方便合理。一般是客戶端,服務器也可以定時輪詢發(fā)心跳下去(我的系統(tǒng)是采用客戶端發(fā)報文)。eq\o\ac(○,3)檢測方法就是外圍節(jié)點每隔幾分鐘發(fā)送一個心跳報文給主控節(jié)點,服務端收到后回復一個響應報文。如果服務端在規(guī)定時間沒有收到客戶端信息則視連接斷開。第二節(jié)本文設計的心跳檢測系統(tǒng)在介紹了心跳檢測系統(tǒng)的概念、特點、作用之后,下面介紹了我所設計的系統(tǒng)的一些情況。由于該設計主要是針對10臺左右的小圍的局域網設計的心跳檢測系統(tǒng),沒有涉及到數據庫存儲的相關知識,因此該系統(tǒng)的優(yōu)點是所需要的硬件代價小,實現起來的網絡連接相對簡單,能針對自己組建的局域網來測試。當然,該設計的功能差了很多,比如在數據庫中記錄節(jié)點出錯時間,監(jiān)控節(jié)點數量的多少,網絡阻塞引起的延時等方面并沒有涉及到。我相信,我今后在學習更多網絡故障檢測技術和網絡編程技術后,會將上述功能一一實現。我的設計在Linux平臺下,采用了C/S模式,服務器端充當主控節(jié)點,客戶端充當外圍節(jié)點,外圍節(jié)點先發(fā)送TCP報文進行和主控節(jié)點建立連接,在建立連接成功后,發(fā)送心跳報文,心跳報文則采用UDP格式設計。而后每隔一秒發(fā)送一次心跳報文,主控節(jié)點根據心跳報文來檢測網絡連接是否正常。第三節(jié)本章小結本章先從心跳檢測的用途出發(fā),介紹了心跳檢測的概念,以及它使用的原理,使大家對心跳檢測有了大致的了解。最后大致介紹了我自己設計的心跳檢測系統(tǒng)的一些情況,包括優(yōu)缺點和大致的實現情況。開發(fā)環(huán)境、工具和技術Linux的介紹Linux是一類Unix計算機操作系統(tǒng)的統(tǒng)稱。Linux操作系統(tǒng)的核的名字也是“Linux”。Linux操作系統(tǒng)也是自由軟件和開放源代碼發(fā)展中最著名的例子。嚴格來講,Linux這個詞本身只表示Linux核,但在實際上人們已經習慣了用Linux來形容整個基于Linux核,并且使用GNU工程各種工具和數據庫的操作系統(tǒng)。Linux得名于計算機業(yè)余愛好者LinusTorvalds。當時他是芬蘭赫爾辛基大學的學生。他的目的是想設計一個代替Minix(是由一位名叫AndrewTannebaum的計算機教授編寫的一個操作系統(tǒng)示教程序)的操作系統(tǒng),這個操作系統(tǒng)可用于386、486或奔騰處理器的個人計算機上,并且具有Unix操作系統(tǒng)的全部功能,因而開始了Linux雛形的設計。出于愛好,他根據可在低檔機上使用的MINIX設計了一個系統(tǒng)核心Linux0.01,但沒有使用任何MINIX或UNIX的源代碼。他通過USENET(就是新聞組)宣布這是一個免費的系統(tǒng),主要在x86電腦上使用,希望大家一起來將它完善,并將源代碼放到了芬蘭的FTP站點上任人免費下載。Linux以它的靈活性和高效性著稱。能夠在個人計算機上面實現全部的unix的特性。具有多任務、多用戶的能力。Linux在GNU的GPL公共許可權下免費獲得。Linux不僅僅包括完整的操作系統(tǒng),還包括文本編輯器、高級語言編譯器等應用軟件。它還包括帶有多個窗口管理器的X-windows圖形用戶界面。目前,linux能夠運用于各種版本的cpu的計算機上,還能運用于一些手持設備,比如說,PDA,游戲機,手機,嵌入式產品等等。由于linux的開源性以及免費性,很多廠家都選擇應用linux開發(fā),以降低成本,在增強競爭力的同時也推進了linux系統(tǒng)的發(fā)展。絕大多數基于Linux核的操作系統(tǒng)使用了大量的GNU軟件,包括了shell程序、工具、程序庫、編譯器及工具,還有許多其他程序,例如Emacs。Linux的基本思想有兩點:第一,一切都是文件;第二,每個軟件都有確定的用途。其中第一條詳細來講就是系統(tǒng)中的所有都歸結為一個文件,包括命令、硬件和軟件設備、操作系統(tǒng)、進程等等對于操作系統(tǒng)核而言,都被視為擁有各自特性或類型的文件。至于說Linux是基于Unix的,很大程度上也是因為這兩者的基本思想十分相近。Linux的優(yōu)點集中體現在以下幾點:eq\o\ac(○,1)低廉性:基于其低廉成本與高度可設定性,Linux常常被應用于嵌入式系統(tǒng),例如機頂盒、移動及行動裝置等。在移動上,Linux已經成為與SymbianOS、WindowsMobile系統(tǒng)并列的三大智能手機操作系統(tǒng)之一;而在移動裝置上,則成為WindowsCE與PalmOS外之另一個選擇。eq\o\ac(○,2)廣泛性:基于Linux的開源性給人們帶來的巨大誘惑,Linux的的應用越來越廣,Linux社區(qū)的人員的增多,致使基于Linux的開發(fā)越來越方便容易。根據2005年11月號的TOP500超級電腦列表,顯示世上最快速的兩組超級電腦都是使用Linux作為其操作系統(tǒng)。而在表列的500套系統(tǒng)里,采用Linux為操作系統(tǒng)的,占了371組(即74.2%),其中的前十位者,有7組是使用Linux的。eq\o\ac(○,3)目前,除了一部分專家之外,大多數人都不自己選擇每一樣組件或自行設置,而是直接使用Linux套件。eq\o\ac(○,4)靈活性:Linux以它的高效性和靈活性著稱。它能夠在PC計算機上實現全部的Unix特性,具有多任務、多用戶的能力。Linux是在GNU公共許可權限下免費獲得的,是一個符合POSIX標準的操作系統(tǒng)。Linux操作系統(tǒng)軟件包不僅包括完整的Linux操作系統(tǒng),而且還包括了文本編輯器、高級語言編譯器等應用軟件。它還包括帶有多個窗口管理器的X-Window圖形用戶界面,如同我們使用WindowsNT一樣,允許我們使用窗口、圖標和菜單對系統(tǒng)進行操作??偟膩碚f,Linux由于有著諸多windows操作系統(tǒng)所缺乏的優(yōu)點,能夠讓我們在嵌入式應用中如魚得水[2]。GCC簡介什么是GCCGCC是GNU公社的一個項目。是一個用于編程開發(fā)的自由編譯器。最初,GCC只是一個C語言編譯器,它是GNUCCompiler的英文縮寫。隨著眾多自由開發(fā)者的加入和GCC自身的發(fā)展,如今的GCC已經是一個包含眾多語言的編譯器了。其中包括C,C++,Ada,ObjectC和Java等。所以,GCC也由原來的GNUCCompiler變?yōu)镚NUCompilerCollection。也就是GNU編譯器家族的意思。當然,如今的GCC借助于它的特性,可以交叉編譯,即在一個平臺下編譯另一個平臺的代碼。直到現在,GCC的歷史仍然在繼續(xù),它的傳奇仍然被人所傳頌。而且更重要的是GCC完全是一款免費的自由軟件,加之其強大的功能所以深受廣大用戶的喜愛。二、GCC的基本規(guī)則gcc所遵循的部分約定規(guī)則:.c為后綴的文件,C語言源代碼文件;.a為后綴的文件,是由目標文件構成的檔案庫文件;.C,.cc或.cxx為后綴的文件,是C++源代碼文件;.h為后綴的文件,是程序所包含的頭文件;.i為后綴的文件,是已經預處理過的C源代碼文件;.ii為后綴的文件,是已經預處理過的C++源代碼文件;.m為后綴的文件,是Objective-C源代碼文件;.o為后綴的文件,是編譯后的目標文件;.s為后綴的文件,是匯編語言源代碼文件;.S為后綴的文件,是經過預編譯的匯編語言源代碼文件。三、GCC的基本用法在使用GCC編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。GCC編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數。GCC最基本的用法是∶gcc[options][filenames]其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。-c,只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標文件,通常用于編譯不包含主程序的子程序文件。-ooutput_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執(zhí)行文件a.out。-g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。-O,對程序進行優(yōu)化編譯、連接,采用這個選項,整個源代碼會在編譯、連接過程中進行優(yōu)化處理,這樣產生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。-O2,比-O更好的優(yōu)化編譯、連接,當然整個編譯、連接過程會更慢。-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況∶A)#include<myinc.h>B)#include“myinc.h”其中,A類使用尖括號(<>),B類使用雙引號(“”)。對于A類,預處理程序cpp在系統(tǒng)預設包含文件目錄(如/usr/include)中搜尋相應的文件,而B類,預處理程序在目標文件的文件夾搜索相應文件。四、執(zhí)行過程雖然我們稱GCC是C語言的編譯器,但使用gcc由C語言源代碼文件生成可執(zhí)行文件的過程不僅僅是編譯的過程,而是要經歷四個相互關聯的步驟:預編譯,編譯,匯編和命令gcc首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。接著調用cc1進行編譯,這個階段根據輸入文件生成以.o為后綴的目標文件。匯編過程是針對匯編語言的步驟,調用as進行工作,一般來講,.S為后綴的匯編語言源代碼文件和匯編、.s為后綴的匯編語言文件經過預編譯和匯編之后都生成以.o為后綴的目標文件。當所有的目標文件都生成之后,gcc就調用ld來完成最后的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執(zhí)行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方[3]。第三節(jié)linux下的網絡編程技術一、socket編程介紹在介紹心跳檢測的詳細設計之前,首先介紹linux下的網絡程序設計方法。在linux系統(tǒng)中,最常用的網絡應用編程結構是UNIXBSD的套接字接口。socket編程有字節(jié)流和數據報兩種主要類型,分別對應TCP協(xié)議和UDP協(xié)議。其中字節(jié)流socket定義了一種可靠的面向連接的服務,實現了無差錯無重復的順序數據傳輸。數據報socket定義了一種無連接的服務,數據通過相互獨立的報文進行傳輸,是無序的,并且無法保證可靠無差錯。無連接服務器一般都是面向事務處理的,一個請求一個應答就完成了客戶和服務器之間的交互。下面就是本系統(tǒng)所用到的socket編程函數:eq\o\ac(○,1)創(chuàng)建套接字:intsocket(intdomain,inttype,intprotocol);應用程序調用socket函數來創(chuàng)建一個能夠進行網絡通信的套接字。domain:指定應用程序使用的通信協(xié)議的協(xié)議族,對于TCP/IP協(xié)議族,該參數置AF_INET;type:指定要創(chuàng)建的套接字類型,流套接字類型為SOCK_STREAM、數據報套接字類型為SOCK_DGRAM;protocol:指定應用程序所使用的通信協(xié)議,一般設置為0。該函數如果調用成功就返回新創(chuàng)建的套接字的描述符,套接字描述符是一個整數類型的值;如果失敗就返回-1。eq\o\ac(○,2)綁定套接字#include<sys/socket.h>intbind(intsocket,conststructsockaddr*address,size_taddress_len);socket:由socket()調用返回的套接字描述符;addreess:結構指針指向了與協(xié)議名稱和協(xié)議相關的信息;address_len:指明了address數據結構的大小。如果調用成功,bind()函數返回0;否則返回-1,并設置錯誤代碼到errno。eq\o\ac(○,3)等待客戶端連接服務器端應用軟件通過調用accept()函數將自身阻塞,直至有新的客戶端連接。#include<sys/socket.h>intaccept(intsocket,structsockaddr*address,socketlen_taddress_len);socket:創(chuàng)建并綁定的套接字;address:返回連接服務器的客戶端地址信息;address_len:指明了address數據結構的大小。如果調用成功,則返回非負的連接套接字;否則返回-1,并設置錯誤代碼到errno。eq\o\ac(○,4)連接服務器客戶端通過connect()函數和服務器進行TCP連接。#include<sys/socket.h>intconnect(intsocket,conststructsockaddr*address,size_taddress_len);socket:創(chuàng)建并綁定套接字;address:指明要連接服務器的ip地址和端口號;address_len:指明了address數據結構的大小。如果調用成功,返回0;否則返回-1,并設置錯誤代碼到errno。eq\o\ac(○,5)UDP協(xié)議的發(fā)送數據UDP協(xié)議需要通過sendto()函數實現一個數據包的發(fā)送,這是因為UDP協(xié)議提供的是以數據包為單位的傳輸,而TCP協(xié)議提供的是以字節(jié)流為單位的傳輸。#include<sys/socket.h>ssize_tsendto(intsocket,constvoid*message,size_tlength,intflags,conststructsockaddr*dest_addr,socklen_tdest_len);socket:已經創(chuàng)建的套接字;message:指明要發(fā)送的數據包的地址;length:數據包大??;flags:設置發(fā)送的屬性,一般可設置為0;dest_addr:指明目的端的IP地址和端口號;dest_len:指明dest_addr數據結構的大小。如果調用成功,返回實際發(fā)送的數據數目;否則返回-1,并設置錯誤代碼到errno。eq\o\ac(○,6)UDP協(xié)議的接收數據UDP協(xié)議需要通過recvfrom()函數接收一個數據包。#include<sys/socket.h>ssize_trecvfrom(intsocket,void*buffer,size_tlength,intflags,structsockaddr*address,socklen_taddress_len);socket:已經創(chuàng)建的套接字;message:指明要接收的數據包的地址;length:數據包大??;flags:設置發(fā)送的屬性,一般可設置為0;dest_addr:指明目的端的IP地址和端口號;dest_len:指明dest_addr數據結構的大小。如果調用成功,返回實際發(fā)送的數據數目;否則返回-1,并設置錯誤代碼到errno。eq\o\ac(○,7)向一個已連接的套接口發(fā)送數據。#include<sys/sock.h>ssize_tsend(intsocket,constcharvoid*buffer,intlength,intflags);socket:一個用于標識已連接套接口的描述字;buffer:包含待發(fā)送數據的緩沖區(qū);length:緩沖區(qū)中數據的長度;flags:調用執(zhí)行方式;若無錯誤發(fā)生,send()返回所發(fā)送數據的總數;否則的話,返回-1并把錯誤保存到errno。eq\o\ac(○,8)從一個已連接的套接口接收數據。#include<winsock.h>ssize_trecv(intsocket,char*buffer,intlength,intflags);socket:一個標識已連接套接口的描述字;buffer:用于接收數據的緩沖區(qū);length:緩沖區(qū)長度;flags:指定調用方式;若無錯誤發(fā)生,recv()返回讀入的字節(jié)數。如果連接已中止,返回0;否則的話,返回-1并把錯誤保存到errno。eq\o\ac(○,9)IP地址的轉換和獲取在上述套接字程序設計中,服務器和客戶端的IPV4地址采用了32為無符號整數表示。在用戶方面,廣泛使用的是十進制字符串表示(例如2)或者主機名稱(例如)。Linux操作系統(tǒng)提供了一系列函數實現這幾種格式之間的轉換。#include<arpa/inet.h>in_addr_tinet_addr(char*cp);cp:指向十進制字符串表示的IPV4地址。如果調用成功,返回IPV4地址的32位無符號整數表示;否則返回in_addr_t-l。eq\o\ac(○,10)gethostbyname()函數可以實現從主機名稱到32位無符號整數表示的轉換。#include<netdb.h>structhostent{char*h_name;char**h_aliases;inth_addrtype;inth_length;char**h_addr_list;}structhostent*gethostbyname(constchar*name);name:指明了主機名稱的字符串。如果調用成功,返回指向hostent的指針;否則返回NULL,并設置錯誤代碼到h_erno。其中hostent中的h_length指明了主機地址的長度,在Ipv4協(xié)議下始終為1。H_addr_list指明了主機的所有網絡地址。一般情況下,h_addr_list[0]就表明了此主機Ipv4地址的32位無符號整數表示。eq\o\ac(○,11)gethostbyaddr()函數可以實現從32為無符號整數到主機名稱的轉換。#include<netdb.h>structhostent*gethostbyaddr(constvoid*addr,socklen_tlen,inttype);addr:指明了32位無符號整數表示的IPv4地址;len:指明了地址長度;type:在Ipv4協(xié)議下,可以設置為AF_INET。如果調用成功,返回指向hostent的指針;否則返回NULL,并設置錯誤代碼到h_errno。eq\o\ac(○,12)線程創(chuàng)建函數#include<pthread.h>intpthread_create(pthread_t*thread,pthread_ayyr_t*attr,void*(*start_routine)(void*),void*arg)thread:這是一個指向pthread_t類型數據的指針。線程被創(chuàng)建時,這個指針指向的變量中將被寫入一個標識符,我們用該標識符來引用線程。attr:這個參數一般用于設置線程的屬性,我們一般不需要設置特殊的屬性,所以可以簡單的設置該參數為NULL。start_routine:這個參數告訴線程將要啟動的函數。arg:這個參數將傳遞啟動函數的參數。二、TCP/UDP開發(fā)簡介1、TCP開發(fā)介紹在基于TCP協(xié)議的程序設計中一般采用客戶端/服務器的程序設計模式。在服務器端首先使用socket()函數創(chuàng)建套接字,然后使用bind()函數將本機IP地址和服務端口綁定至套接字,并通過listen()函數建立等待隊列,隨后就可以使用accept()函數等待客戶端的連接。accept()函數將一直阻塞,直至有一個客戶端連接到本地服務器端口為止。該函數將返回一個新的套接字值,隨后服務器就可以通過新的套接字接口與連接上的客戶端利用rend()或write()函數進行交互。客戶端在訪問服務器時首先要通過socket()函數調用,然后通過connect()函數連接服務器的IP地址和相應的服務器端口號。連接成功后,就可以通過read()或者write()函數與服務器進行數據交互了。客戶端/服務器結構下的TCP應用程序框架如圖所示[5]:ssocket():創(chuàng)建套接字bind():綁定本機地址和端口號listen():設置等待隊列accept():等待客戶端連接sendto()和recv()與客戶端交換數據close()關閉特定客戶端套接字socket:創(chuàng)建套接字connect()連接服務器sendto()和recv()與服務器端交換數據close()關閉套接字建立請求圖2.1客戶端/服務器結構下的TCP協(xié)議程序結構圖2、UDP開發(fā)介紹基于UDP協(xié)議的應用程序設計比較簡單。首先通信雙方都要利用socket()函數創(chuàng)建套接字,然后將本機IP地址和端口通過bind()函數與套接字綁定。綁定后,可以直接使用sendto()函數向對方發(fā)送消息。使用recvfrom()函數可以接收指定端口的UDP包,并通過返回的address結構獲知發(fā)送方的IP地址和端口號。第四節(jié)本章小結本章主要介紹了該系統(tǒng)開發(fā)的環(huán)境和平臺,Linux是一款流行的網絡操作系統(tǒng),由Unix演化了來,具有豐富和網絡功能,開發(fā)的函數庫較多,功能強大。GCC是一款開源的編譯器,有強大的編譯調試的能力,使本系統(tǒng)的開發(fā)、測試,輕松了很多。最后介紹了本章的網絡編程的一些知識,包括TCP/UDP技術檢測和一些系統(tǒng)開發(fā)用到的socket函數。第三章系統(tǒng)的分析與設計第一節(jié)需求分析一、問題定義本系統(tǒng)的問題概述如下:基本問題是linux以及網絡編程的研究,基本目標是設計一個基于linux環(huán)境的心跳檢測的系統(tǒng)來判斷局域網的網絡連接是否正常。二、可行性研究可行性分析的任務不是研究如何解決問題,而是要用最小的代價在最短的時間,確定問題定義階段所定義的問題是否值得解決。一般情況下,主要從技術可行性、經濟可行性和操作可行性三個方面論證系統(tǒng)開發(fā)的可行性。該系統(tǒng)可在小圍的局域網上進行使用,因此從可操作性來講是可行的。其次,設計開發(fā)這樣的一款心跳檢測系統(tǒng)只需要幾臺電腦構成局域網就可以使用。下面主要從技術可行性進行分析:eq\o\ac(○,1)開發(fā)工具和環(huán)境Linux是一款比較成熟的操作系統(tǒng),它有Unix演化發(fā)展而來,和Unix有多相似之處。所用的函數包基本一致,再加上gcc的強大編譯、調試的功能,對完成這個系統(tǒng)由很大幫助。②算法該系統(tǒng)不需要什么復雜的算法,只需掌握linux環(huán)境下的TCP/IP網絡方面的知識,能夠熟練運用linux下的網絡編程和線程函數,就可以寫出。幸運的是,通過查閱大量豐富的技術資料,我有信心解決這一問題。③自身素質因素通過大學四年的學習,我打下了堅實的專業(yè)基礎,最重要的是學會了自主學習和查閱資料的能力,這都將為我今后的設計開發(fā)過程提供強有力的保障。通過以上分析,可以很確定這一系統(tǒng)的可行性,可以放心地開始下一階段的任務了。三、用戶需求本系統(tǒng)分為外圍節(jié)點和主控節(jié)點的設計,它們有各自的功能:1、外圍節(jié)點功能外圍節(jié)點所需要完成的功能相對簡單,它只需要先發(fā)送登錄報文進行注冊,收到主控節(jié)點的反饋報文之后,定期(每隔一秒)發(fā)送心跳報文即可,不涉及太多功能。2、主控節(jié)點功能主控節(jié)點是系統(tǒng)的關鍵部分,它負責接收登錄報文和心跳報文,然后根據報文的容來判斷網絡連接情況,可以說本系統(tǒng)的主要功能基本上由主控節(jié)點完成:eq\o\ac(○,1)完成接收心跳報文功能主控節(jié)點收到外圍節(jié)點的登錄報文后,就完成對外圍節(jié)點信息的注冊,包括外圍節(jié)點的設備號和分配的槽口號等,并將槽口號返回給外圍節(jié)點。eq\o\ac(○,2)完成接收心跳報文功能主控節(jié)點接收到心跳報文后,由于心跳報文中帶有槽口號,主控節(jié)點根據槽口號查找外圍節(jié)點注冊表,修改響應信息。eq\o\ac(○,3)完成定期檢查外圍節(jié)點功能主控節(jié)點要定期檢查外圍節(jié)點注冊表,從而發(fā)現節(jié)點是否正常工作,如果不正常就報告響應的故障消息。四、系統(tǒng)整體用例圖圖3.1系統(tǒng)用例圖第二節(jié)概要設計概括地說,概要設計進行數據設計/數據庫設計和系統(tǒng)體系結構設計。其目的只是描繪出軟件的總體框架,根據功能、性能需求和數據需求導出軟件的數據結構和系統(tǒng)結構。一、設計指導思想①模塊化模塊是構成程序的基本構件,模塊化就是把程序劃分成獨立命名且可獨立訪問的模塊,每個模塊完成一個子功能,把這些模塊集成起來就構成了一個整體,可以完成指定的功能,以滿助于用戶需求。采用模塊化原理可以使軟件結構清晰,降低了系統(tǒng)的復雜性,使系統(tǒng)容易設計、容易修改,而且其推動了系統(tǒng)各部分的并行開發(fā),提高了軟件的生產效率。本心跳檢測系統(tǒng)設計正是采用了模塊化原理,在主控節(jié)點上有三個線程,每個線程看做一個模塊,方便了主控節(jié)點功能的實現。②抽象化在對軟件系統(tǒng)進行模塊設計時,可以有不同的抽象層次,系統(tǒng)設計過程中的每一步都是對軟件問題解法的又一次更高級抽象。可行性研究是對整個系統(tǒng)的抽象,需求分析則是對此心跳檢測系統(tǒng)所要實現功能的抽象。二、心跳檢測系統(tǒng)的整體結構圖使用上節(jié)所提到的模塊化等設計思想,先是對外圍節(jié)點的發(fā)送報文的流程進行了設計,然后說對主控節(jié)點的完成外圍節(jié)點注冊,完成接收心跳報文,完成定期檢查外圍節(jié)點三個功能進行了一一的設計,下面是整個程序的結構圖,如圖3.2示。圖3.2程序結構圖三、總體設計心跳檢測的基本原理是每個結點周期性地向主控節(jié)點發(fā)送消息,主控節(jié)點根據外圍節(jié)點發(fā)送來的消息判斷這些節(jié)點的狀態(tài)。整個心跳檢測系統(tǒng)包括外圍節(jié)點和主控節(jié)點兩個部分,其結構如圖3.3所示。心跳檢測過程包括以下幾個步驟:eq\o\ac(○,1)連接的建立外圍節(jié)點啟動,將首先與事先約定的主控節(jié)點IP地址建立TCP連接,并向主控節(jié)點注冊該外圍節(jié)點的設備號信息。主控節(jié)點在接收到外圍節(jié)點的注冊報文后,將回送許可報文。外圍節(jié)點在接收到許可報文后,將進入心跳檢測狀態(tài)。如果外圍節(jié)點在5秒沒有連接到主控節(jié)點,或者發(fā)出注冊報文后5秒沒有收到主控節(jié)點的許可報文,則睡眠10秒鐘后重新與主控節(jié)點進行連接。eq\o\ac(○,2)心跳檢測外圍節(jié)點每隔1秒向主控節(jié)點發(fā)送一次心跳報文。主控節(jié)點每隔1秒查詢各個節(jié)點的心跳報文,如果在1秒沒有收到外圍節(jié)點的心跳報文,則顯示相應外圍節(jié)點的網絡連接出現問題。圖3.3心跳檢測的結構圖外圍節(jié)點與主控節(jié)點建立連接時采用了TCP協(xié)議,而心跳檢測過程中使用了UDP協(xié)議。這是由于TCP協(xié)議可以保證傳輸的可靠性和順序性,但是運行開銷比較高,而UDP協(xié)議雖然是一中不可靠的協(xié)議,但是傳輸開銷比較小。因此,在嵌入式系統(tǒng)中,為了降低系統(tǒng)運行開銷,可以將一些不重要的報文采用代繳比較低但是服務質量比較查的協(xié)議來實現。詳細設計詳細設計是該系統(tǒng)的重點部分,介紹了系統(tǒng)具體是如何實現的,包括了心跳注冊表的設計,報文格式的設計,主控節(jié)點和外圍節(jié)點功能的設計。一、心跳表注冊表的設計心跳注冊表被設置成一個靜態(tài)全局的結構體數組,當主控節(jié)點接收到外圍節(jié)點的注冊報文之后就為其在心跳注冊表中找到一個空閑位置分配。而此后,主控節(jié)點在接收到外圍節(jié)點的心跳報文后,也要相應的修改心跳注冊表,判斷節(jié)點是否出現故障也是通過掃描心跳注冊表得知,所以這是個很關鍵的設計。結構體如下:structHeart_Beat{ charstate; charflag; unsignedintdevice_ID; structsockaddr_inaddr;};#defineHEART_BEAT_TABLE_SIZE64staticstructHeart_Beathb_table[HEART_BEAT_TABLE_SIZE];表3.1statestate有IDLE和BUSY兩種狀態(tài),各自的定義如下:#defineIDLE0#defineBUSY1只有設備正常工作時state才為BUSY,否則為IDLE。flagflag在主控節(jié)點接收到外圍節(jié)點的心跳報文后設置為1,在檢測心跳表判斷設備是否工作時重新設置為0,用于標記外圍節(jié)點是否壞掉。device_IDdevice_ID是外圍節(jié)點注冊時向主控節(jié)點提供的,用于標識每個設備。sockaddr_inaddrsockaddr_inaddr是外圍節(jié)點的IP地址。主控節(jié)點對心跳注冊表的具體操作如下:圖3.4主控節(jié)點對心跳注冊表的操作二、報文格式的設計主控節(jié)點和外圍節(jié)點之間有三種報文:從外圍節(jié)點到主控節(jié)點的登錄報文(login),從主控節(jié)點到外圍節(jié)點的響應報文(respond),以及從外圍節(jié)點到主控節(jié)點的心跳報文(heart_beat)。其中前兩者通過TCP協(xié)議發(fā)送,后者通過UDP協(xié)議發(fā)送。在每種類型的報文前均有一個惟一的字節(jié)標識type,用于標識不同類型的報文。例如,在登錄報文中,其type值為1;在響應報文中,其type值為2等。之所以采用這樣的方法,是考慮到未來報文類型擴展的需要。由于各種報文均通過一個TCP端口接收,而接收端應用程序事先無法知道已經被操作系統(tǒng)接收的報文種類,因此也無法判斷應該從recv()函數接口中讀取多少字節(jié)。為了解決這一問題,接收端一般應該首先接收第一個字節(jié),以判斷當前報文的類型,然后根據此類型的大小決定從操作系統(tǒng)存讀取多少個字節(jié)到應用程序的數據結構中,以得到一個完整的報文。這三種報文格式為:#defineLOGIN_TYPE0x01#defineRESPOND_TYPE0x02#defineHEART_BEAT_TYPE0x03eq\o\ac(○,1)登錄報文:structlogin{ chartype; unsignedintdevice_ID;};表3.2type登錄報文的type為0x01device_ID外圍節(jié)點注冊時提供的設備號登錄報文是外圍節(jié)點向主控節(jié)點進行注冊信息時,通過TCP連接發(fā)送的,外圍節(jié)點需要提供自己的設備號即可,主控節(jié)點修改心跳注冊表完成對外圍節(jié)點的注冊。eq\o\ac(○,2)響應報文:structrespond{ chartype; intindex;};表3.3type登錄報文的type為0x02index主控節(jié)點接收到外圍節(jié)點注冊成功時2提供給外圍節(jié)點的槽口號主控節(jié)點收到外圍節(jié)點的登錄報文之后,必須要對外圍節(jié)點進行響應,這時就需要發(fā)送具有反饋信息的respond報文,該報文包含了外圍節(jié)點注冊信息表給該外圍節(jié)點提供槽口號index(第一個注冊的為0,第二個注冊的為1,一次類推),外圍節(jié)點必須收到respond報文后才可以開始發(fā)送心跳報文。eq\o\ac(○,3)心跳報文:structheart_beat{ chartype; intindex; unsignedintdevice_ID;};表3.4type登錄報文的type為0x03index主控節(jié)點接收到外圍節(jié)點注冊成功時2提供給外圍節(jié)點的槽口號,發(fā)送心跳報文時需提供槽口號以便主控節(jié)點修改hb_table表device_ID外圍節(jié)點注冊時提供的設備號心跳報文是外圍節(jié)點定期向主控節(jié)點發(fā)送的UDP報文,包含了外圍節(jié)點的設備號和槽口號,主控節(jié)點根據槽口號來修改外圍節(jié)點注冊信息表,從而為定期掃描心跳注冊表做準備。三、外圍節(jié)點的設計心跳檢測是外圍節(jié)點軟件系統(tǒng)中的一個模塊。它被設計成一個獨立的線程,執(zhí)行如下算法:eq\o\ac(○,1)向主控節(jié)點發(fā)送登錄(login)報文eq\o\ac(○,2)等待主控節(jié)點的反饋(respond)報文的響應eq\o\ac(○,3)接收到respond報文轉向4,否則休眠10秒后轉向1eq\o\ac(○,4)根據respond報文的槽口號建立UDP連接eq\o\ac(○,5)向主控節(jié)點發(fā)送UDP心跳報文eq\o\ac(○,6)休眠1秒后轉向5創(chuàng)建心跳檢測線程創(chuàng)建心跳檢測線程其他處理建立與主的TCP連接向主機發(fā)送登錄信息接受主機分配的槽口號通過UDP協(xié)議發(fā)送心跳報文休眠10秒休眠100毫秒連接成功是否圖3.5外圍節(jié)點程序結構圖2、外圍節(jié)點的時序圖3.6外圍節(jié)點的時序圖四、主控節(jié)點的設計主控節(jié)點完成的功能比較復雜,包括接收外圍節(jié)點的登錄報文,接收外圍節(jié)點的心跳報文,定期進行檢查心跳注冊表等??梢钥紤]采用三個線程分別實現這些功能,并通過一個共享的外圍節(jié)點心跳表進行交互。外圍節(jié)點心跳表的數據結構如下所示。#defineIDLE0#defineBUSY1#defineHEART_BEAT_TABLE_SIZE64#defineNO_DEVICE0structHeart_Beat{ charstate; charflag; unsignedintdevice_ID; structsockaddr_inaddr;};staticstructHeart_Beathb_table[HEART_BEAT_TABLE_SIZE];主控節(jié)點程序啟動后,將首先初始化互斥量hb_table_lock,初始化hb_table數組中各個元素的state狀態(tài)IDLE,然后創(chuàng)建三個線程。執(zhí)行函數分別是accept_connect(),chenk_hb(),accept_hb()三個線程的結構圖如下:圖3.7主控節(jié)點線程調用關系圖1、接收登錄線程接收登錄信息的線程執(zhí)行如下算法:eq\o\ac(○,1)創(chuàng)建套接字,綁定登錄端口,并建立等待隊列。eq\o\ac(○,2)使用accept()函數等待外圍節(jié)點的登錄信息。eq\o\ac(○,3)從套接字端口讀取登錄報文,獲取外圍節(jié)點的設備號device_ID和IP地址。eq\o\ac(○,4)檢查hb_table中的各個表項。eq\o\ac(○,5)如果當前設備號device_ID已經存在于此表,且相關的狀態(tài)為BUSY,則取此表項號index;否則分配一個state為IDLE的表項index。eq\o\ac(○,6)設置hb_table[index]表項中的state為BUSY,設置此表項中的device_ID何addr為外圍設備的device_ID和IP地址,設置此表項中的flag為1。eq\o\ac(○,7)向外圍節(jié)點發(fā)送登錄成功報文,參數為index。eq\o\ac(○,8)轉至2程序結構圖如下:圖3.8登錄線程程序結構圖2、接收外圍節(jié)點心跳檢測報文線程接收的線程執(zhí)行如下算法:eq\o\ac(○,1)使用recvfrom()函數等待讀取外圍節(jié)點的心跳報文。eq\o\ac(○,2)從心跳報文中獲取槽口號index,外圍設備號和IP地址。eq\o\ac(○,3)檢查hb_table[index]中state是否為IDLE,外圍節(jié)點的設備號device_ID和IP地址是否匹配。eq\o\ac(○,4)如果不匹配,則轉至2,否則設置hb_table[index]中的flag為1,設置state為BUSY。eq\o\ac(○,5)轉至2圖3.9接收外圍節(jié)點心跳檢測報文線程程序結構圖3、定期檢查節(jié)點注冊表線程執(zhí)行如下算法:eq\o\ac(○,1)睡眠1秒。eq\o\ac(○,2)檢查hb_table中的各個表項。eq\o\ac(○,3)如果發(fā)現有表項的state為BUSY,而且flag為1,則設置flag為0eq\o\ac(○,4)如果發(fā)現有表項的state為BUSY,而且flag為0,則設置此表項的state為IDLE,并向用戶顯示,此外圍節(jié)點連接中斷。eq\o\ac(○,5)轉至1。圖3.10定期檢查心跳注冊表線程程序結構圖第四節(jié)本章小結本章是重點章節(jié),先是介紹了系統(tǒng)的需求分析,里面著重介紹了主控節(jié)點和外圍節(jié)點所需要實現的功能,又描述了本系統(tǒng)的用例圖。在詳細設計里面則是介紹了報文格式的設計和主控節(jié)點、外圍節(jié)點的設計思路和執(zhí)行算法。
第四章心跳檢測系統(tǒng)的實現第一節(jié)linux下開發(fā)環(huán)境一、編譯環(huán)境前面的章節(jié)已經介紹了gcc的相關容,該設計中有兩個.c文件,main.c和out.c,分別是主控節(jié)點和外圍節(jié)點的運行的文件。首先我們?yōu)檫@兩個文件進行編譯。首先通過cd/hukai進入這兩個文件所在的文件夾,就可以看到main.c和out.c兩個文件。圖4.1顯示兩個需要編譯的文件接下來便是編譯,分別輸入gccmain.c–pthread–omain和gccout.c–oout。-o表示生成的目標文件的名字,-pthread是加上編譯時所需要的線程庫。這樣,我們就可以看到main和out兩個可以直接運行的文件。圖4.2編譯后的可執(zhí)行文件二、運行環(huán)境運行就是啟動分別啟動主控節(jié)點和外圍節(jié)點進程,即main和out這兩個可執(zhí)行文件。../是linux下的執(zhí)行命令,我們輸入./main之后,主控節(jié)點就開始啟動。圖4.3主控節(jié)點的啟動隨后我們再啟動外圍節(jié)點,./out10第二個參數是主控節(jié)點的IP地址,第三個參數是外圍節(jié)點注冊的設備號。圖4.4外圍節(jié)點注冊界面第二節(jié)程序的實現外圍節(jié)點的實現該設計中,基于登錄報文和響應報文構成了一個基本的握手過程。經過此握手過程后,主控節(jié)點向外圍節(jié)點發(fā)送該設備在hb_table數組中的編號(槽口號),外圍節(jié)點在后續(xù)的心跳報文中將提供這個編號供主控節(jié)點快速訪問該設備的狀態(tài)信息。主控節(jié)點hb_table結構中的state和flag字段構成了一個有限狀態(tài)機,如圖5-5所示。圖4.5主控節(jié)點的有限狀態(tài)機因此外圍節(jié)點雖然在功能實現上很簡單,但是由于它要發(fā)送登錄報文和定期心跳報文,所以對它的設計關鍵是在各種報文發(fā)送的時間上。1、登錄報文和心跳報文之間的時間首先,考慮登錄報文和第一個心跳報文之間的時間間隔。如果主控節(jié)點在t時刻接收到登錄報文,將分配相應的hb_table表項,并設置此表項狀態(tài)為BUSY。如果在此過程結束后就執(zhí)行定期檢查線程,則將此表現中的flag值設置為0。如果在下一次定期檢查線程未執(zhí)行之前還未收到心跳報文,則會導致該連接重復恢復到IDLE狀態(tài)。因此,控制節(jié)點接收到登錄報文和第一個心跳報文之間的時間間隔不能小于一秒。因此在接收到主控節(jié)點反饋的respond報文之后,應該休眠一秒后才可以發(fā)送心跳報文。代碼如下:if((byte_read==sizeof(structrespond))&&(respond_serv.type==RESPOND_TYPE)) { hb.type=HEART_BEAT_TYPE; hb.index=respond_serv.index;printf("%d\n",respond_serv.index); hb.device_ID=(int)(*argv[2]); printf("registersuccess\n");sleep(1); flag=1; break;}2、連續(xù)兩個心跳報文之間的時間其次,考慮兩個心跳報文的時間間隔。如果在t時刻主控節(jié)點接收到前一個心跳報文,而隨后執(zhí)行定期檢查線程,則后續(xù)心跳報文必須在下一次定期檢查線程之前到達,否則將導致定期檢查線程判斷連接中斷。因此,兩個連續(xù)的心跳報文之間的時間間隔不能小于一秒。因此,發(fā)送完一個心跳報文之后也應當休眠一秒后才可以繼續(xù)發(fā)送。代碼如下:while(1){ints=sendto(sock_udp,(char*)&hb,sizeof(hb),0,(structsockaddr*)&serv_addr_udp,sizeof(structsockaddr));printf("heartbeatpackagesended!")sleep(1);}二、主控節(jié)點的設計該設計中的主要功能基本上都由主控節(jié)點完成,因此,主控節(jié)點的設計顯得尤為重要。主控節(jié)點完成的操作由三個線程完成。1、接收登錄報文的線程accept_connect()線程負責接收登錄報文,并沒有完成為外圍節(jié)點在心跳注冊表分配槽口號的功能。而分配槽口號的功能則由accept_login()線程實現,我們可以創(chuàng)建一個acc_login報文為這兩個線程之間傳遞參數。代碼如下:structacc_logina_l;a_l.controlsock=confd;a_l.login_addr=address;intret=pthread_create(th_accept_login,NULL,accept_login,&a_l);然后accept_login線程為其分配槽口號,分配槽口號的方法是順序循環(huán)掃描心跳注冊表,知道找到第一個設備號是NO_DEVICE為止。就為其分配,代碼如下:for(i=0;i<HEART_BEAT_TABLE_SIZE;i++){if(hb_table[i].device_ID==NO_DEVICE){pos=i;//pos為分配到的槽口號 break;}}最后我們要對心跳注冊表進行修改,代碼如下:hb_table[pos].state=BUSY;hb_table[pos].device_ID=login_serv->device_ID;hb_table[pos].flag=1;hb_table[pos].addr=sock_addr;2、修改心跳注冊表線程accept_hb()線程負責修改心跳注冊表,即接收到心跳報文之后要根據所得到槽口來修改心跳注冊表,把對應外圍節(jié)點的state和flag標識都設置為1,代碼如下:void*accept_hb(void*p){ char*p1,*p2; structheart_beat*h_b=(structheart_beat*)malloc(sizeof(structheart_beat)); structsockaddr*address=(structsockaddr*)malloc(sizeof(structsockaddr)); intsock_len=sizeof(structsockaddr); while(1){ inti=recvfrom(sock_udp,(char*)h_b,sizeof(structheart_beat),0,address,&sock_len); if(i==-1) printf("receiveheart_beaterror!\n"); else{ pthread_mutex_lock(&hb_table_lock); p1=inet_ntoa(hb_table[h_b->index].addr.sin_addr); p2=inet_ntoa(((structsockaddr_in*)&address)->sin_addr); if(hb_table[h_b->index].device_ID==h_b->device_ID&&(!strcmp(p1,p2))) {printf("%d\n",h_b->index); hb_table[h_b->index].state=BUSY; hb_table[h_b->index].flag=1; } pthread_mutex_unlock(&hb_table_lock); } } returnNULL;}定期檢查心跳注冊表線程定期檢查注冊表線程check_hb()負責掃描心跳注冊表,對于一個表項,如果state為BUSY,flag為0就表示該節(jié)點注冊了但沒收到心跳報文;如果state為BUSY,flag為1則表示該節(jié)點正常,這時應該將flag設置為0,等到接收到下一個心跳報文時再設置為1,代碼如下:void*check_hb(void*p3){ inti=0; while(1){ pthread_mutex_lock(&hb_table_lock); for(i=0;i<HEART_BEAT_TABLE_SIZE;i++) { if((hb_table[i].state==BUSY)&&(hb_table[i].flag==0)) { hb_table[i].state=IDLE; printf("thisnodeerrors!:%d\n",i); } if((hb_table[i].state==BUSY)&&(hb_table[i].flag==1)) {hb_table[i].flag=0;} } pthread_mutex_unlock(&hb_table_lock); sleep(1); } returnNULL;}第三節(jié)本章小節(jié)這一章是介紹了系統(tǒng)的需求分析和詳細設計。需求分析主要是介紹系統(tǒng)主控節(jié)點和外圍節(jié)點分別完成的功能,然后介紹了系統(tǒng)用例圖。接下來是詳細設計,這是系統(tǒng)的關鍵部分,在這一部分,我完成了心跳注冊表、報文、主控節(jié)點和外圍節(jié)點的設計,并用使用相關的程序結構圖來描述程序設計的思路。第五章系統(tǒng)測試系統(tǒng)經過以上幾個階段的設計之后,進入系統(tǒng)設計的最后階段,即系統(tǒng)測試階段。系統(tǒng)測試的任務是發(fā)現并排除在分析、設計、編程各階段中產生的各種類型的錯誤,以得到可運行的軟件系統(tǒng)。第一節(jié)測試環(huán)境本系統(tǒng)有兩臺電腦,其中一臺電腦打開兩個虛擬機,分別充當主控節(jié)點和外圍節(jié)點,另外一臺電腦開啟一臺虛擬機充當外圍節(jié)點。其中主控節(jié)點的IP為0,外圍節(jié)點的IP分別為0(主控節(jié)點所在電腦的另一個虛擬機)和0(另一臺電腦的虛擬機),我們分別稱他們?yōu)橥鈬?jié)點2和外圍節(jié)點1,充當主控節(jié)點的計算機的環(huán)境如表5.1:表5.1主控節(jié)點計算機環(huán)境CPUIntelPentiumprocesser2.06GHZ存2GDDR3硬盤160G操作系統(tǒng)Redhat企業(yè)版5另一臺計算機的配置表5.2:表5.2另一臺計算機環(huán)境CPUIntelPentiumprocesser1.86GHZ存1GDDR2硬盤60G操作系統(tǒng)Ubuntu8.0第二節(jié)測試方法通常的測試方法有黑盒測試和白盒測試。本次測試主要用黑盒測試來測試本系統(tǒng)的主要模塊。一、黑盒測試黑盒測試也稱功能測試,它是通過測試來檢測每個功能是否都能正常使用。在測試中,把程序看作一個不能打開的黑盒子,在完全不考慮程序部結構和部特性的情況下,在程序接口進行測試,它只檢查程序功能是否按照需求規(guī)格說明書的規(guī)定正常使用,程序是否能適當地接收輸入數據而產生正確的輸出信息。黑盒測試著眼于程序外部結構,不考慮部邏輯結構,主要針對軟件界面和軟件功能進行測試。黑盒測試是以用戶的角度,從輸入數據與輸出數據的對應關系出發(fā)進行測試的。很明顯,如果外部特性本身有問題或規(guī)格說明的規(guī)定有誤,用黑盒測試方法是發(fā)現不了的。黑盒測試法注重于測試軟件的功能需求,主要試圖發(fā)現下列幾類錯誤。①功能不正確或遺漏;②界面錯誤;④性能錯誤;⑤初始化和終止錯誤等。二、測試步驟eq\o\ac(○,1)我們首先啟動主控節(jié)點(IP地址為0),此時,主控節(jié)點已經阻塞,等待外圍節(jié)點注冊報文的到來,如圖5.1所示:圖5.1主控節(jié)點啟動eq\o\ac(○,2)這時,啟動Ubuntu虛擬機的外圍節(jié)點1(IP地址為0),啟動后主控節(jié)點將槽口號0分配給它,如圖5.2:圖5.2外圍節(jié)點1注冊成功eq\o\ac(○,3)外圍節(jié)點得到了主控節(jié)點的反饋信息connectsuccess和registersuccess,隨后又顯示了外圍節(jié)點所分配到的槽口號,而后就是發(fā)送心跳報文,heartbeatpackageissended是心跳報文的發(fā)送消息,每隔一秒發(fā)送一次,因此這條發(fā)送消息也會每隔一秒鐘顯示一次:圖5.3外圍節(jié)點1得到反饋信息并發(fā)送報文eq\o\ac(○,4)啟動外圍節(jié)點2,并發(fā)送心跳報文,主控節(jié)點為它分配槽口號1的反饋信息如圖5.4,外圍節(jié)點獲得反饋信息,并每隔一秒發(fā)送心跳報文,如圖5.5:圖5.4外圍節(jié)點2注冊成功圖5.5外圍節(jié)點獲得反饋信息并發(fā)送心跳報文eq\o\ac(○,5)這時,我們斷開外圍節(jié)點1,此時主控節(jié)點將顯示出節(jié)點發(fā)生網絡故障的信息——thisnodeerrors!:0,表示槽口號0對應的節(jié)點(外圍節(jié)點1)出現網絡連接故障,如圖5.6:圖5.6外圍節(jié)點1斷開eq\o\ac(○,6)這時,斷開外圍節(jié)點2,主控節(jié)點端也將顯示出相應的出錯信息,如圖4.7:圖5.7外圍節(jié)點2斷開第三節(jié)本章小結在程序將要完成以后,對系統(tǒng)作個全面的測試是必須的。通常我們用黑盒測試的方法來發(fā)現那些不可預見的問題。在測試過程中盡力做到測試數據的全面,有限的測試數據不是很容易發(fā)現系統(tǒng)中存在的致命錯誤。雖然測試的數據越多越好,但無論是白盒法還是黑盒法測試,都不可能進行窮舉測試,因為即使測試所有路徑的一跟小的子集,也會導致也許大量的測試數據,而這在實際測試過程中是無法實現的。
結論心跳檢測系統(tǒng)在故障檢測方面有著巨大的優(yōu)勢。本設計介紹了分布式系統(tǒng)中常見的心跳檢測問題,介紹了心跳檢測中必須的socket編程技術,以及心跳檢測主控節(jié)點和外圍節(jié)點的軟件實現算法、數據結構與交互報文格式,還對心跳檢測協(xié)議的時間特征進行了初步分析。事實上,在分布式系統(tǒng)中設計一個完善的協(xié)議時非常困難的。本設計中,原有的心跳檢測協(xié)議還有很多可以改進的地方。eq\o\ac(○,1)登錄報文與第一個心跳報文之間的最小時間間隔僅有1秒,這對廣域分布式系統(tǒng)而言是不夠的,需要將其擴大。eq\o\ac(○,2)由于主控節(jié)點和外圍節(jié)點之間的網絡延遲和抖動難以確定,因此當心跳報文之間的延遲超過1秒時,主控節(jié)點就認為外圍節(jié)點出現故障,而此時外圍節(jié)點并不了解控制主機已經將其設置為故障節(jié)點,還會將繼續(xù)向其發(fā)送心跳報文。這不僅浪費了網絡和主機資源,而且協(xié)議也缺乏健壯性,需要進一步改進。我相信,在深入學習心跳檢測相關的技術之后,我可以完成一個功能更強大,程序更健壯的心跳檢測系統(tǒng)。
致至此,我的畢業(yè)設計結束了,在這一個多月里,我得到了很多人的關懷,在這里我要意義表示感。首先,我要感我的畢業(yè)設計指導老師——易芝老師,我之前并沒有接觸過心跳檢測系統(tǒng),是她給我介紹了相關的理論并給我詳細的講解,我才能著手開始做這個設計。在后期論文的撰寫中,她也是細心給我指導,詳細給我指出了論文中的不足,并指導我修改,付出了大量的心血。其次,我要感我的父母,我在設計過程中有過灰心,是他們打鼓勵我,給我戰(zhàn)勝困難的勇氣,讓我跌倒了重新站起來,一步步走向最后。再次,要感林業(yè)貴,章祥,龍等同學,他們給我介紹了Linux下的網絡編程,并幫我調試程序。寫論文中,又給我介紹ROSE、VISIO等工具的使用。最后,還要向參加論文審閱、答辯的專家和老師表示感!你們辛苦了!向所有關心我和幫助我的人表示誠摯的意!
參考文獻[1]虎,吳濤.嵌入式系統(tǒng)課程設計[M].:機械工業(yè),2005.[2]長生;胡慶平;譚志虎.“Heartbeat-Gear:一種新型的實時心跳檢測技術[J]”.計算機工程與科學,2004年26期:62-65頁.[3]GCC百科.baike.baidu./view/4848.htm.[4]NeilMatthew,RichardStones.BeginningLinuxProgramming[M].:人民郵電,2007.[5]TCP檢測.hi.baidu./zhihui3409/blog/item/7c5b8dd151b99cd6562c8471.html[6]PeterBaerGalvin,GregGagne.OperatingSystemConcepts[M].:高等教育2008.[7]W.RichardStevens.Unix環(huán)境高級編程(第二版)[M].:人民郵電,2004.[8]葉樹華,高志紅.網絡編程實用教程[M].:人民郵電,2006.[9]AlanWood.AvailabilityModeling[J].IEEECircuitsandDevicesMagazine,1994。10(3):22—27.[10]W.RichardStevens.Unix網絡編程(第一卷)[J].:機械工業(yè),2007.[11]W.RichardStevens.Tcp/Ip詳解(第一卷)[D].:機械工業(yè),2007.[12]W.RichardStevens.Tcp/Ip詳解(第二卷)[D].:機械工業(yè),2007.[13]吳書華.KylinOS可靠心跳協(xié)議研究.:國防科學技術大學,2008.[14]長生;胡慶平;譚志虎.“Heartbeat-Gear:一種新型的實時心跳檢測技術[J]”.計算機工程與科學,2004年26期:62-65頁.[15]熊盛武;王魯;婕。“構建高性能集群計算機系統(tǒng)的關鍵技術”.微計算機信息,2006年03期:86-88頁.
附錄一、英文原文ComputernetworksecurityandtoguardagainstIntheinformationage,informationcanhelpgroupsorindividualssothattheybenefitfrom,thesameinformationcanalsobeusedtoposeathreattothem,causeddamage.Thereforenetworksecurity,includingthecompositionofnetworkhardware,softwareandnetworktransmissionofinformationsecurity,sothattheydonotbecauseofaccidentalormaliciousdestructionoftheattacks,networksecuritynotonlythetechnicalaspects,butalsomanagementissues,bothcomplementeachother,areindispensable.First,theconceptofcomputernetworksecurityInternationalOrganizationforStandardizationof"computersecurity"isdefinedas:"Toestablishadataprocessingsystemandtheadoptionoftechnologyandmanagementofsecurityprotection,theprotectionofcomputerhardware,software,dataisnotduetoaccidentalandmaliciousdestructionofreasons,changeandleakage."Theabovedefinitionofcomputersecurityincludesphysicalsecurityandlogicalsecurityofboththecontentsofthecontentsofthelogicofsecuritycouldbeunderstoodasweoftensaythattheinformationsecurity,informationreferstotheconfidentiality,integrityandavailabilityofprotection,andnetworksecurityInformationsecurityisthemeaningoftheextension,thatnetworksecurityisanetworkofinformationconfidentiality,integrityandavailabilityprotection.Computernetworksecurityasthespecificmeaningoftheusercha
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- ××中學檔案管理規(guī)范制度
- 股東權益出資證明書正規(guī)版(7篇)
- 實習表現及工作成果認證證明書(5篇)
- 2025年安徽省事業(yè)單位招聘考試教師信息技術學科專業(yè)知識試卷
- 2025年場(廠)內專用機動車輛維修人員考試試卷(汽車維修行業(yè)市場潛力分析與挖掘策略)
- 知識產權轉讓協(xié)議要點報告書
- 2025年電子商務師(中級)職業(yè)技能鑒定模擬試題庫及答案
- 2025年美容師職業(yè)技能鑒定試卷-高級案例分析
- 2025年江蘇省事業(yè)單位招聘考試綜合類專業(yè)能力測試試卷(審計類)-審計實務與案例分析
- 2025年無店鋪零售服務項目提案報告
- 人教版三年級語文上冊期末試卷及答案【完整】
- ptfe膜雨棚施工方案
- 人工智能倫理規(guī)則
- 米亞羅-孟屯河谷風景名勝區(qū)旅游基礎設施建設項目環(huán)評報告
- 婦產科護理學教材(課后思考題參考答案)
- 沖突管理與溝通技巧
- 全同態(tài)加密算法概述
- 電流、電壓指針儀表校驗報告
- 六年級下冊英語素材-Unit-6-General-revision-3-知識點-人教精通版
- BS2000標準操作規(guī)程
- 中等職業(yè)學校英語課程標準(2020年版)(word精排版)
評論
0/150
提交評論