网络程序课程设计网络对时.docx

上传人:b****5 文档编号:5908014 上传时间:2023-01-02 格式:DOCX 页数:12 大小:315.74KB
下载 相关 举报
网络程序课程设计网络对时.docx_第1页
第1页 / 共12页
网络程序课程设计网络对时.docx_第2页
第2页 / 共12页
网络程序课程设计网络对时.docx_第3页
第3页 / 共12页
网络程序课程设计网络对时.docx_第4页
第4页 / 共12页
网络程序课程设计网络对时.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

网络程序课程设计网络对时.docx

《网络程序课程设计网络对时.docx》由会员分享,可在线阅读,更多相关《网络程序课程设计网络对时.docx(12页珍藏版)》请在冰豆网上搜索。

网络程序课程设计网络对时.docx

网络程序课程设计网络对时

 

课题名称:

实现网络对时程序

院(系):

计算机工程学院

专业:

通信工程

班级:

学生姓名:

学号:

指导教师:

 

2012年6月17日

 

 

摘要:

本次课程设计以VisualC++6.0作为开发平台,完成网络对时服务系统,系统分为服务器端和客户端,客户端能够从服务器端取出标准时间,然后同步本机时钟。

通过实践复习巩固课堂所学的理论知识,也可以加强自己的实践操作,提高对所学知识的综合应用能力,同时也经过课后的上网查资料,同学间的相互探讨,逐步修改,完成了本系统的设计,设计基本上实现了设计所要求的功能。

一、实验软件(VisualC++6.0)

VisualC++6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。

VisualC++是一个功能强大的可视化软件开发工具。

VisualC++6.0对网络编程的支持有socket支持,WinInet支持,MAPI和ISAPI支持等。

其中,WindowsSocketsAPI是TCP/IP网络环境里,也是Internet上进行开发最为通用的API。

在TCP/IP网络通信环境下,Socket数据传输是一种特殊的I/O,它也相当于一种文件描述符,具有一个类似于打开文件的函数调用Socket()。

可以这样理解:

Socket实际上是一个通信端点,通过它,用户的Socket程序可以通过网络和其他的Socket应用程序通信。

二、设计内容

在局域网中有很多应用软件为了协同工作,需要保证客户机上时间统一,方法是客户机从一个时间相对正确的服务器读取时间,以此来校正本地时间。

网络对时系统分服务器端程序和客户端程序。

在服务器端程序需要达到以下功能:

能够接收局域网中任一台客户机的对时请求并准确向客户机发送服务器端的时间和日期;客户端程序要达到以下功能:

能够设定服务器的主机或者IP地址,能够接收服务器端发送的时间和日期信息并以此校正本地时间与服务器端的时间同步。

按照C/S模型设计一个网络对时服务系统,系统分为服务器端(server)和客户端(client)。

服务器按照时间协议的要求(参考RFC-868),对发出对时请求的客户端,以TCP/IP的格式返回响应。

客户端根据服务器端的返回值设计本地时间与服务器的时间同步。

三、设计原理

TCP/IP网络对时服务系统客户端和服务器原理主要分2个部分。

服务器端创建套接监听字,并为它关联一个本地地址(指定IP地址和端口),然后进入监听状态准备接受客户的连接请求,为客户端的连接请求,服务器调用ACCEPT函数。

客户端创建套接字即可调用CONENET函数试图连接服务器监听套接字,当服务器端的ACCEPT函数返回后,CONNECT函数也返回。

此时客户端使用socket函数创建的套接字,双方就可以通信了。

服务器调用socket函数创建套接字server,调用bind绑定套接字到本地IP地址和端口,在端口监听并调用recvfrom函数接受客户端的对时请求,并调用sendto函数发送服务器时间到客户端,然后关闭套接字。

客户端调用socket函数创建套接字client,调用sendto函数向服务器端发送对时请求,服务器端响应请求之后,客户端调用recvfrom函数从服务器端接收标准时间并设置本地时间与服务器端时间同步。

四、设计过程

对时服务系统的基本结构如图:

 

服务请求

服务应答

 

 

如上流程图所示:

服务器端调用socket函数创建套接字server,然后调用bind绑定套接字到本地IP地址和端口,在端口等待客户端的对时请求并调用recvfrom函数接受客户端的对时请求,并调用sendto函数发送服务器时间到客户端,然后关闭服务器套接字server。

客户端调用socket函数创建套接字client,然后调用sendto函数向服务器端发送对时请求,服务器端响应客户端的对时请求之后,调用sendto函数发送服务器时间到客户端,然后客户端调用recvfrom函数接收服务器端发送过来的响应,接收标准时间并设置本地时间与服务器端时间同步。

五、程序代码及测试分析

1、服务器:

#pragmacomment(lib,"ws2_32.lib")

#include

#include

#include

intmain()

{

WSADATAwsadata;

interr=WSAStartup(WINSOCK_VERSION,&wsadata);

if(err!

=0)

{

printf("WSAStartup()failed:

%d\n",WSAGetLastError());

return-1;

}

SOCKETsock=socket(AF_INET,SOCK_STREAM,0);

if(sock==INVALID_SOCKET)

{

printf("socket()failed:

%d\n",WSAGetLastError());

WSACleanup();

return-1;

}

sockaddr_inlocaladdr;//用于发送数据的服务器的地址结构

localaddr.sin_family=AF_INET;

localaddr.sin_port=htons(20000);

localaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//IP地址由系统指定使用当前配置的IP

err=bind(sock,(sockaddr*)&localaddr,sizeof(localaddr));

if(err==SOCKET_ERROR)

{

printf("bind()failed:

%d\n",WSAGetLastError());

closesocket(sock);

WSACleanup();

return-1;

}

err=listen(sock,5);

if(err==SOCKET_ERROR)

{

printf("listen()failed:

%d\n",WSAGetLastError());

closesocket(sock);

WSACleanup();

return-1;

}

sockaddr_inclientaddr;

intlen=sizeof(clientaddr);

while

(1)

{printf("------------------网络对时服务系统欢迎您(通信092班陈剑锋)------------------\n\n");

printf("等待客户端的对时请求……\n");

SOCKETsockconn=accept(sock,(sockaddr*)&clientaddr,&len);

if(sockconn==INVALID_SOCKET)

{

printf("accept()failed:

%d\n",WSAGetLastError());

closesocket(sock);

WSACleanup();

return-1;

}

printf("请求时间同步的客户端为:

%sPort:

%d\n",inet_ntoa(clientaddr.sin_addr),clientaddr.sin_port);

charrbuf[1024];

while

(1)

{

memset(rbuf,0,1024);

intrb=recv(sockconn,rbuf,1024,0);

if(rb==SOCKET_ERROR)

{

printf("recv()failed:

%d\n",WSAGetLastError());

closesocket(sockconn);

break;

}

if(rb==0)

{

printf("Connectionisclosed.\n\n\n");

shutdown(sockconn,SD_SEND);

closesocket(sockconn);

break;

}

printf("服务器受到[%d]的请求:

%s\n",rb,rbuf);

SYSTEMTIMEst;

GetLocalTime(&st);

printf("服务器时间:

%04d-%02d-%02d%02d:

%02d:

%02d\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);

intsb=send(sockconn,(char*)&st,sizeof(st),0);

if(sb==SOCKET_ERROR)

{

printf("send()failed:

%d\n",WSAGetLastError());

closesocket(sockconn);

WSACleanup();

return-1;

}

printf("发送本地时间成功!

!

\n");

}

}

closesocket(sock);

WSACleanup();

return0;

}

2、客户端:

#pragmacomment(lib,"ws2_32.lib")

#include

#include

#include

#include

intmain()

{intm;

do{

WSADATAwsadata;

interr=WSAStartup(WINSOCK_VERSION,&wsadata);

printf("------------------网络对时服务系统欢迎您(通信092班陈剑锋)------------------\n\n");

if(err!

=0)

{

printf("WSAStartup()出错:

%d\n",WSAGetLastError());

return-1;

}

SOCKETsock=socket(AF_INET,SOCK_STREAM,0);

if(sock==INVALID_SOCKET)

{

printf("socket()出错:

%d\n",WSAGetLastError());

WSACleanup();

return-1;

}

sockaddr_inserveraddr;

serveraddr.sin_family=AF_INET;

serveraddr.sin_port=htons(20000);

serveraddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

err=connect(sock,(sockaddr*)&serveraddr,sizeof(serveraddr));

if(err==SOCKET_ERROR)

{

printf("connect()出错:

%d\n",WSAGetLastError());

closesocket(sock);

WSACleanup();

return-1;

}

chardata[]="客户端请求时间同步!

";

intsb=send(sock,data,strlen(data),0);

if(sb==SOCKET_ERROR)

{

printf("send()出错:

%d\n",WSAGetLastError());

closesocket(sock);

WSACleanup();

return-1;

}

printf("已经发送请求给服务器%s\n",data,inet_ntoa(serveraddr.sin_addr));

shutdown(sock,SD_SEND);

SYSTEMTIMEst,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);

intrb=recv(sock,(char*)&st,sizeof(st),0);

if(rb==SOCKET_ERROR)

{

printf("recv()出错:

%d\n",WSAGetLastError());

closesocket(sock);

WSACleanup();

return-1;

}

if(rb==0)

{printf("Connectionisclosed.\n\n");

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,st.wSecond);

SetLocalTime(&st);

printf("修改本地时间成功,已与%s时间同步!

\n\n",inet_ntoa(serveraddr.sin_addr));

printf("继续请按

(1),退出请按(0)\n");

scanf("%d",&m);

}

}

while(m==1);

}

3、程序运行结果:

a、客户端向服务器发送对时请求,若服务器还没有打开,则客户端显示如下:

 

b、服务器打开运行之后,等待客户端的对时请求,服务器显示如下:

 

c、服务器打开运行之后,接受客户端的对时请求,服务器显示如下:

d、服务器应答后客户端显示如下:

e、按

(1)刷新时间,服务器与客户端显示如下:

 

六、心得体会

通过本次课程设计,加深了对网络程序课程知识的认知,进一步巩固了课堂上所学习的理论知识,也可以加强自己的实践操作,提高对所学知识的综合应用能力。

同时也加强了同学之间知识的交流,取长补短。

但是也认识到了自己各方面上的不足,比如说,理论知识不够牢固,一旦遇到实际操作,往往都会手忙脚乱,一些比较概念化的知识也要翻书才能确定,有时候遇到调试出错,而又无法找出错误时,会心烦意乱,一度想过放弃。

总之,在课程设计过程中,收获知识,提高能力的同时,我也懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。

因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!

七、参考文献

[1]罗军舟等编著,《TCP/IP协议及网络编程技术》,清华大学出版社

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1