網(wǎng)絡(luò)時(shí)間同步系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)畢業(yè)論文_第1頁
網(wǎng)絡(luò)時(shí)間同步系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)畢業(yè)論文_第2頁
網(wǎng)絡(luò)時(shí)間同步系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)畢業(yè)論文_第3頁
網(wǎng)絡(luò)時(shí)間同步系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)畢業(yè)論文_第4頁
網(wǎng)絡(luò)時(shí)間同步系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)畢業(yè)論文_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

PAGE1網(wǎng)絡(luò)時(shí)間同步系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)目錄TOC\o"1-5"\h\u161摘要 115623Abstract 16921緒論 2210381.1研究背景 3307651.2主要工作和方法 3309411.3本文結(jié)構(gòu) 3202102相關(guān)知識 4296212.1網(wǎng)絡(luò)時(shí)間同步技術(shù)相關(guān)知識介紹 4169222.1.1網(wǎng)絡(luò)時(shí)間同步概念 4194092.1.2常用的時(shí)間同步協(xié)議 438822.1.3網(wǎng)絡(luò)時(shí)間同步系統(tǒng)實(shí)現(xiàn)原理 597492.1.4C/S系統(tǒng)模型的特點(diǎn)以及TCP三次握手 5304962.1.5VisualC++開發(fā)環(huán)境及相關(guān)知識 6226653系統(tǒng)設(shè)計(jì) 7135383.1需求分析 7254863.2系統(tǒng)模型設(shè)計(jì) 7317613.3系統(tǒng)工作流程設(shè)計(jì) 8137944系統(tǒng)實(shí)現(xiàn) 9275404.1服務(wù)器端詳細(xì)設(shè)計(jì) 965314.2服務(wù)器端主要功能的設(shè)計(jì)與實(shí)現(xiàn) 9310604.2.1服務(wù)器端通信的連接與建立 9227734.2.2所需時(shí)間的獲取及發(fā)送 10186894.2.3最小化程序到系統(tǒng)托盤的實(shí)現(xiàn) 11264934.3客戶方詳細(xì)設(shè)計(jì) 13117394.3.1客戶方通信連接的建立 13277124.3.2時(shí)間的接收與同步 14224734.3.3最小化系統(tǒng)托盤的實(shí)現(xiàn) 17203394.3.4定時(shí)器的設(shè)計(jì)與實(shí)現(xiàn) 19282445系統(tǒng)測試與數(shù)據(jù)分析 2087055.1檢測的方法 20123455.1.1服務(wù)器端的測試 20151775.1.2客戶方的測試 2193805.1.3系統(tǒng)時(shí)間同步的測試 2115075.2數(shù)據(jù)分析 224964結(jié)束語 2231638參考文獻(xiàn) 2325489致謝 24

網(wǎng)絡(luò)時(shí)間同步系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)摘要:如果網(wǎng)絡(luò)中主機(jī)的時(shí)間與服務(wù)器的時(shí)間不同,就會不便于網(wǎng)絡(luò)的運(yùn)行與管理。因此本畢業(yè)設(shè)計(jì)針對這一問題進(jìn)行了分析,并設(shè)計(jì)了C/S結(jié)構(gòu)的網(wǎng)絡(luò)時(shí)間同步系統(tǒng)。在這個(gè)系統(tǒng)中,客戶方首先向服務(wù)器發(fā)送連接請求,在連接建立以后向服務(wù)器請求時(shí)間同步,服務(wù)器接受請求并將時(shí)間發(fā)送給客戶方,客戶方接收后用服務(wù)器的時(shí)間來同步自己的時(shí)間,這樣使得網(wǎng)絡(luò)中主機(jī)的時(shí)間與服務(wù)器的時(shí)間一致。關(guān)鍵詞:網(wǎng)絡(luò)時(shí)間同步;客戶機(jī)/服務(wù)器;Winsock;設(shè)計(jì)與實(shí)現(xiàn)DesignandImplementationofTimeSynchronismAbstract:Ifthehostandtheserveraredifferentatnetworktime,it'snotconvenientfortheadministratortomanagementthenetwork,sothearticleanalysisthematteranddesignsthesystemoftimesynchronism.Inthissystem,theclientsendstherequesttoconnecttheservertoalterthetime.Theserverlistensandreplystherequest,inthiswaytheclientandtheserverwillhavethesametimeinthenetwork.KeyWords:NetworkTime;Client/Server;Winsock;DesignandImplementation

1緒論1.1研究背景隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)及其應(yīng)用的深入發(fā)展,當(dāng)今社會計(jì)算機(jī)在人們的生活和工作中發(fā)揮著越來越重要的作用,網(wǎng)絡(luò)時(shí)間同步技術(shù)顯得越來越為重要。如何精確的同步網(wǎng)絡(luò)中主機(jī)的時(shí)間,經(jīng)歷了長足的發(fā)展,從七十年代末八十年代初,網(wǎng)絡(luò)時(shí)間同步技術(shù)的初步發(fā)展,到各種網(wǎng)絡(luò)時(shí)間同步協(xié)議的誕生,網(wǎng)絡(luò)時(shí)間同步技術(shù)經(jīng)歷了萌芽、快速發(fā)展、基本成熟、繼續(xù)發(fā)展等階段,時(shí)間同步精度與穩(wěn)定性也越來越高,并且得到了相當(dāng)廣泛的應(yīng)用[1]。網(wǎng)絡(luò)時(shí)間同步技術(shù)廣泛的應(yīng)用在Internet上的計(jì)算機(jī),計(jì)算機(jī)時(shí)鐘用于記錄事件的時(shí)間信息,如E-MAIL信息、文件創(chuàng)建和訪問時(shí)間、數(shù)據(jù)庫處理時(shí)間等。時(shí)鐘還被用于控制備份的操作、為設(shè)計(jì)自動構(gòu)造編譯器檢查文件是否變動過以及其他應(yīng)用,在同步設(shè)備系統(tǒng)、光傳輸設(shè)備系統(tǒng)、3G基站設(shè)備系統(tǒng)這些需要精確時(shí)間的系統(tǒng)中,網(wǎng)絡(luò)時(shí)間同步系統(tǒng)就顯得尤為重要[2]。隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)及其應(yīng)用的深入發(fā)展,人們開始在計(jì)算機(jī)構(gòu)成的虛擬空間開展活動。許多重要領(lǐng)域必須依靠計(jì)算機(jī)系統(tǒng)的高可靠性和高效率來精確控制關(guān)鍵的工作與任務(wù),尤其在分布式系統(tǒng)中需要在大范圍內(nèi)保持網(wǎng)絡(luò)中計(jì)算機(jī)間的時(shí)間同步和時(shí)間的準(zhǔn)確性,然而現(xiàn)實(shí)中計(jì)算機(jī)的時(shí)鐘工作并不太穩(wěn)定,容易受到溫度、電源等環(huán)境條件的影響[3],在這些條件的影響下,要精確的同步網(wǎng)絡(luò)中的所有主機(jī)的時(shí)間,是一件很有必要的事情,這些都推動了網(wǎng)絡(luò)時(shí)間同步技術(shù)的研究。1.2主要工作和方法查找參考資料,了解有關(guān)的VC++網(wǎng)絡(luò)編程知識以及MFC的運(yùn)用,系統(tǒng)主要采用VC++語言通過Winsock編程來設(shè)計(jì)與實(shí)現(xiàn)網(wǎng)絡(luò)中主機(jī)與服務(wù)器之間的時(shí)間同步問題,網(wǎng)絡(luò)時(shí)間同步系統(tǒng)主要分為兩個(gè)部分:服務(wù)器端程序和客戶端程序。在設(shè)計(jì)服務(wù)器程序時(shí)候,采用TCP報(bào)文傳輸,因?yàn)門CP是面向連接的傳輸方式,是一種可靠的傳輸方式,服務(wù)器根據(jù)客戶端的請求建立虛連接,并且響應(yīng)客戶端的請求,利用GetLocalTime函數(shù)得到系統(tǒng)的時(shí)間,服務(wù)器監(jiān)聽到客戶方請求的時(shí)間以及服務(wù)器響應(yīng)客戶方的時(shí)間封裝在報(bào)文中,通過Send函數(shù)將存放這些時(shí)間的數(shù)組Sbuff發(fā)送到客戶方中,客戶方請求時(shí)間同步后,利用receive函數(shù)接收服務(wù)器發(fā)送來的數(shù)組,通過strncpy函數(shù)取出數(shù)組中的時(shí)間,并且結(jié)合自己的時(shí)間算出報(bào)文在網(wǎng)絡(luò)中的傳輸時(shí)間,最后同步自己的時(shí)間,此外客戶端以及服務(wù)器還增加了最小化程序到系統(tǒng)托盤的功能,便于程序在后臺運(yùn)行。為了能夠定期的實(shí)現(xiàn)客戶方與服務(wù)器的時(shí)間同步功能,在系統(tǒng)中增加了定時(shí)器,可以定期的對客戶方進(jìn)行時(shí)間同步,不需要每次都手動的同步客戶方與服務(wù)器的時(shí)間。1.3本文結(jié)構(gòu)本文第1部分緒論主要說明了本文的研究背景、主要工作和實(shí)現(xiàn)方法。第2部分相關(guān)知識介紹了網(wǎng)絡(luò)時(shí)間同步的定義、常用的協(xié)議、系統(tǒng)組成,以及VC++開發(fā)環(huán)境及相關(guān)知識。第3部分系統(tǒng)設(shè)計(jì),闡述了需求分析、系統(tǒng)模型設(shè)計(jì)和系統(tǒng)工作流程設(shè)計(jì)。第4部分系統(tǒng)實(shí)現(xiàn)給出系統(tǒng)各個(gè)功能模塊的詳細(xì)設(shè)計(jì)與主要代碼的實(shí)現(xiàn)。第5部分系統(tǒng)測試與數(shù)據(jù)分析,說明了檢測目標(biāo)和方法以及檢測結(jié)果。2相關(guān)知識2.1網(wǎng)絡(luò)時(shí)間同步技術(shù)相關(guān)知識介紹2.1.1網(wǎng)絡(luò)時(shí)間同步概念網(wǎng)絡(luò)時(shí)間同步是指將計(jì)算機(jī)或設(shè)備的時(shí)間與網(wǎng)絡(luò)上的時(shí)間源保持一致[3],時(shí)間源是網(wǎng)絡(luò)中提供可靠時(shí)間的設(shè)備,其標(biāo)準(zhǔn)是時(shí)間的精準(zhǔn)可靠,使用互聯(lián)網(wǎng)同步個(gè)人計(jì)算機(jī)的時(shí)間是十分方便的,目前國內(nèi)外都免費(fèi)提供這種服務(wù)。國際上有幾百臺一級時(shí)間服務(wù)器提供這種時(shí)間同步服務(wù),其中以美國國家標(biāo)準(zhǔn)技術(shù)研究院(NIST)的性能最好[4]。2.1.2常用的時(shí)間同步協(xié)議在時(shí)間同步技術(shù)中常用的協(xié)議主要有:時(shí)間協(xié)議(TimeProtocol)、日時(shí)協(xié)議(DaytimeProtocol)和網(wǎng)絡(luò)時(shí)間協(xié)議(NetworkTimeProtocol,NTP)[5]。時(shí)間協(xié)議(TimeProtocol)[6]:該協(xié)議提供了一個(gè)獨(dú)立于站點(diǎn)的,機(jī)器可讀的日期和時(shí)間信息。時(shí)間服務(wù)返回的是以秒數(shù),是從1990年1月1日午夜到現(xiàn)在的秒數(shù)。設(shè)計(jì)這個(gè)協(xié)議的一個(gè)重要目的在于,網(wǎng)絡(luò)上的許多主機(jī)并沒有時(shí)間的觀念,在分布式的系統(tǒng)上,主機(jī)的時(shí)間往往可以人為改變,而且因?yàn)闄C(jī)器時(shí)鐘內(nèi)的誤差而變得不一致,因此需要使用時(shí)間服務(wù)器通過選舉方式得到網(wǎng)絡(luò)時(shí)間,讓服務(wù)器有一個(gè)準(zhǔn)確的時(shí)間觀念。日時(shí)協(xié)議(DaytimeProtocol)[7]:該協(xié)議是本RFC規(guī)范了一個(gè)ARPAInternetcommunity上的標(biāo)準(zhǔn)。在ARPAInternet上的所有主機(jī)應(yīng)當(dāng)采用和實(shí)現(xiàn)這個(gè)標(biāo)準(zhǔn)。一個(gè)有用的測量和調(diào)試工具就是daytime服務(wù)。它的作用就是返回當(dāng)前時(shí)間和日期,格式是字符串格式。這種時(shí)間傳輸協(xié)議廣泛的被運(yùn)行MS-DOS和類似的操作系統(tǒng)的小型計(jì)算機(jī)使用,該協(xié)議不指定固定的傳輸格式,只要求按照ASCII標(biāo)準(zhǔn)發(fā)送數(shù)據(jù)。最普且最繁雜的是網(wǎng)絡(luò)時(shí)間協(xié)議(NetworkTimeProtocol,NTP),該協(xié)議是美國德拉瓦大學(xué)的Mills教授于1985年提出的,已經(jīng)發(fā)展了20多年,可以兼容Unix,VMS和Windows等多種操作系統(tǒng),網(wǎng)絡(luò)時(shí)間協(xié)議(NTP)的首次實(shí)現(xiàn)記載在InternetEngineeringNote之中,其精確度為數(shù)百毫秒。稍后出現(xiàn)了首個(gè)時(shí)間協(xié)議的規(guī)范,即RFC-778,它被命名為DCNET互聯(lián)網(wǎng)時(shí)間服務(wù),而它提供這種服務(wù)還是借助于InternetcontrolMessageProtocol(ICMP),即互聯(lián)網(wǎng)控制消息協(xié)議中的時(shí)間戳和時(shí)間戳應(yīng)答消息作為NTP[8]。名稱的首次出現(xiàn)是在RFC-958之中,該版本也被稱為NTPv0,其目的是為ARPA網(wǎng)提供時(shí)間同步。它己完全脫離ICMP,是作為獨(dú)立的協(xié)議以完成更高要求的時(shí)間其時(shí)間同步精度在局域網(wǎng)上可以達(dá)到毫秒級,在全球互聯(lián)網(wǎng)上也可以達(dá)到幾十毫秒。NTP提供準(zhǔn)確時(shí)間,首先要有準(zhǔn)確的時(shí)間來源,這一時(shí)間應(yīng)該是國際標(biāo)準(zhǔn)時(shí)間UTC。NTP獲得UTC的時(shí)間來源可以是原子鐘、天文臺、衛(wèi)星,也可以從Internet上獲取。這樣就有了準(zhǔn)確而可靠的時(shí)間源。時(shí)間按NTP服務(wù)器的等級傳播。按照離外部UTC源的遠(yuǎn)近將所有服務(wù)器歸入不同的Stratun(層)中。Stratum-1在頂層,有外部UTC接入,而Stratum-2則從Stratum-1獲取時(shí)間,Stratum-3從Stratum-2獲取時(shí)間,以此類推,但Stratum層的總數(shù)限制在15以內(nèi)。所有這些服務(wù)器在邏輯上形成階梯式的架構(gòu)相互連接,而Stratum-1的時(shí)間服務(wù)器是整個(gè)系統(tǒng)的基礎(chǔ)[9]。計(jì)算機(jī)主機(jī)一般同多個(gè)時(shí)間服務(wù)器連接,利用統(tǒng)計(jì)學(xué)的算法過濾來自不同服務(wù)器的時(shí)間,以選擇最佳的路徑和來源來校正主機(jī)時(shí)間。即使主機(jī)在長時(shí)間無法與某一時(shí)間服務(wù)器相聯(lián)系的情況下,NTP服務(wù)依然有效運(yùn)轉(zhuǎn)。2.1.3網(wǎng)絡(luò)時(shí)間同步系統(tǒng)實(shí)現(xiàn)原理在本畢業(yè)設(shè)計(jì)中客戶方通過向服務(wù)器端發(fā)送時(shí)間同步請求獲取服務(wù)器方的時(shí)間來同步自己的時(shí)間,然而由于在網(wǎng)絡(luò)中數(shù)據(jù)包的傳輸需要通過物理介質(zhì),以及數(shù)據(jù)包在網(wǎng)絡(luò)上傳輸?shù)木嚯x長短等因素,因此在報(bào)文的傳輸過程中會產(chǎn)生網(wǎng)絡(luò)延遲,所以當(dāng)客戶方從服務(wù)器端獲取服務(wù)器的時(shí)間時(shí),其由于報(bào)文傳輸過程中所產(chǎn)生的網(wǎng)絡(luò)延遲,所以此時(shí)獲取的時(shí)間不是服務(wù)器當(dāng)前的時(shí)間,而此時(shí)服務(wù)器的時(shí)間等于客戶方獲取的時(shí)間加上網(wǎng)絡(luò)延遲的時(shí)間之和,所以網(wǎng)絡(luò)時(shí)間同步原理如圖2-1所示,其中:T1:客戶方發(fā)送方查詢請求時(shí)間(以客戶方時(shí)間系統(tǒng)為參照);T2:服務(wù)器受到查詢請求時(shí)間(以服務(wù)器時(shí)間系統(tǒng)為參照);T3:服務(wù)器回復(fù)時(shí)間信息包時(shí)間(以服務(wù)器時(shí)間系統(tǒng)為參照);T4:客戶方受到回復(fù)時(shí)間信息包的時(shí)間(以客戶方時(shí)間系統(tǒng)為參照);δ1:請求信息在網(wǎng)上傳播消耗的時(shí)間;δ2:回復(fù)信息在網(wǎng)上傳播消耗的時(shí)間;假設(shè)請求信息在網(wǎng)上傳播消耗的時(shí)間δ1與回復(fù)信息在網(wǎng)上傳播的時(shí)間δ2相等,因此數(shù)據(jù)包在網(wǎng)絡(luò)傳輸過程中產(chǎn)生的網(wǎng)絡(luò)延遲為T=1/2[(T2-T1)+(T4-T3)]。所以客戶方需要同步的時(shí)間為服務(wù)器的時(shí)間加上網(wǎng)絡(luò)延遲,即:客戶方時(shí)間Ctime=Stime+T圖2-1時(shí)間同步原理圖2.1.4C/S系統(tǒng)模型的特點(diǎn)以及TCP三次握手網(wǎng)絡(luò)時(shí)間同步系統(tǒng)采用C/S(客戶/服務(wù)器)模式,主要有兩部分組成:服務(wù)器與客戶端。采用C/S模式主要是有以下優(yōu)點(diǎn):C/S模式將應(yīng)用與服務(wù)分離,系統(tǒng)具有穩(wěn)定性和靈活性C/S模式配備的是點(diǎn)對點(diǎn)的結(jié)構(gòu)模式,適用于局域網(wǎng),有可靠的安全由于客戶端實(shí)現(xiàn)與服務(wù)器端的直接連接,沒有中間環(huán)節(jié),因此響應(yīng)速度快在C/S模式中,作為客戶機(jī)的計(jì)算機(jī)都要安裝客戶機(jī)程序,只需要一臺服務(wù)器就可以管理整個(gè)網(wǎng)絡(luò)。網(wǎng)絡(luò)中客戶端與服務(wù)器端的連接采用TCP連接方式,即所謂的“三次握手”[10](圖2-1):(1)第一次握手:建立連接時(shí),客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);(2)第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);(3)第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。圖2-1TCP三次握手2.1.5VisualC++開發(fā)環(huán)境及相關(guān)知識VisualC++是Windows平臺上的C++編程環(huán)境,學(xué)習(xí)VC要了解很多Windows平臺的特性并且還要掌握MFC、ATL、COM等知識。MFC是Win32API的包裝類,需要理解文檔視圖類的結(jié)構(gòu),窗口類的結(jié)構(gòu),消息流向等等;COM是代碼共享的二進(jìn)制標(biāo)準(zhǔn),需要掌握其基本原理等等。VC++應(yīng)用程序的開發(fā)主要有兩種模式,一種是WINAPI方式,另一種則是MFC方式,傳統(tǒng)的WINAPI開發(fā)方式比較繁瑣,而MFC則是對WINAPI再次封裝,所以MFC相對于WINAPI開發(fā)更具備效率優(yōu)勢,MFC的英文全稱是MicrosoftFundationClasses,即微軟的基本類庫,MFC的本質(zhì)就是一個(gè)包含了許多微軟公司已經(jīng)定義好的對象的類庫,雖然要編寫的程序在功能上是千差萬別的,但從本質(zhì)上來講,都可以化歸為用戶界面的設(shè)計(jì)、對文件的操作、多媒體的使用、數(shù)據(jù)庫的訪問等等一些最主要的方面[11]。這一點(diǎn)正是微軟提供MFC類庫最重要的原因,在這個(gè)類庫中包含了一百多個(gè)程序開發(fā)過程中最常用到的對象。在進(jìn)行程序設(shè)計(jì)的時(shí)候,如果類庫中的某個(gè)對象能完成所需要的功能,只要簡單地調(diào)用已有對象的方法就可以了。還可以利用面向?qū)ο蠹夹g(shù)中很重要的“繼承”方法從類庫中的已有對象派生出我們自己的對象,這時(shí)派生出來的對象除了具有類庫中的對象的特性和功能之外,還可以自己根據(jù)需要加上所需的特性和方法,產(chǎn)生一個(gè)更專門的,功能更為強(qiáng)大的對象。當(dāng)然,也可以在程序中創(chuàng)建全新的對象,并根據(jù)需要不斷完善對象的功能。相比較而言,WINAPI方式更加的本質(zhì)與復(fù)雜,MFC則相對的簡單與抽象,而且MFC本身就是對WINAPI再次封裝,所以MFC相對于WINAPI開發(fā)更具備效率優(yōu)勢,MFC的功能在正常情況下可以滿足絕大部分的需要,必要時(shí)可以直接調(diào)用API函數(shù),但是反過來卻十分困難,而且MFC與VC++融合擁有很多人性化的特性,比如界面、通用對話框等等,所以在設(shè)計(jì)這個(gè)系統(tǒng)的時(shí)候我采用MFC方式??傊甐isualC++是一個(gè)功能強(qiáng)大且非常實(shí)用的編程工具。3系統(tǒng)設(shè)計(jì)3.1需求分析為使客戶方與服務(wù)器方的時(shí)間能夠同步,系統(tǒng)設(shè)計(jì)成客戶/服務(wù)器模式(C/S模式),C/S模式是一種兩層結(jié)構(gòu)的系統(tǒng),第一層在客戶機(jī)上安裝了客戶機(jī)應(yīng)用程序,第二層在服務(wù)器上安裝服務(wù)器管理程序。在C/S模式的工作過程中,客戶方要能夠向服務(wù)器方請求時(shí)間同步,即可以與服務(wù)器在一個(gè)網(wǎng)絡(luò)中相互通信,并且要能夠接收從服務(wù)器發(fā)送來的應(yīng)答,提取服務(wù)器的時(shí)間并同步自己的時(shí)間,而服務(wù)器要能夠監(jiān)聽、響應(yīng)客戶方的同步請求,將自己的時(shí)間封裝在報(bào)文中發(fā)送給客戶方。為了方便客戶方能夠定時(shí)的與服務(wù)器同步時(shí)間,在本系統(tǒng)中增加了定時(shí)器的功能,定時(shí)器主要的功能是在設(shè)定的時(shí)間內(nèi)使客戶方主動的同步服務(wù)器的時(shí)間,避免了手動同步帶來的不便。系統(tǒng)應(yīng)能長期自動運(yùn)行,為使桌面簡潔,程序應(yīng)增加可最小化到托盤區(qū)的功能。3.2系統(tǒng)模型設(shè)計(jì)在這個(gè)C/S模式結(jié)構(gòu)中服務(wù)器功能模塊的主要作用是:(1)打開一個(gè)套接字socket(2)將套接字綁定到服務(wù)器的地址上(3)等待連接請求,做好接收連接請求的準(zhǔn)備(4)監(jiān)聽連接請求(5)如果連接請求到、則建立連接,連接建立后將服務(wù)器的時(shí)間發(fā)送給客戶端(6)數(shù)據(jù)交換完成后,關(guān)閉套接字客戶端功能模塊的主要作用:(1)打開一個(gè)套接字(2)發(fā)起連接請求(3)如果連接成功,向服務(wù)器發(fā)送同步時(shí)間的請求(4)根據(jù)服務(wù)器的時(shí)間同步自己的時(shí)間,并顯示出來(5)數(shù)據(jù)交換完成,關(guān)閉套接字3.3系統(tǒng)工作流程設(shè)計(jì)系統(tǒng)中客戶方與服務(wù)器從建立連接、發(fā)送同步請求到同步系統(tǒng)時(shí)間的流程如圖3-1所示:在整個(gè)時(shí)間同步過程中服務(wù)器必須要處于工作狀態(tài),時(shí)刻監(jiān)聽著網(wǎng)絡(luò)中客戶方的請求信息,監(jiān)聽到客戶方的時(shí)間同步請求時(shí),根據(jù)客戶方的需要,來進(jìn)行服務(wù)響應(yīng),客戶方在接收到服務(wù)器的響應(yīng)報(bào)文后,根據(jù)算服務(wù)器發(fā)送過來的時(shí)間,以及算出的網(wǎng)絡(luò)延時(shí)來同步系統(tǒng)的時(shí)間。圖3-1系統(tǒng)流程圖4系統(tǒng)實(shí)現(xiàn)4.1服務(wù)器端詳細(xì)設(shè)計(jì)服務(wù)器在整個(gè)系統(tǒng)中占有很重要的地位,負(fù)責(zé)建立套接字,綁定本地端口并監(jiān)聽?wèi)?yīng)客戶方發(fā)送的時(shí)間同步請求,最后對該請求進(jìn)行響應(yīng),在建立套接字時(shí)主要用到SOCKET函數(shù),原型為SOCKETsocket(intaf,,inttype,intprotocol);該函數(shù)的主要作用是創(chuàng)建一個(gè)能夠進(jìn)行網(wǎng)絡(luò)通信的套接字;對該端口進(jìn)行綁定用到bind()函數(shù),該函數(shù)的作用是通過給一個(gè)未命名套接口分配一個(gè)本地名字來為套接口建立本地捆綁(主機(jī)地址/端口號),對于客戶端的請求監(jiān)聽用函數(shù)listen(),原型為intlisten(SOCKETs,intbacklog);其作用是在套接字函數(shù)中表示讓一個(gè)套接字處于監(jiān)聽到來的連接請求的狀態(tài),最后對客戶方的請求進(jìn)行響應(yīng),用Send()函數(shù)來實(shí)現(xiàn),該函數(shù)的功能是向窗口發(fā)送指定的消息并立即執(zhí)行相應(yīng)的事件處理程序。在本系統(tǒng)中服務(wù)器要向客戶方發(fā)送三個(gè)時(shí)間,分別是:客戶方在請求時(shí)間同步時(shí)候客戶方的時(shí)間T1,服務(wù)器在服務(wù)器在接收到客戶方請求時(shí)間同步時(shí)的時(shí)間T2,以及服務(wù)器響應(yīng)客戶方時(shí)間同步請求的時(shí)間T3。服務(wù)器在得到這三個(gè)時(shí)間之后,會將它們按照順序存放在字符數(shù)組SSS中,然后發(fā)送給客戶方。4.2服務(wù)器端主要功能的設(shè)計(jì)與實(shí)現(xiàn)4.2.1服務(wù)器端通信的連接與建立要想在網(wǎng)絡(luò)中與客戶方進(jìn)行通信,首先必須通過SOCKET函數(shù)建立服務(wù)器端的通信SOCKET,有三種Socket,原始Socket(SOCK_RAW)、數(shù)據(jù)流Socket(SOCK_STREAM)、數(shù)據(jù)報(bào)Socket(SOCK_DGRAM),在本系統(tǒng)中,傳輸需要可靠的連接方式,因此采用數(shù)據(jù)流Socket連接方式:sockaddr_insaClient; SOCKETsockTemp=NULL;ASSERT(g_hSocket!=NULL); intnLengthAddr=sizeof(SOCKADDR);if((g_hSocket=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET) { AfxMessageBox("創(chuàng)建Socket失敗"); return; }通信必須要有地址,這時(shí)候就用到IP,接下來設(shè)置服務(wù)器端綁定的地址結(jié)構(gòu),采用INET協(xié)議族地址結(jié)構(gòu)sockaddr_in:sockaddr_insaServer; saServer.sin_family=AF_INET; saServer.sin_port=htons(CONNECE_PORT);//saServer.sin_addr.s_addr=htons(INADDR_ANY); saServer.sin_addr.s_addr=inet_addr("99");其中saServer.sin_family=AF_INET;表示該協(xié)議族支持多個(gè)地址族,saServer.sin_port=htons(CONNECE_PORT);表示采用本地的常用端口進(jìn)行通信,saServer.sin_addr.s_addr=inet_addr("99");表示設(shè)定服務(wù)器的地址為99,即服務(wù)器所在計(jì)算機(jī)的地址。設(shè)定完服務(wù)器的地址以后就要對其進(jìn)行綁定,利用bind函數(shù),方法如下://綁定地址 if(bind(g_hSocket,(sockaddr*)&saServer,sizeof(SOCKADDR))==SOCKET_ERROR) { AfxMessageBox("綁定地址失敗"); return; }綁定完成后,服務(wù)器就可以對網(wǎng)絡(luò)中的客戶方進(jìn)行時(shí)間同步請求監(jiān)聽:if(listen(g_hSocket,5)==SOCKET_ERROR) { AfxMessageBox("監(jiān)聽客戶端請求失敗"); return; } //啟動一線程來處理客戶端請求 AfxBeginThread(ServerThreadProc,0); //使開始按鈕變灰 GetDlgItem(IDC_START)->EnableWindow(FALSE); }當(dāng)服務(wù)器Listen函數(shù)監(jiān)聽到客戶方的時(shí)間同步請求時(shí),服務(wù)器調(diào)用線程處理客戶方的請求,并且使“開始”按鈕變灰,處理客戶方的請求。4.2.2所需時(shí)間的獲取及發(fā)送當(dāng)服務(wù)器在接收到客戶方的時(shí)間請求信息包時(shí),會將其中包含的時(shí)間T1分解出來charSSS[1000]="SetTime";strcat(SSS,sCommand+8);//得到客戶方發(fā)送連接請求的時(shí)間t1其中字符數(shù)組SSS是用來存放客戶方所需要的三個(gè)時(shí)間的,"SetTime"是用來通知客戶方同步本地時(shí)間的字符串,sCommand是存放客戶方發(fā)送過來的時(shí)間同步請求的信息,里面封裝著客戶方在發(fā)送同步請求時(shí)的系統(tǒng)時(shí)間T1,sCommand+8表示從數(shù)組的第八位開始存放的是時(shí)間T1。并將獲取的時(shí)間T1放入數(shù)組SSS中。服務(wù)器監(jiān)聽到客戶方的請求前利用GetLocalTime函數(shù)得到服務(wù)器的時(shí)間即T2,并將獲得的時(shí)間放入字符數(shù)組sBuff中:SYSTEMTIMEt2; charsBuff[256]; GetLocalTime(&t2); sprintf(sBuff,"%4d%2d%2d%2d%2d%2d", t2.wYear,t2.wMonth,t2.wDay,t2.wHour,t2.wMinute,t2.wSecond);strcat(SSS,sBuff); 其中t2.wYear,t2.wMonth,t2.wDay,tit2.wHour,t2.wMinute,t2.wSecond依次為服務(wù)器當(dāng)前時(shí)間的年、月、日、時(shí)、分秒再獲取這些時(shí)間后將時(shí)間T2依次放在T1的后面存入數(shù)組SSS中。同理可得到時(shí)間T3,然后用strcat(SSS,sBuff);將時(shí)間T3放在T2的后面存入數(shù)組SSS。在服務(wù)器得到這三個(gè)時(shí)間以后便通過send函數(shù)將其發(fā)送給客戶方具體代碼如下:intnBytesSent; if((nBytesSent=send(sockTemp,SSS,strlen(SSS),0))==SOCKET_ERROR) { AfxMessageBox("發(fā)送數(shù)據(jù)失敗"); return1; } }當(dāng)服務(wù)器對客戶方的的時(shí)間同步請求響應(yīng)完成以后,服務(wù)器在最后通信結(jié)束時(shí)會將之前建立好的套接字關(guān)閉,結(jié)束通信: //關(guān)閉Socket if(closesocket(sockTemp)==SOCKET_ERROR) { AfxMessageBox("關(guān)閉連接失敗"); sockTemp=NULL; return1; } return0;}4.2.3最小化程序到系統(tǒng)托盤的實(shí)現(xiàn)此外在服務(wù)器中增加了最小化系統(tǒng)托盤的作用即在運(yùn)行服務(wù)器方或者客戶方的程序時(shí),會在任務(wù)欄的最右方出現(xiàn)相關(guān)的圖標(biāo),表示程序正在運(yùn)行之中,當(dāng)要退出程序的時(shí)候,可以右鍵點(diǎn)擊圖標(biāo),此時(shí)會“退出”按鈕,左鍵單擊“退出”既可以退出程序?;静襟E如下:(1)添加消息響應(yīng)函數(shù)OnInitDialog(),這樣程序一啟動,就在托盤中顯示出了自己應(yīng)用程序的圖標(biāo)。主要代碼為://托盤顯示//m_nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);m_nid.hWnd=this->m_hWnd;m_nid.uID=IDR_MAINFRAME;m_nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;m_nid.uCallbackMessage=WM_SHOWTASK;//自定義的消息名稱m_nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));strcpy(m_nid.szTip,"服務(wù)器程序");//信息提示條為"服務(wù)器程序"Shell_NotifyIcon(NIM_ADD,&m_nid);//在托盤區(qū)添加圖標(biāo)在Dialog源文件中添加自定義的消息響應(yīng)代碼,代碼作用是:當(dāng)左鍵雙擊時(shí)在桌面上彈出應(yīng)用程序主窗口,右鍵單擊彈出關(guān)閉菜單,程序代碼如下:LRESULTCServerDlg::OnShowTask(WPARAMwParam,LPARAMlParam){if(wParam!=IDR_MAINFRAME)return1;switch(lParam){caseWM_RBUTTONUP://右鍵單擊時(shí)彈出菜單{LPPOINTlpoint=newtagPOINT;::GetCursorPos(lpoint);//得到鼠標(biāo)位置CMenumenu;menu.CreatePopupMenu();//聲明一個(gè)彈出式菜單menu.AppendMenu(MF_STRING,WM_DESTROY,"關(guān)閉");menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);HMENUhmenu=menu.Detach();menu.DestroyMenu();deletelpoint;}break;caseWM_LBUTTONDBLCLK://雙擊左鍵的處理{this->ShowWindow(SW_SHOWNORMAL);//顯示主窗口}break;}return0;}(3)添加OnSize消息響應(yīng)函數(shù),當(dāng)鼠標(biāo)左鍵點(diǎn)擊對話框最小化圖標(biāo)時(shí),會調(diào)用該函數(shù)隱藏主窗口:voidCServerDlg::OnSize(UINTnType,intcx,intcy){CDialog::OnSize(nType,cx,cy);//TODO:Addyourmessagehandlercodehereif(nType==SIZE_MINIMIZED){ShowWindow(SW_HIDE);//當(dāng)最小化時(shí),隱藏主窗口}}(4)添加關(guān)閉窗口時(shí)的消息響應(yīng)函數(shù):DestroyWindow(),在圖標(biāo)上單擊右鍵彈出關(guān)閉對話框,點(diǎn)擊會將托盤中的應(yīng)用程序圖標(biāo)刪除BOOLCServerDlg::DestroyWindow(){//TODO:Addyourspecializedcodehereand/orcallthebaseclass//在托盤區(qū)刪除圖標(biāo)Shell_NotifyIcon(NIM_DELETE,&m_nid);returnCDialog::DestroyWindow();}4.3客戶方詳細(xì)設(shè)計(jì)客戶方在本系統(tǒng)中向服務(wù)器發(fā)送時(shí)間同步請求,在獲得服務(wù)器方發(fā)送過來的時(shí)間包后,從數(shù)組中將時(shí)間提取出來,然后轉(zhuǎn)化成整形,算出網(wǎng)絡(luò)延時(shí),利用SetLocalTime函數(shù)同步系統(tǒng)的時(shí)間。4.3.1客戶方通信連接的建立客戶方要想和服務(wù)器進(jìn)行通信,發(fā)送時(shí)間同步請求,客戶方首先要能利用服務(wù)器的IP地址與服務(wù)器進(jìn)行連接,首先要定義客戶方接收服務(wù)器IP的Socket地址結(jié)構(gòu),代碼如下://設(shè)置客戶端要同步的服務(wù)器的sockaddr_in結(jié)構(gòu) Sockaddr_inm_ServerAddr;m_ServerAddr.sin_family=AF_INET;m_ServerAddr.sin_port=htons(CONNECE_PORT);m_ServerAddr.sin_addr.s_addr=inet_addr(strServer); m_hSocket=NULL;在這個(gè)結(jié)構(gòu)中定義了,服務(wù)器的地址協(xié)議族AF_INET、常用連接端口CONNECE_PORT、以及IP地址inet_addr(strServer);定義完要同步的服務(wù)器的sockaddr_in結(jié)構(gòu)后,就可以輸入服務(wù)器的IP地址進(jìn)行連接//得到服務(wù)器IP地址 BYTEb1,b2,b3,b4; m_ctrlServer.GetAddress(b1,b2,b3,b4);charstrServer[256]; memset(strServer,0,256); sprintf(strServer,"%d.%d.%d.%d",b1,b2,b3,b4);其中,m_ctrlServer表示程序界面中輸入IP的控件,用來獲取所輸入的服務(wù)器IP。因?yàn)镮P地址是三十二位的,分為四個(gè)字節(jié),每個(gè)字節(jié)占八位,所以定義了四個(gè)字節(jié)型變量b1,b2,b3,b4;來接收服務(wù)器的IP,完成這些以后就可以連接服務(wù)器了,//連接服務(wù)器ASSERT(m_hSocket!=NULL); if(connect(m_hSocket,(sockaddr*)&m_ServerAddr,sizeof(SOCKADDR))==SOCKET_ERROR) { AfxMessageBox("連接服務(wù)器失敗"); return; }4.3.2時(shí)間的接收與同步在與服務(wù)器建立連接以后,客戶方就可以向服務(wù)器發(fā)送時(shí)間同步請求,在發(fā)送之前會構(gòu)造一個(gè)消息命令串,該字符串的主要作用是提醒服務(wù)器,客戶方要進(jìn)行時(shí)間同步,這樣服務(wù)器在接收到該消息命令串以后就會將時(shí)間發(fā)送過來。//構(gòu)造消息命令串,表明客戶方要進(jìn)行時(shí)間同步 CStringstrMsg="GetTime";在構(gòu)造好這個(gè)命令消息字符串以后,客戶方還需要得到本地的時(shí)間(即T1),并添加在請求報(bào)文(即strMsg)中,一起發(fā)送給服務(wù)器來請求需要同步的時(shí)間, //向服務(wù)器端發(fā)送消息請求FD_SETfd={1,m_hSocket}; TIMEVALtv={TIME_OUT,0}; if(select(0,NULL,&fd,NULL,&tv)==0) { AfxMessageBox("發(fā)送超時(shí)"); return; } intnBytesSent; if((nBytesSent=send(m_hSocket,strMsg,nLen,0))==SOCKET_ERROR) { AfxMessageBox("發(fā)送數(shù)據(jù)失敗"); return; }當(dāng)數(shù)據(jù)成功發(fā)送以后,服務(wù)器會將客戶方所需要的時(shí)間發(fā)送過來,此時(shí)客戶方會利用recv函數(shù)進(jìn)行接收,//收取數(shù)據(jù) charm_pReadBuf[256]; //循環(huán)等待服務(wù)器的相應(yīng)消息 while(1){ //給接受數(shù)據(jù)緩沖區(qū)清零 memset(m_pReadBuf,0,256); if(select(0,&fd,NULL,NULL,&tv)==0) { AfxMessageBox("接受超時(shí)"); return; } //接收數(shù)據(jù) intnBytesReceived; if((nBytesReceived=recv(m_hSocket,m_pReadBuf,255,0))==SOCKET_ERROR) { AfxMessageBox("接受數(shù)據(jù)失敗"); return; } //如果接受到的數(shù)據(jù)長度大于0,則退出循環(huán),否則循環(huán)等待 if(nBytesReceived>0) break; };charstrCommand[9]; memset(strCommand,0,9); strncpy(strCommand,m_pReadBuf,8); if(strcmp(strCommand,"SetTime")==0) {inttemp=0; charsYear[5],sMonth[3],sDay[3],sHour[3],sMinute[3],sSecond[3]; memset(sYear,0,5); memset(sMonth,0,3); memset(sDay,0,3); memset(sHour,0,3); memset(sMinute,0,3); memset(sSecond,0,3);}由于在客戶方接收的字符數(shù)組中存放著三個(gè)時(shí)間T1、T2、T3,需要按照字符存放的順序依次提取出這三個(gè)時(shí)間,上面的代碼是用來提取時(shí)間T1的,T2、T3的提取與此類似就不再贅述。在這里客戶方定義了兩個(gè)字符數(shù)組,一個(gè)為m_pReadBuf,用來存儲服務(wù)器方發(fā)送過來的時(shí)間,另外一個(gè)strCommand,用來定義年、月、日、時(shí)、分、秒。在接收到這些時(shí)間以后,客戶方會利用strncpy函數(shù),來對從服務(wù)器發(fā)送來的時(shí)間進(jìn)行時(shí)間匹配即,將時(shí)間與年、月、日、時(shí)、分、秒相對應(yīng)起來,便于客戶方設(shè)置本機(jī)的時(shí)間此外,在客戶方收到服務(wù)器響應(yīng)的時(shí)候會用GetLocalTime函數(shù)得到當(dāng)時(shí)的時(shí)間T4,以及從服務(wù)器方發(fā)送過來的T1、T2、T3。這時(shí)便可以根據(jù)這四個(gè)時(shí)間來計(jì)算數(shù)據(jù)在網(wǎng)絡(luò)中傳輸過程中產(chǎn)生的網(wǎng)絡(luò)延時(shí),T=[(T2-T1)+(T4-T3)]/2。由于從數(shù)據(jù)包中得到的時(shí)間是字符型的,所以要將其轉(zhuǎn)化成整型的,便于客戶方設(shè)置自己的時(shí)間,//根據(jù)服務(wù)器發(fā)過來的時(shí)間數(shù)據(jù)設(shè)置本機(jī)時(shí)間 SYSTEMTIMEtime; time.wYear=atoi(sYear)+T; time.wMonth=atoi(sMonth)+T; time.wDay=atoi(sDay)+T; time.wHour=atoi(sHour)+T; time.wMinute=atoi(sMinute)+T; time.wSecond=atoi(sSecond)+T; time.wMilliseconds=0;time.wDayOfWeek=0;SetLocalTime(&time);其中atoi的作用便是將字符型轉(zhuǎn)化成整型。SetLocalTime按照客戶端系統(tǒng)所設(shè)置的時(shí)區(qū)設(shè)置本地系統(tǒng)時(shí)間,函數(shù)原型是voidSetLocalTime(LPSYSTEMTIMElpSystemTime//addressofsystemtimesstructure);lpSystemTime:指向一個(gè)用戶自定義包含日期和時(shí)間信息的類型為SYSTEMTIME的變量,該變量用來保存函數(shù)獲取的時(shí)間信息[12]。4.3.3最小化系統(tǒng)托盤的實(shí)現(xiàn)在客戶端程序中也加入了最小化托盤的作用,實(shí)現(xiàn)的步驟如下:(1)添加消息響應(yīng)函數(shù)OnInitDialog(),這樣程序一啟動,就在托盤中顯示出了自己應(yīng)用程序的圖標(biāo)。主要代碼為://托盤顯示//m_nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);m_nid.hWnd=this->m_hWnd;m_nid.uID=IDR_MAINFRAME;m_nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;m_nid.uCallbackMessage=WM_SHOWTASK;//自定義的消息名稱m_nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));strcpy(m_nid.szTip,"客戶方程序");//信息提示條為"服務(wù)器程序"Shell_NotifyIcon(NIM_ADD,&m_nid);//在托盤區(qū)添加圖標(biāo)在Dialog源文件中添加自定義的消息響應(yīng)代碼,代碼作用是:當(dāng)左鍵雙擊時(shí)在桌面上彈出應(yīng)用程序主窗口,右鍵單擊彈出關(guān)閉菜單,程序代碼如下:LRESULTCServerDlg::OnShowTask(WPARAMwParam,LPARAMlParam){if(wParam!=IDR_MAINFRAME)return1;switch(lParam){caseWM_RBUTTONUP://右鍵起來時(shí)彈出菜單{LPPOINTlpoint=newtagPOINT;::GetCursorPos(lpoint);//得到鼠標(biāo)位置CMenumenu;menu.CreatePopupMenu();//聲明一個(gè)彈出式菜單menu.AppendMenu(MF_STRING,WM_DESTROY,"關(guān)閉");menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);HMENUhmenu=menu.Detach();menu.DestroyMenu();deletelpoint;}break;caseWM_LBUTTONDBLCLK://雙擊左鍵的處理{this->ShowWindow(SW_SHOWNORMAL);//顯示主窗口}break;}return0;}(3)添加OnSize消息響應(yīng)函數(shù),當(dāng)鼠標(biāo)左鍵點(diǎn)擊對話框最小化圖標(biāo)時(shí),會調(diào)用該函數(shù)隱藏主窗口:voidCServerDlg::OnSize(UINTnType,intcx,intcy){CDialog::OnSize(nType,cx,cy);//TODO:Addyourmessagehandlercodehereif(nType==SIZE_MINIMIZED){ShowWindow(SW_HIDE);//當(dāng)最小化市,隱藏主窗口}}(4)添加關(guān)閉窗口時(shí)的消息響應(yīng)函數(shù):DestroyWindow(),在圖標(biāo)上單擊右鍵彈出關(guān)閉對話框,點(diǎn)擊會將托盤中的應(yīng)用程序圖標(biāo)刪除BOOLCServerDlg::DestroyWindow(){//TODO:Addyourspecializedcodehereand/orcallthebaseclass//在托盤區(qū)刪除圖標(biāo)Shell_NotifyIcon(NIM_DELETE,&m_nid);returnCDialog::DestroyWindow();}4.3.4定時(shí)器的設(shè)計(jì)與實(shí)現(xiàn)為使客戶端可以定時(shí)與服務(wù)器端進(jìn)行時(shí)間同步,在客戶端中加入了定時(shí)器。用函數(shù)SetTimer()來生成一個(gè)定時(shí)器,SetTimer這個(gè)API函數(shù)的原型為:UINT_PTRSetTimer(HWNDhWnd,UINT_PTRnIDEvent,UINTuElapse,TIMERPROClpTimerFunc);其中HWNDhWnd為窗口句柄,UINT_PTRnIDEvent,為定時(shí)器ID,多個(gè)定時(shí)器時(shí),可以通過該ID判斷是哪個(gè)定時(shí)器,UINTuElapse為時(shí)間間隔,單位為毫秒,TIMERPROClpTimerFunc為回調(diào)函數(shù)[13]。主要代碼如下:SetTimer(1,1000,NULL);//啟動定時(shí)器1CStringstrTime;CTimetm(time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond);strTime=tm.Format("%y年%m月%d日%X");//格式化系統(tǒng)時(shí)間m_TIME.SetWindowText(strTime);//初始化編輯框的顯示 SetTimer(2,1*60*1000,NULL);//啟動定時(shí)器2{ //TODO:Addyourmessagehandlercodehereand/orcalldefault if(nIDEvent==1) { CStringstrTime; CTimetm; tm=CTime::GetCurrentTime();strTime=tm.Format("%y年%m月%d日%X");//格式化系統(tǒng)時(shí)間m_TIME.SetWindowText(strTime);//編輯框動態(tài)顯示時(shí)間 } else//if(nIDEvent==2) { OnSynch(); }CDialog::OnTimer(nIDEvent);}其中SetTimer(1,1000,NULL);為定時(shí)器1,這個(gè)定時(shí)器的主要作用是動態(tài)的顯示出客戶方的當(dāng)前時(shí)間,SetTimer(2,15*60*1000,NULL);為定時(shí)器2,主要作用是每隔15分鐘,與服務(wù)器進(jìn)行一次時(shí)間同步。5系統(tǒng)測試與數(shù)據(jù)分析5.1檢測的方法系統(tǒng)測試是為了發(fā)現(xiàn)錯(cuò)誤而執(zhí)行程序的過程,成功的測試是發(fā)現(xiàn)了至今尚未發(fā)現(xiàn)的錯(cuò)誤的測試。測試的目的就是希望能以最少的人力和時(shí)間發(fā)現(xiàn)潛在的各種錯(cuò)誤和缺陷。系統(tǒng)測試是保證系統(tǒng)質(zhì)量和可靠性的關(guān)鍵步驟,是對系統(tǒng)開發(fā)過程中的系統(tǒng)分析系統(tǒng)設(shè)計(jì)和實(shí)施的最后復(fù)查。5.1.1

溫馨提示

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

評論

0/150

提交評論