用c语言实现的在线对时器

用c语言实现的在线对时器

ID:31373953

大小:106.50 KB

页数:5页

时间:2019-01-09

用c语言实现的在线对时器_第1页
用c语言实现的在线对时器_第2页
用c语言实现的在线对时器_第3页
用c语言实现的在线对时器_第4页
用c语言实现的在线对时器_第5页
资源描述:

《用c语言实现的在线对时器》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、用C语言实现的在线对时器  摘要:利用Internet传送标准时间信息称做网络授时。目前网上有很多授时服务器,我们可以用高级语言写一个在线对时器,获取授时服务器上的时间并以此来校对本机时间。本文以C语言为工具,实现了一个简单的在线对时器的开发。  关键词:C语言在线对时  中图分类号:TP302文献标识码:A文章编号:1672-3791(2012)10(b)-0006-01  在线对时器的作用是从Internet上获取准确的时间。它的基本设计思想是开发出客户端工具,以此登录到网络上的授时服务器并获取它的准确时间,然

2、后根据这个时间来校对本机的系统时间。下面以C语言为开发工具,介绍一种简单的在线定时器的实现方法。  1登录到授时服务器  Internet上可用的授时服务器很多,这里采用香港的官方授时服务器(IP地址:210.0.235.14)。  核心代码如下。  //初始化套接字  SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  SOCKADDR_IN sa;5  sa.sin_family=AF_INET;  //设置套接字连接服务器端的端口(客户端端口由套

3、接字动态分配,无需指定)  sa.sin_port=htons(IPPORT_TIMESERVER);// IPPORT_TIMESERVER是宏,对应的  //值是37,它代表TIMESERVER的端口号  //设置要连接到的授时服务器的IP地址  sa.sin_addr.S_un.S_addr = inet_addr("210.0.235.14");  //指定了端口号和IP地址之后,开始登录到授时服务器  connect(sock,(SOCKADDR*)&sa,sizeof(sa));  2接收授时服务器传过

4、来的信息  我们这里采用的授时服务器,返回给客户端的是1900年1月1日0点0分0秒到现在的秒数,是整型数字。而我们将要使用的接收服务器返回的消息的recv函数,它相应的参数是字符指针类型,因此需要进行类型转换,这在代码中将得到体现。具体如下。  //定义用来接收返回的时间秒数的变量  unsigned long ulTime = 0;  //使用recv函数接收以秒数代表的当前时间  recv(sock,(char*)&ulTime,sizeof(unsigned long),0);  那么这个秒数是多少呢?我们

5、可以将它打印出来看一下:  //定义字符缓冲区  TCHAR buff[256];5  //将缓冲区清零  ZeroMemory(buff,sizeof(buff)/sizeof(TCHAR));  将接收的秒数写到定义的缓冲区中  wsprintf(buff,"%i",ulTime);  //以对话框的形式显示接收的秒数  MessageBox(NULL,buff,TEXT("以秒数代表的当前时间"),MB_OK);  我们得到的对话框如图1所示。  为什么得到的结果明显不对呢?这涉及到字节顺序的问题,也就是说我

6、们的客户机存储的整数的字节顺序和授时服务器不一致,导致传过来的ulTime没有得到正确的还原。这个问题很好解决,我们在将ulTime写到缓冲区之前,使用ntohl函数对ulTime做个处理即可(ulTime=ntohl(ulTime))。  3将秒数表示的时间转换为字符形式的时间  下面我们要将上面得到的一串数字转换为我们看得懂的字符形式的时间,我们用以下代码实现。  SYSTEMTIME st;  UINT64 uiCurTime,uiBaseTime, uiResult;  uiBaseTime=((UINT6

7、4) HIGHTIME << 32) + LOWTIME;  uiCurTime=(UINT64)ulTime* (UINT64)10000000;  uiResult=uiBaseTime + uiCurTime;  FileTimeToSystemTime((LPFILETIME)&uiResult,&st);5  以上代码将接收到的以ulTime代表的秒数转换为了st这个结构体变量所代表的字符形式的时间(st中包含了年、月、日、时、分、秒的信息)。  我们将st中的内容打印出来看一下,用以下代码实现。  TC

8、HAR buff[256];  ZeroMemory(buff,sizeof(buff)/sizeof(TCHAR));  wsprintf(buff,TEXT("%i年%i月%i日 %i:%i:%i"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);//中国时区在东八区,因此在小时上加

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。