欢迎来到天天文库
浏览记录
ID:31373953
大小:106.50 KB
页数:5页
时间:2019-01-09
《用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);//中国时区在东八区,因此在小时上加
此文档下载收益归作者所有