版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、<p> 課題名稱: 實現(xiàn)網(wǎng)絡對時程序 </p><p> 院 (系): 計算機工程學院 </p><p> 專 業(yè): 通信工程 </p><p> 班 級: </p><p> 學生姓名:
2、 </p><p> 學 號: </p><p> 指導教師: </p><p> 2012年6月17日</p><p><b> 目錄</b></p><p
3、><b> 一、實驗軟件3</b></p><p><b> 二、設計內(nèi)容3</b></p><p><b> 三、設計原理4</b></p><p><b> 四、設計過程4</b></p><p> 五、程序代碼及測試分析5&
4、lt;/p><p><b> 1、服務器:5</b></p><p><b> 2、客戶端:7</b></p><p> 3、程序運行結(jié)果:9</p><p><b> 六、心得體會11</b></p><p><b> 七、參考
5、文獻11</b></p><p> 摘 要:本次課程設計以Visual C++ 6.0作為開發(fā)平臺,完成網(wǎng)絡對時服務系統(tǒng),系統(tǒng)分為服務器端和客戶端,客戶端能夠從服務器端取出標準時間,然后同步本機時鐘。通過實踐復習鞏固課堂所學的理論知識,也可以加強自己的實踐操作,提高對所學知識的綜合應用能力,同時也經(jīng)過課后的上網(wǎng)查資料,同學間的相互探討,逐步修改,完成了本系統(tǒng)的設計,設計基本上實現(xiàn)了設計所要求的功能
6、。</p><p> 一、實驗軟件(Visual C++ 6.0)</p><p> Visual C++ 6.0,簡稱VC或者VC6.0,是微軟推出的一款C++編譯器,將“高級語言”翻譯為“機器語言(低級語言)”的程序。Visual C++是一個功能強大的可視化軟件開發(fā)工具。Visual C++ 6.0對網(wǎng)絡編程的支持有socket支持,WinInet支持,MAPI和ISAPI支持等
7、。其中,Windows Sockets API是TCP/IP網(wǎng)絡環(huán)境里,也是Internet上進行開發(fā)最為通用的API。在TCP/IP網(wǎng)絡通信環(huán)境下,Socket數(shù)據(jù)傳輸是一種特殊的I/O,它也相當于一種文件描述符,具有一個類似于打開文件的函數(shù)調(diào)用Socket()。可以這樣理解:Socket實際上是一個通信端點,通過它,用戶的Socket程序可以通過網(wǎng)絡和其他的Socket應用程序通信。</p><p><
8、b> 二、設計內(nèi)容</b></p><p> 在局域網(wǎng)中有很多應用軟件為了協(xié)同工作,需要保證客戶機上時間統(tǒng)一,方法是客戶機從一個時間相對正確的服務器讀取時間,以此來校正本地時間。網(wǎng)絡對時系統(tǒng)分服務器端程序和客戶端程序。在服務器端程序需要達到以下功能:能夠接收局域網(wǎng)中任一臺客戶機的對時請求并準確向客戶機發(fā)送服務器端的時間和日期;客戶端程序要達到以下功能:能夠設定服務器的主機或者IP地址,能夠接
9、收服務器端發(fā)送的時間和日期信息并以此校正本地時間與服務器端的時間同步。</p><p> 按照C/S模型設計一個網(wǎng)絡對時服務系統(tǒng),系統(tǒng)分為服務器端(server)和客戶端(client)。服務器按照時間協(xié)議的要求(參考RFC-868),對發(fā)出對時請求的客戶端,以TCP/I P的格式返回響應??蛻舳烁鶕?jù)服務器端的返回值設計本地時間與服務器的時間同步。</p><p><b>
10、 三、設計原理</b></p><p> TCP/IP網(wǎng)絡對時服務系統(tǒng)客戶端和服務器原理主要分2個部分。服務器端創(chuàng)建套接監(jiān)聽字,并為它關(guān)聯(lián)一個本地地址(指定IP地址和端口),然后進入監(jiān)聽狀態(tài)準備接受客戶的連接請求,為客戶端的連接請求,服務器調(diào)用ACCEPT函數(shù)??蛻舳藙?chuàng)建套接字即可調(diào)用CONENET函數(shù)試圖連接服務器監(jiān)聽套接字,當服務器端的ACCEPT函數(shù)返回后,CONNECT函數(shù)也返回。此時客戶端
11、使用socket函數(shù)創(chuàng)建的套接字,雙方就可以通信了。</p><p> 服務器調(diào)用socket函數(shù)創(chuàng)建套接字server,調(diào)用bind綁定套接字到本地IP地址和端口,在端口監(jiān)聽并調(diào)用recvfrom函數(shù)接受客戶端的對時請求,并調(diào)用sendto函數(shù)發(fā)送服務器時間到客戶端,然后關(guān)閉套接字??蛻舳苏{(diào)用socket函數(shù)創(chuàng)建套接字client,調(diào)用sendto函數(shù)向服務器端發(fā)送對時請求,服務器端響應請求之后,客戶端調(diào)用r
12、ecvfrom函數(shù)從服務器端接收標準時間并設置本地時間與服務器端時間同步。</p><p><b> 四、設計過程 </b></p><p> 對時服務系統(tǒng)的基本結(jié)構(gòu)如圖:</p><p><b> 服務請求</b></p><p><b> 服務應答</b><
13、/p><p> 如上流程圖所示:服務器端調(diào)用socket函數(shù)創(chuàng)建套接字server,然后調(diào)用bind綁定套接字到本地IP地址和端口,在端口等待客戶端的對時請求并調(diào)用recvfrom函數(shù)接受客戶端的對時請求,并調(diào)用sendto函數(shù)發(fā)送服務器時間到客戶端,然后關(guān)閉服務器套接字server??蛻舳苏{(diào)用socket函數(shù)創(chuàng)建套接字client,然后調(diào)用sendto函數(shù)向服務器端發(fā)送對時請求,服務器端響應客戶端的對時請求之后,
14、調(diào)用sendto函數(shù)發(fā)送服務器時間到客戶端,然后客戶端調(diào)用recvfrom函數(shù)接收服務器端發(fā)送過來的響應,接收標準時間并設置本地時間與服務器端時間同步。</p><p> 五、程序代碼及測試分析</p><p><b> 1、服務器:</b></p><p> #pragma comment(lib,"ws2_32.lib&qu
15、ot;)</p><p> #include<winsock2.h></p><p> #include<stdio.h></p><p> #include<string.h></p><p> int main()</p><p><b> {</b&g
16、t;</p><p> WSADATA wsadata;</p><p> int err = WSAStartup(WINSOCK_VERSION,&wsadata);</p><p> if(err != 0)</p><p><b> {</b></p><p> prin
17、tf("WSAStartup() failed :%d\n",WSAGetLastError());</p><p> return -1;</p><p><b> }</b></p><p> SOCKET sock = socket(AF_INET,SOCK_STREAM,0);</p><p
18、> if(sock == INVALID_SOCKET)</p><p><b> {</b></p><p> printf("socket() failed:%d\n",WSAGetLastError());</p><p> WSACleanup();</p><p> retu
19、rn -1;</p><p><b> }</b></p><p> sockaddr_in localaddr; //用于發(fā)送數(shù)據(jù)的服務器的地址結(jié)構(gòu)</p><p> localaddr.sin_family = AF_INET;</p><p> localaddr.sin_port = htons(2000
20、0);</p><p> localaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //IP地址由系統(tǒng)指定使用當前配置的IP</p><p> err = bind(sock,(sockaddr *)&localaddr,sizeof(localaddr));</p><p> if(err == SOCK
21、ET_ERROR)</p><p><b> {</b></p><p> printf("bind() failed:%d\n",WSAGetLastError());</p><p> closesocket(sock);</p><p> WSACleanup();</p>
22、<p> return -1;</p><p><b> }</b></p><p> err=listen(sock,5);</p><p> if(err == SOCKET_ERROR)</p><p><b> {</b></p><p> p
23、rintf("listen() failed:%d\n",WSAGetLastError());</p><p> closesocket(sock);</p><p> WSACleanup();</p><p> return -1;</p><p><b> }</b></p>
24、;<p> sockaddr_in clientaddr;</p><p> int len = sizeof(clientaddr);</p><p><b> while(1)</b></p><p> {printf("------------------網(wǎng)絡對時服務系統(tǒng)歡迎您(通信092班 陳劍鋒)---
25、---------------\n\n");</p><p> printf("等待客戶端的對時請求……\n");</p><p> SOCKET sockconn = accept(sock,(sockaddr *)&clientaddr,&len);</p><p> if(sockconn == INVALI
26、D_SOCKET)</p><p><b> {</b></p><p> printf("accept() failed:%d\n",WSAGetLastError());</p><p> closesocket(sock);</p><p> WSACleanup();</p>
27、;<p> return -1;</p><p><b> }</b></p><p> printf("請求時間同步的客戶端為:%s Port:%d\n",inet_ntoa(clientaddr.sin_addr),clientaddr.sin_port);</p><p> char rbuf[1
28、024];</p><p><b> while(1)</b></p><p><b> {</b></p><p> memset(rbuf,0,1024);</p><p> int rb = recv(sockconn,rbuf,1024,0);</p><p>
29、; if(rb == SOCKET_ERROR)</p><p><b> {</b></p><p> printf("recv() failed:%d\n",WSAGetLastError());</p><p> closesocket(sockconn);</p><p><b&
30、gt; break;</b></p><p><b> }</b></p><p> if(rb == 0)</p><p><b> {</b></p><p> printf("Connection is closed.\n\n\n ");</p&
31、gt;<p> shutdown(sockconn,SD_SEND);</p><p> closesocket(sockconn);</p><p><b> break;</b></p><p><b> }</b></p><p> printf("服務器受到
32、[%d]的請求:%s\n",rb,rbuf);</p><p> SYSTEMTIME st; </p><p> GetLocalTime( &st ); </p><p> printf("服務器時間:%04d-%02d-%02d %02d:%02d:%02d\n",st.wYear,st.wMonth,st.wDay
33、,st.wHour,st.wMinute,st.wSecond);</p><p> int sb = send(sockconn,(char *)&st,sizeof(st),0);</p><p> if(sb == SOCKET_ERROR)</p><p><b> {</b></p><p>
34、printf("send() failed:%d\n",WSAGetLastError());</p><p> closesocket(sockconn);</p><p> WSACleanup();</p><p> return -1;</p><p><b> }</b></p
35、><p> printf("發(fā)送本地時間成功!!\n");</p><p><b> }</b></p><p><b> }</b></p><p> closesocket(sock);</p><p> WSACleanup();</p&
36、gt;<p><b> return 0;</b></p><p><b> }</b></p><p><b> 客戶端:</b></p><p> #pragma comment(lib,"ws2_32.lib")</p><p>
37、 #include<winsock2.h></p><p> #include<stdio.h></p><p> #include<string.h></p><p> #include <windows.h> </p><p> int main()</p><
38、p><b> { int m;</b></p><p><b> do{</b></p><p> WSADATA wsadata;</p><p> int err = WSAStartup(WINSOCK_VERSION,&wsadata);</p><p> print
39、f("------------------網(wǎng)絡對時服務系統(tǒng)歡迎您(通信092班 陳劍鋒)------------------\n\n");</p><p> if(err != 0)</p><p><b> {</b></p><p> printf("WSAStartup() 出錯:%d\n",
40、WSAGetLastError());</p><p> return -1;</p><p><b> }</b></p><p> SOCKET sock = socket(AF_INET,SOCK_STREAM,0);</p><p> if(sock == INVALID_SOCKET)</p>
41、;<p><b> {</b></p><p> printf("socket()出錯:%d\n",WSAGetLastError());</p><p> WSACleanup();</p><p> return -1;</p><p><b> }</b&
42、gt;</p><p> sockaddr_in serveraddr;</p><p> serveraddr.sin_family = AF_INET;</p><p> serveraddr.sin_port = htons(20000);</p><p> serveraddr.sin_addr.S_un.S_addr = i
43、net_addr("127.0.0.1");</p><p> err=connect(sock,(sockaddr *)&serveraddr,sizeof(serveraddr));</p><p> if(err == SOCKET_ERROR)</p><p><b> {</b></p>
44、<p> printf("connect()出錯:%d\n",WSAGetLastError());</p><p> closesocket(sock);</p><p> WSACleanup();</p><p> return -1;</p><p><b> }</b>
45、</p><p> char data[] = "客戶端請求時間同步!";</p><p> int sb = send(sock,data,strlen(data),0);</p><p> if(sb == SOCKET_ERROR)</p><p><b> {</b></p>
46、;<p> printf("send()出錯:%d\n",WSAGetLastError());</p><p> closesocket(sock);</p><p> WSACleanup();</p><p> return -1;</p><p><b> }</b>&
47、lt;/p><p> printf("已經(jīng)發(fā)送請求給服務器 %s\n",data,inet_ntoa(serveraddr.sin_addr));</p><p> shutdown(sock,SD_SEND);</p><p> SYSTEMTIME st,sp;</p><p> GetLocalTime(&
48、;sp);</p><p> printf("本地時間為:%04d-%02d-%02d%.2d:%.2d:%.2d \n",sp.wYear,sp.wMonth,sp.wDay,sp.wHour,sp.wMinute,sp.wSecond);</p><p><b> while(1)</b></p><p><b
49、> {</b></p><p> //memset(rbuf,0,1024);</p><p> int rb =recv(sock,(char *)&st,sizeof(st),0);</p><p> if(rb == SOCKET_ERROR)</p><p><b> {</b>
50、;</p><p> printf("recv()出錯:%d\n",WSAGetLastError());</p><p> closesocket(sock);</p><p> WSACleanup();</p><p> return -1;</p><p><b> }&
51、lt;/b></p><p><b> if(rb==0)</b></p><p> {printf("Connection is closed.\n\n");</p><p> shutdown(sock,SD_SEND);</p><p> closesocket(sock);<
52、;/p><p><b> break;</b></p><p><b> }</b></p><p> printf("獲取的服務器時間為:%04d-%02d-%02d %.2d:%.2d:%.2d \n", st.wYear,st.wMonth,st.wDay,st.wHour, st.wMinut
53、e, st.wSecond);</p><p> SetLocalTime(&st);</p><p> printf("修改本地時間成功,已與%s時間同步!\n\n",inet_ntoa(serveraddr.sin_addr));</p><p> printf("繼續(xù)請按(1),退出請按(0)\n");&l
54、t;/p><p> scanf("%d",&m);</p><p><b> }</b></p><p><b> }</b></p><p> while(m==1);</p><p><b> }</b></
55、p><p><b> 程序運行結(jié)果:</b></p><p> a、客戶端向服務器發(fā)送對時請求,若服務器還沒有打開,則客戶端顯示如下:</p><p> b、服務器打開運行之后,等待客戶端的對時請求,服務器顯示如下:</p><p> c、服務器打開運行之后,接受客戶端的對時請求,服務器顯示如下:</p>
56、<p> d、服務器應答后客戶端顯示如下:</p><p> e、按(1)刷新時間,服務器與客戶端顯示如下:</p><p><b> 六、心得體會</b></p><p> 通過本次課程設計,加深了對網(wǎng)絡程序課程知識的認知,進一步鞏固了課堂上所學習的理論知識,也可以加強自己的實踐操作,提高對所學知識的綜合應用能力。同時也
57、加強了同學之間知識的交流,取長補短。但是也認識到了自己各方面上的不足,比如說,理論知識不夠牢固,一旦遇到實際操作,往往都會手忙腳亂,一些比較概念化的知識也要翻書才能確定,有時候遇到調(diào)試出錯,而又無法找出錯誤時,會心煩意亂,一度想過放棄??傊?,在課程設計過程中,收獲知識,提高能力的同時,我也懂得怎么樣去制定計劃,怎么樣去實現(xiàn)這個計劃,并掌握了在執(zhí)行過程中怎么樣去克服心理上的不良情緒。因此在以后的生活和學習的過程中,我一定會把課程設計的精神
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java課程設計--簡單的網(wǎng)絡聊天程序
- mfc聊天軟件課程設計---網(wǎng)絡聊天程序設計
- mfc聊天軟件課程設計---網(wǎng)絡聊天程序設計
- 網(wǎng)絡程序設計linux服務器課程設計報告
- 課程設計一個簡單的網(wǎng)絡聊天程序
- 高?!毒W(wǎng)絡程序設計》網(wǎng)絡課程的建設
- 計算機網(wǎng)絡基礎課程設計--ping程序的實現(xiàn)
- 綜合程序課程設計--音頻播放程序的設計與實現(xiàn)
- 網(wǎng)絡安全課程設計---基于des加密的聊天程序
- 網(wǎng)絡編程課程設計-簡單的聊天室程序設計
- 網(wǎng)絡編程課程設計-簡單的聊天室程序設計
- 網(wǎng)絡通信winsock課程設計--ip地址管理程序
- 樂曲程序的設計與實現(xiàn)---課程設計
- 課程設計---ping程序設計與實現(xiàn)
- 基于java的簡易網(wǎng)絡聊天程序-計算機網(wǎng)絡課程設計
- tracer程序課程設計
- 網(wǎng)絡程序設計
- 網(wǎng)絡程序設計
- 計算機網(wǎng)絡課程設計--基于tcpip協(xié)議的網(wǎng)絡監(jiān)聽程序設計
- 課程設計--unix程序設計課程設計
評論
0/150
提交評論