《网络程序课程设计(共12页).doc》由会员分享,可在线阅读,更多相关《网络程序课程设计(共12页).doc(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上 网络程序课程设计说明书设计题目: 网络对时服务系统课程名称: 网络程序设计任课教员: 系别: 专业: 通 信 工 程班级: 学号: 姓名: 20_年9月4日目录一、摘 要为了能够综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以Visual C+ 6.0作为开发平台,通过实践复习巩固课堂所学的理论知识,也可以加强自己的实践操作,提高对所学知识的综合应用能力。本课程设计要完成的是网络对时服务系统,系统分为服务器端和客户端,客户端能够从服务器端取出标准时间,然后同步本机时钟。通过对课堂的理论学习,课后的上网查资料,同学间的相互探讨,逐步修改,完成本系统的
2、设计,设计基本上实现了设计所要求的功能。二、开发平台说明Visual Studio 2005是MISCROSOFT公司推出的新一代可视化的开发工具,是世界上最优秀的面向对象编程环境之一,它的以MFC应用程序为基础的编程方法将编程环境提供的代码和资源编译器,编译器,连接,调试器,appwizard,classwizard,browser等不同编程阶段使用的工具天衣无缝地结合在一起,大大的提高了代码编程的自动化程度,使得编程工作简洁而有效。它具有开发过程简明,开发方式灵活,扩展性强特点,是一种广泛使用的前端开发平台。它提供多种多样的网络编程技术,例如winsock,winlnet,activex,
3、dcom,atl等,为用户开发网络应用程序提供全方位的支持。其中,Windows Sockets API是TCP/IP网络环境里,也是Internet上进行开发最为通用的API。在TCP/IP网络通信环境下,Socket数据传输是一种特殊的I/O,它也相当于一种文件描述符,具有一个类似于打开文件的函数调用-socket()。可以这样理解:Socket实际上是一个通信端点,通过它,用户的Socket程序可以通过网络和其他的Socket应用程序通信。Socket存在于一个通信域(为描述一般的线程如何通过Socket进行通信而引入的一种抽象概念)里,并且与另一个域的Socket交换数据。Socket
4、有三类。SOCK_DGRAM(数据报),提供无连接不可靠的通信。三、课程设计内容在局域网中有很多应用软件为了协同工作,需要保证客户机上时间统一,方法是客户机从一个时间相对正确的服务器读取时间,以此来校正本地时间。网络对时系统分服务器端程序和客户端程序。在服务器端程序需要达到以下功能:能够接收局域网中任一台客户机的对时请求并准确向客户机发送服务器端的时间和日期;客户端程序要达到以下功能:能够设定服务器的主机或者IP地址,能够接收服务器端发送的时间和日期信息并以此校正本地时间与服务器端的时间同步。按照C/S模型设计一个网络对时服务系统,系统分为服务器端(server)和客户端(client)。服务
5、器按照时间协议的要求(参考RFC-868),对发出对时请求的客户端,以TCP/I P的格式返回响应。客户端根据服务器端的返回值设计本地时间与服务器的时间同步。四、课程设计原理TCP/IP网络对时服务系统客户端和服务器原理主要分2个部分。服务器端创建套接监听字,并为它关联一个本地地址(指定IP地址和端口),然后进入监听状态准备接受客户的连接请求,为客户端的连接请求,服务器调用ACCEPT函数。客户端创建套接字即可调用CONENET函数试图连接服务器监听套接字,当服务器端的ACCEPT函数返回后,CONNECT函数也返回。此时客户端使用socket函数创建的套接字,双方就可以通信了。服务器调用so
6、cket函数创建套接字server,调用bind绑定套接字到本地IP地址和端口,在端口监听并调用recvfrom函数接受客户端的对时请求,并调用sendto函数发送服务器时间到客户端,然后关闭套接字。客户端调用socket函数创建套接字client,调用sendto函数向服务器端发送对时请求,服务器端响应请求之后,客户端调用recvfrom函数从服务器端接收标准时间并设置本地时间与服务器端时间同步。五、课题设计过程 对时服务系统的基本结构如图:socket()创建数据报套接字clientsocket()创建数据报套接字serverbind()与本地地址绑定在20000端口等待客户端对时请求se
7、ndto()发送数据报对时请求Recvfrom()接收客户端请求 服务请求Recvfrom()接收服务器数据报sendto()发送数据报 服务应答close()关闭套接字clientclose()关闭套接字server如上流程图所示:控制机调用socket函数创建套接字server,然后调用bind绑定套接字到本地IP地址和端口,在端口等待工作站端的对时请求并调用recvfrom函数接受工作站端的对时请求,并调用sendto函数发送控制机时间到工作站端,然后关闭控制机套接字server。工作站端调用socket函数创建套接字client,然后调用sendto函数向控制机发送对时请求,控制机响应
8、工作站端的对时请求之后,调用sendto函数发送控制机时间到工作站端,然后工作站端调用recvfrom函数接收控制机发送过来的响应,接收标准时间并设置本地时间与控制机时间同步。六、程序代码及测试分析1、控制机:#pragma comment(lib,ws2_32.lib)#include#include#includeint main()WSADATA wsadata;int err = WSAStartup(WINSOCK_VERSION,&wsadata);if(err != 0)printf(WSAStartup() failed :%dn,WSAGetLastError();retur
9、n -1;SOCKET sock = socket(AF_INET,SOCK_STREAM,0);if(sock = INVALID_SOCKET)printf(socket() failed:%dn,WSAGetLastError();WSACleanup();return -1;sockaddr_in localaddr; /用于发送数据的服务器的地址结构localaddr.sin_family = AF_INET;localaddr.sin_port = htons(20000);localaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); /I
10、P地址由系统指定使用当前配置的IPerr = bind(sock,(sockaddr *)&localaddr,sizeof(localaddr);if(err = SOCKET_ERROR)printf(bind() failed:%dn,WSAGetLastError();closesocket(sock);WSACleanup();return -1;err=listen(sock,5);if(err = SOCKET_ERROR)printf(listen() failed:%dn,WSAGetLastError();closesocket(sock);WSACleanup();ret
11、urn -1;sockaddr_in clientaddr;int len = sizeof(clientaddr);while(1)printf(正在等待工作站发送同步请求:n);SOCKET sockconn = accept(sock,(sockaddr *)&clientaddr,&len);if(sockconn = INVALID_SOCKET)printf(accept() failed:%dn,WSAGetLastError();closesocket(sock);WSACleanup();return -1;printf(请求时间同步的客户机为:%s Port:%dn,ine
12、t_ntoa(clientaddr.sin_addr),clientaddr.sin_port);char rbuf1024;while(1)memset(rbuf,0,1024);int rb = recv(sockconn,rbuf,1024,0);if(rb = SOCKET_ERROR)printf(recv() failed:%dn,WSAGetLastError();closesocket(sockconn);break;if(rb = 0)printf(Connection is closed.n );shutdown(sockconn,SD_SEND);closesocket(
13、sockconn);break;printf(服务器受到%d的请求:%sn,rb,rbuf);SYSTEMTIME st; GetLocalTime( &st ); printf(服务器时间:%04d-%02d-%02d %02d:%02d:%02dn,st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);int sb = send(sockconn,(char *)&st,sizeof(st),0);if(sb = SOCKET_ERROR)printf(send() failed:%dn,WSAGetLastError();c
14、losesocket(sockconn);WSACleanup();return -1;printf(发送本地时间成功!n);closesocket(sock);WSACleanup();return 0;2、工作站端:#pragma comment(lib,ws2_32.lib)#include#include#include#include int main()WSADATA wsadata;int err = WSAStartup(WINSOCK_VERSION,&wsadata);if(err != 0)printf(WSAStartup() 出错:%dn,WSAGetLastErro
15、r();return -1;SOCKET sock = socket(AF_INET,SOCK_STREAM,0);if(sock = INVALID_SOCKET)printf(socket()出错:%dn,WSAGetLastError();WSACleanup();return -1;sockaddr_in serveraddr;serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(20000);serveraddr.sin_addr.S_un.S_addr = inet_addr(127.0.0.1);err=conne
16、ct(sock,(sockaddr *)&serveraddr,sizeof(serveraddr);if(err = SOCKET_ERROR)printf(connect()出错:%dn,WSAGetLastError();closesocket(sock);WSACleanup();return -1;char data = 客户机请求时间同步!;int sb = send(sock,data,strlen(data),0);if(sb = SOCKET_ERROR)printf(send()出错:%dn,WSAGetLastError();closesocket(sock);WSACl
17、eanup();return -1;printf(已经发送请求给服务器 %sn,data,inet_ntoa(serveraddr.sin_addr);shutdown(sock,SD_SEND);SYSTEMTIME st,sp;GetLocalTime(&sp); printf(本地时间为:%04d-%02d-%02d %.2d:%.2d:%.2d n,sp.wYear,sp.wMonth,sp.wDay,sp.wHour,sp.wMinute,sp.wSecond);while(1)/memset(rbuf,0,1024);int rb =recv(sock,(char *)&st,si
18、zeof(st),0);if(rb = SOCKET_ERROR)printf(recv()出错:%dn,WSAGetLastError();closesocket(sock);WSACleanup();return -1;if(rb = 0)printf(Connection is closed.nn);shutdown(sock,SD_SEND);closesocket(sock);break;printf(获取的服务器时间为:%04d-%02d-%02d %.2d:%.2d:%.2d n, st.wYear,st.wMonth,st.wDay,st.wHour, st.wMinute,
19、st.wSecond);SetLocalTime(&st);printf(修改本地时间成功,已与%s时间同步!n,inet_ntoa(serveraddr.sin_addr);closesocket(sock);WSACleanup();return 0;3、调试分析过程描述:a、工作站端向控制机发送对时请求,若控制机还没有打开,则工作站端显示如下:b、控制机打开运行之后,等待工作站端的对时请求,控制机显示如下:c、控制机打开运行之后,接受工作站端的对时请求,控制机显示如下:d、控制机应答后工作站端显示如下:七、心得体会在设计过程中发现了自己在各方面的不足,特别是在理解课本里的理论知识方面更为
20、突出,到自己真正动手做的时候,发现自己的知识是这么缺乏,有很多的知识是在做该系统时才深入理解的。在调试添加代码过程中遇到很多问题,就是一个小小的失误也会出很多错误。一步步的调试找出错误,通过和同学的互相探讨,问题逐步解决。通过本设计进一步巩固了课堂上所学习的理论知识,也可以加强自己的实践操作,提高对所学知识的综合应用能力。总的来说通过本次实验,我学习到了许多东西,增强了一定的实践能力。课程设计过程中我们一边设计一边探索,发现理论和实践要充分地结合,是需要扎实的基本功的,这就表明学好基础知识是理论付诸实践的前提。希望在以后我们能充分利用实习的机会充实自己,并希望有更多的这样的实践机会。八、参考文献1 叶树华 编著,网络编程实用教程(第2版),人民邮电出版社,2010.22 吴英 编著, 计算机网络应用软件编程技术,机械工业出版社,2010.63 任泰明 编著,TCP/IP协议与网络编程,西安电子科技大学出版社,2009.44 张立科 编著,Visual C+6.0网络编程技术,人民邮电出版社,2000.1专心-专注-专业