版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課題名稱(chēng): 實(shí)現(xiàn)網(wǎng)絡(luò)對(duì)時(shí)程序 </p><p> 院 (系): 計(jì)算機(jī)工程學(xué)院 </p><p> 專(zhuān) 業(yè): 通信工程 </p><p> 班 級(jí): </p><p> 學(xué)生姓名:
2、 </p><p> 學(xué) 號(hào): </p><p> 指導(dǎo)教師: </p><p> 2012年6月17日</p><p><b> 目錄</b></p><p
3、><b> 一、實(shí)驗(yàn)軟件3</b></p><p><b> 二、設(shè)計(jì)內(nèi)容3</b></p><p><b> 三、設(shè)計(jì)原理4</b></p><p><b> 四、設(shè)計(jì)過(guò)程4</b></p><p> 五、程序代碼及測(cè)試分析5&
4、lt;/p><p><b> 1、服務(wù)器:5</b></p><p><b> 2、客戶(hù)端:7</b></p><p> 3、程序運(yùn)行結(jié)果:9</p><p><b> 六、心得體會(huì)11</b></p><p><b> 七、參考
5、文獻(xiàn)11</b></p><p> 摘 要:本次課程設(shè)計(jì)以Visual C++ 6.0作為開(kāi)發(fā)平臺(tái),完成網(wǎng)絡(luò)對(duì)時(shí)服務(wù)系統(tǒng),系統(tǒng)分為服務(wù)器端和客戶(hù)端,客戶(hù)端能夠從服務(wù)器端取出標(biāo)準(zhǔn)時(shí)間,然后同步本機(jī)時(shí)鐘。通過(guò)實(shí)踐復(fù)習(xí)鞏固課堂所學(xué)的理論知識(shí),也可以加強(qiáng)自己的實(shí)踐操作,提高對(duì)所學(xué)知識(shí)的綜合應(yīng)用能力,同時(shí)也經(jīng)過(guò)課后的上網(wǎng)查資料,同學(xué)間的相互探討,逐步修改,完成了本系統(tǒng)的設(shè)計(jì),設(shè)計(jì)基本上實(shí)現(xiàn)了設(shè)計(jì)所要求的功能
6、。</p><p> 一、實(shí)驗(yàn)軟件(Visual C++ 6.0)</p><p> Visual C++ 6.0,簡(jiǎn)稱(chēng)VC或者VC6.0,是微軟推出的一款C++編譯器,將“高級(jí)語(yǔ)言”翻譯為“機(jī)器語(yǔ)言(低級(jí)語(yǔ)言)”的程序。Visual C++是一個(gè)功能強(qiáng)大的可視化軟件開(kāi)發(fā)工具。Visual C++ 6.0對(duì)網(wǎng)絡(luò)編程的支持有socket支持,WinInet支持,MAPI和ISAPI支持等
7、。其中,Windows Sockets API是TCP/IP網(wǎng)絡(luò)環(huán)境里,也是Internet上進(jìn)行開(kāi)發(fā)最為通用的API。在TCP/IP網(wǎng)絡(luò)通信環(huán)境下,Socket數(shù)據(jù)傳輸是一種特殊的I/O,它也相當(dāng)于一種文件描述符,具有一個(gè)類(lèi)似于打開(kāi)文件的函數(shù)調(diào)用Socket()??梢赃@樣理解:Socket實(shí)際上是一個(gè)通信端點(diǎn),通過(guò)它,用戶(hù)的Socket程序可以通過(guò)網(wǎng)絡(luò)和其他的Socket應(yīng)用程序通信。</p><p><
8、b> 二、設(shè)計(jì)內(nèi)容</b></p><p> 在局域網(wǎng)中有很多應(yīng)用軟件為了協(xié)同工作,需要保證客戶(hù)機(jī)上時(shí)間統(tǒng)一,方法是客戶(hù)機(jī)從一個(gè)時(shí)間相對(duì)正確的服務(wù)器讀取時(shí)間,以此來(lái)校正本地時(shí)間。網(wǎng)絡(luò)對(duì)時(shí)系統(tǒng)分服務(wù)器端程序和客戶(hù)端程序。在服務(wù)器端程序需要達(dá)到以下功能:能夠接收局域網(wǎng)中任一臺(tái)客戶(hù)機(jī)的對(duì)時(shí)請(qǐng)求并準(zhǔn)確向客戶(hù)機(jī)發(fā)送服務(wù)器端的時(shí)間和日期;客戶(hù)端程序要達(dá)到以下功能:能夠設(shè)定服務(wù)器的主機(jī)或者IP地址,能夠接
9、收服務(wù)器端發(fā)送的時(shí)間和日期信息并以此校正本地時(shí)間與服務(wù)器端的時(shí)間同步。</p><p> 按照C/S模型設(shè)計(jì)一個(gè)網(wǎng)絡(luò)對(duì)時(shí)服務(wù)系統(tǒng),系統(tǒng)分為服務(wù)器端(server)和客戶(hù)端(client)。服務(wù)器按照時(shí)間協(xié)議的要求(參考RFC-868),對(duì)發(fā)出對(duì)時(shí)請(qǐng)求的客戶(hù)端,以TCP/I P的格式返回響應(yīng)??蛻?hù)端根據(jù)服務(wù)器端的返回值設(shè)計(jì)本地時(shí)間與服務(wù)器的時(shí)間同步。</p><p><b>
10、 三、設(shè)計(jì)原理</b></p><p> TCP/IP網(wǎng)絡(luò)對(duì)時(shí)服務(wù)系統(tǒng)客戶(hù)端和服務(wù)器原理主要分2個(gè)部分。服務(wù)器端創(chuàng)建套接監(jiān)聽(tīng)字,并為它關(guān)聯(lián)一個(gè)本地地址(指定IP地址和端口),然后進(jìn)入監(jiān)聽(tīng)狀態(tài)準(zhǔn)備接受客戶(hù)的連接請(qǐng)求,為客戶(hù)端的連接請(qǐng)求,服務(wù)器調(diào)用ACCEPT函數(shù)。客戶(hù)端創(chuàng)建套接字即可調(diào)用CONENET函數(shù)試圖連接服務(wù)器監(jiān)聽(tīng)套接字,當(dāng)服務(wù)器端的ACCEPT函數(shù)返回后,CONNECT函數(shù)也返回。此時(shí)客戶(hù)端
11、使用socket函數(shù)創(chuàng)建的套接字,雙方就可以通信了。</p><p> 服務(wù)器調(diào)用socket函數(shù)創(chuàng)建套接字server,調(diào)用bind綁定套接字到本地IP地址和端口,在端口監(jiān)聽(tīng)并調(diào)用recvfrom函數(shù)接受客戶(hù)端的對(duì)時(shí)請(qǐng)求,并調(diào)用sendto函數(shù)發(fā)送服務(wù)器時(shí)間到客戶(hù)端,然后關(guān)閉套接字??蛻?hù)端調(diào)用socket函數(shù)創(chuàng)建套接字client,調(diào)用sendto函數(shù)向服務(wù)器端發(fā)送對(duì)時(shí)請(qǐng)求,服務(wù)器端響應(yīng)請(qǐng)求之后,客戶(hù)端調(diào)用r
12、ecvfrom函數(shù)從服務(wù)器端接收標(biāo)準(zhǔn)時(shí)間并設(shè)置本地時(shí)間與服務(wù)器端時(shí)間同步。</p><p><b> 四、設(shè)計(jì)過(guò)程 </b></p><p> 對(duì)時(shí)服務(wù)系統(tǒng)的基本結(jié)構(gòu)如圖:</p><p><b> 服務(wù)請(qǐng)求</b></p><p><b> 服務(wù)應(yīng)答</b><
13、/p><p> 如上流程圖所示:服務(wù)器端調(diào)用socket函數(shù)創(chuàng)建套接字server,然后調(diào)用bind綁定套接字到本地IP地址和端口,在端口等待客戶(hù)端的對(duì)時(shí)請(qǐng)求并調(diào)用recvfrom函數(shù)接受客戶(hù)端的對(duì)時(shí)請(qǐng)求,并調(diào)用sendto函數(shù)發(fā)送服務(wù)器時(shí)間到客戶(hù)端,然后關(guān)閉服務(wù)器套接字server??蛻?hù)端調(diào)用socket函數(shù)創(chuàng)建套接字client,然后調(diào)用sendto函數(shù)向服務(wù)器端發(fā)送對(duì)時(shí)請(qǐng)求,服務(wù)器端響應(yīng)客戶(hù)端的對(duì)時(shí)請(qǐng)求之后,
14、調(diào)用sendto函數(shù)發(fā)送服務(wù)器時(shí)間到客戶(hù)端,然后客戶(hù)端調(diào)用recvfrom函數(shù)接收服務(wù)器端發(fā)送過(guò)來(lái)的響應(yīng),接收標(biāo)準(zhǔn)時(shí)間并設(shè)置本地時(shí)間與服務(wù)器端時(shí)間同步。</p><p> 五、程序代碼及測(cè)試分析</p><p><b> 1、服務(wù)器:</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ù)的服務(wù)器的地址結(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)指定使用當(dā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)絡(luò)對(duì)時(shí)服務(wù)系統(tǒng)歡迎您(通信092班 陳劍鋒)---
25、---------------\n\n");</p><p> printf("等待客戶(hù)端的對(duì)時(shí)請(qǐng)求……\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("請(qǐng)求時(shí)間同步的客戶(hù)端為:%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("服務(wù)器受到
32、[%d]的請(qǐng)求:%s\n",rb,rbuf);</p><p> SYSTEMTIME st; </p><p> GetLocalTime( &st ); </p><p> printf("服務(wù)器時(shí)間:%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ā)送本地時(shí)間成功!!\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> 客戶(hù)端:</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)絡(luò)對(duì)時(shí)服務(wù)系統(tǒng)歡迎您(通信092班 陳劍鋒)------------------\n\n");</p><p> if(err != 0)</p><p><b> {</b></p><p> printf("WSAStartup() 出錯(cuò):%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()出錯(cuò):%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()出錯(cuò):%d\n",WSAGetLastError());</p><p> closesocket(sock);</p><p> WSACleanup();</p><p> return -1;</p><p><b> }</b>
45、</p><p> char data[] = "客戶(hù)端請(qǐng)求時(shí)間同步!";</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()出錯(cuò):%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ā)送請(qǐng)求給服務(wù)器 %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("本地時(shí)間為:%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()出錯(cuò):%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("獲取的服務(wù)器時(shí)間為:%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("修改本地時(shí)間成功,已與%s時(shí)間同步!\n\n",inet_ntoa(serveraddr.sin_addr));</p><p> printf("繼續(xù)請(qǐng)按(1),退出請(qǐng)按(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> 程序運(yùn)行結(jié)果:</b></p><p> a、客戶(hù)端向服務(wù)器發(fā)送對(duì)時(shí)請(qǐng)求,若服務(wù)器還沒(méi)有打開(kāi),則客戶(hù)端顯示如下:</p><p> b、服務(wù)器打開(kāi)運(yùn)行之后,等待客戶(hù)端的對(duì)時(shí)請(qǐng)求,服務(wù)器顯示如下:</p><p> c、服務(wù)器打開(kāi)運(yùn)行之后,接受客戶(hù)端的對(duì)時(shí)請(qǐng)求,服務(wù)器顯示如下:</p>
56、<p> d、服務(wù)器應(yīng)答后客戶(hù)端顯示如下:</p><p> e、按(1)刷新時(shí)間,服務(wù)器與客戶(hù)端顯示如下:</p><p><b> 六、心得體會(huì)</b></p><p> 通過(guò)本次課程設(shè)計(jì),加深了對(duì)網(wǎng)絡(luò)程序課程知識(shí)的認(rèn)知,進(jìn)一步鞏固了課堂上所學(xué)習(xí)的理論知識(shí),也可以加強(qiáng)自己的實(shí)踐操作,提高對(duì)所學(xué)知識(shí)的綜合應(yīng)用能力。同時(shí)也
57、加強(qiáng)了同學(xué)之間知識(shí)的交流,取長(zhǎng)補(bǔ)短。但是也認(rèn)識(shí)到了自己各方面上的不足,比如說(shuō),理論知識(shí)不夠牢固,一旦遇到實(shí)際操作,往往都會(huì)手忙腳亂,一些比較概念化的知識(shí)也要翻書(shū)才能確定,有時(shí)候遇到調(diào)試出錯(cuò),而又無(wú)法找出錯(cuò)誤時(shí),會(huì)心煩意亂,一度想過(guò)放棄??傊谡n程設(shè)計(jì)過(guò)程中,收獲知識(shí),提高能力的同時(shí),我也懂得怎么樣去制定計(jì)劃,怎么樣去實(shí)現(xiàn)這個(gè)計(jì)劃,并掌握了在執(zhí)行過(guò)程中怎么樣去克服心理上的不良情緒。因此在以后的生活和學(xué)習(xí)的過(guò)程中,我一定會(huì)把課程設(shè)計(jì)的精神
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- java課程設(shè)計(jì)--簡(jiǎn)單的網(wǎng)絡(luò)聊天程序
- mfc聊天軟件課程設(shè)計(jì)---網(wǎng)絡(luò)聊天程序設(shè)計(jì)
- mfc聊天軟件課程設(shè)計(jì)---網(wǎng)絡(luò)聊天程序設(shè)計(jì)
- 網(wǎng)絡(luò)程序設(shè)計(jì)linux服務(wù)器課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)聊天程序
- 高?!毒W(wǎng)絡(luò)程序設(shè)計(jì)》網(wǎng)絡(luò)課程的建設(shè)
- 計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)課程設(shè)計(jì)--ping程序的實(shí)現(xiàn)
- 綜合程序課程設(shè)計(jì)--音頻播放程序的設(shè)計(jì)與實(shí)現(xiàn)
- 網(wǎng)絡(luò)安全課程設(shè)計(jì)---基于des加密的聊天程序
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-簡(jiǎn)單的聊天室程序設(shè)計(jì)
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-簡(jiǎn)單的聊天室程序設(shè)計(jì)
- 網(wǎng)絡(luò)通信winsock課程設(shè)計(jì)--ip地址管理程序
- 樂(lè)曲程序的設(shè)計(jì)與實(shí)現(xiàn)---課程設(shè)計(jì)
- 課程設(shè)計(jì)---ping程序設(shè)計(jì)與實(shí)現(xiàn)
- 基于java的簡(jiǎn)易網(wǎng)絡(luò)聊天程序-計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- tracer程序課程設(shè)計(jì)
- 網(wǎng)絡(luò)程序設(shè)計(jì)
- 網(wǎng)絡(luò)程序設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)--基于tcpip協(xié)議的網(wǎng)絡(luò)監(jiān)聽(tīng)程序設(shè)計(jì)
- 課程設(shè)計(jì)--unix程序設(shè)計(jì)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論