网络程序课程设计网络对时Word格式文档下载.docx
《网络程序课程设计网络对时Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《网络程序课程设计网络对时Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
可以这样理解:
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<
winsock2.h>
stdio.h>
string.h>
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)
socket()failed:
WSACleanup();
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)
bind()failed:
closesocket(sock);
err=listen(sock,5);
listen()failed:
sockaddr_inclientaddr;
intlen=sizeof(clientaddr);
while
(1)
{printf("
------------------网络对时服务系统欢迎您(通信092班陈剑锋)------------------\n\n"
);
等待客户端的对时请求……\n"
SOCKETsockconn=accept(sock,(sockaddr*)&
clientaddr,&
len);
if(sockconn==INVALID_SOCKET)
{
printf("
accept()failed:
closesocket(sock);
WSACleanup();
return-1;
}
printf("
请求时间同步的客户端为:
%sPort:
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:
closesocket(sockconn);
break;
}
if(rb==0)
Connectionisclosed.\n\n\n"
shutdown(sockconn,SD_SEND);
服务器受到[%d]的请求:
%s\n"
rb,rbuf);
SYSTEMTIMEst;
GetLocalTime(&
st);
服务器时间:
%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)
send()failed:
WSACleanup();
return-1;
发送本地时间成功!
!
\n"
closesocket(sock);
WSACleanup();
return0;
}
2、客户端:
#pragmacomment(lib,"
#include<
#include<
windows.h>
intmain()
{intm;
do{
WSADATAwsadata;
interr=WSAStartup(WINSOCK_VERSION,&
if(err!
printf("
WSAStartup()出错:
return-1;
SOCKETsock=socket(AF_INET,SOCK_STREAM,0);
if(sock==INVALID_SOCKET)
socket()出错:
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)
connect()出错:
chardata[]="
客户端请求时间同步!
"
;
intsb=send(sock,data,strlen(data),0);
if(sb==SOCKET_ERROR)
send()出错:
已经发送请求给服务器%s\n"
data,inet_ntoa(serveraddr.sin_addr));
shutdown(sock,SD_SEND);
SYSTEMTIMEst,sp;
GetLocalTime(&
sp);
本地时间为:
%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*)&
if(rb==SOCKET_ERROR)
recv()出错:
if(rb==0)
Connectionisclosed.\n\n"
shutdown(sock,SD_SEND);
break;
获取的服务器时间为:
%04d-%02d-%02d%.2d:
st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
SetLocalTime(&
st);
修改本地时间成功,已与%s时间同步!
\n\n"
inet_ntoa(serveraddr.sin_addr));
继续请按
(1),退出请按(0)\n"
scanf("
%d"
&
m);
}
while(m==1);
3、程序运行结果:
a、客户端向服务器发送对时请求,若服务器还没有打开,则客户端显示如下:
b、服务器打开运行之后,等待客户端的对时请求,服务器显示如下:
c、服务器打开运行之后,接受客户端的对时请求,服务器显示如下:
d、服务器应答后客户端显示如下:
e、按
(1)刷新时间,服务器与客户端显示如下:
六、心得体会
通过本次课程设计,加深了对网络程序课程知识的认知,进一步巩固了课堂上所学习的理论知识,也可以加强自己的实践操作,提高对所学知识的综合应用能力。
同时也加强了同学之间知识的交流,取长补短。
但是也认识到了自己各方面上的不足,比如说,理论知识不够牢固,一旦遇到实际操作,往往都会手忙脚乱,一些比较概念化的知识也要翻书才能确定,有时候遇到调试出错,而又无法找出错误时,会心烦意乱,一度想过放弃。
总之,在课程设计过程中,收获知识,提高能力的同时,我也懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。
因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!
七、参考文献
[1]罗军舟等编著,《TCP/IP协议及网络编程技术》,清华大学出版社