用C语言实现的在线定时器 论文
用C语言实现的在线对时器
【摘要】利用Internet传送标准时间信息称做网络授时。目前网上有很多授时服务器,我们可以用高级语言写一个在线对时器,获取授时服务器上的时间并以此来校对本机时间。本文以C语言为工具,实现了一个简单的在线对时器的开发。
【关键词】C语言,在线对时
【正文】
在线对时器的作用是从Internet上获取准确的时间。它的基本设计思想是开发出客户端工具,以此登录到网络上的授时服务器并获取它的准确时间,然后根据这个时间来校对本机的系统时间。下面以C语言为开发工具,介绍一种简单的在线定时器的实现方法。
一、登录到授时服务器
Internet上可用的授时服务器很多,这里采用香港的官方授时服务器(IP地址:210.0.235.14)。
核心代码如下:
//初始化套接字
SOCKET sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN sa;
sa.sin_family=AF_INET;
//设置套接字连接服务器端的端口(客户端端口由套接字动态分配,无需指定)
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));
二、接收授时服务器传过来的信息
我们这里采用的授时服务器,返回给客户端的是1900年1月1日0点0分0秒到现在的秒数,是整型数字。而我们将要使用的接收服务器返回的消息的recv函数,它相应的参数是字符指针类型,因此需要进行类型转换,这在代码中将得到体现。具体如下://定义用来接收返回的时间秒数的变量
unsigned long ulTime=0;
//使用recv函数接收以秒数代表的当前时间
recv(sock,(char*)&ulTime,sizeof(unsigned long),0);
那么这个秒数是多少呢?我们可以将它打印出来看一下:
//定义字符缓冲区
TCHAR buff[256];
//将缓冲区清零
ZeroMemory(buff,sizeof(buff)/sizeof(TCHAR));
将接收的秒数写到定义的缓冲区中
wsprintf(buff,"%i",ulTime);
//以对话框的形式显示接收的秒数
MessageBox(NULL,buff,TEXT("以秒数代表的当前时间"),MB_OK);
我们得到的对话框如下图所示:
为什么得到的结果明显不对呢?这涉及到字节顺序的问题,也就是说我们的客户机存储的整数的字节顺序和授时服务器不一致,导致传过来的ulTime没有得到正确的还原。这个问题很好解决,我们在将ulTime写到缓冲区之前,使用ntohl函数对ulTime做个处理即可(ulTime=ntohl(ulTime))。
三、将秒数表示的时间转换为字符形式的时间
下面我们要将上面得到的一串数字转换为我们看得懂的字符形式的时间,我们用以下代码实现:
SYSTEMTIME st;
UINT64uiCurTime,uiBaseTime,uiResult;
uiBaseTime=((UINT64)HIGHTIME<<32)+LOWTIME;
uiCurTime=(UINT64)ulTime*(UINT64)10000000;
uiResult=uiBaseTime+uiCurTime;
FileTimeToSystemTime((LPFILETIME)&uiResult,&st);
以上代码将接收到的以ulTime代表的秒数转换为了st这个结构体变量所代表的字符形式的时间(st中包含了年、月、日、时、分、秒的信息)。
我们将st中的内容打印出来看一下,用以下代码实现:
TCHAR 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);//中国时区在东八区,因此在小时上加8
MessageBox(NULL,buff,TEXT("字符形式的时间"),MB_OK);
打印出来的结果如下图所示:
为什么得到的小时不对呢?很简单,中国在东八区,应该在小时上加上8,也就是将st.wHour改为st.wHour+8。
四、将得到的时间设成本机系统时间
经过以上的测试,我们已经得到了授时服务器上的准确时间。将这个时间设置成本地系统时间即可,代码只需一句:
SetSystemTime(&st);//将st这个结构体变量所对应的时间赋给本机
【结束语】
本文介绍了用C语言实现的在线对时器开发的基本思路和核心代码。用其它高级语言开发在线对时器的基本方法与此类似。希望这样的客户端工具的开发,对于想深入学习网络编程的朋友,能起到一个铺垫的作用。
…… 此处隐藏:430字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [实用模板]第八章:法国“新浪潮”与“左岸派”
- [实用模板]2021年北京上半年临床医学检验技师生物
- [实用模板]SAP GUI 7.10客户端安装配置文档
- [实用模板]2001年临床执业医师资格考试综合笔试试
- [实用模板]36机场工作实用英语词汇总结
- [实用模板](一)社会保险稽核通知书
- [实用模板]安全教育主题班会材料
- [实用模板]濉溪县春季呼吸道传染病防控应急演练方
- [实用模板]长沙房地产市场周报(1.30-2.3)
- [实用模板]六年级数学上册典中点 - 图文
- [实用模板]C程序设计(红皮书)习题官方参考答案
- [实用模板]中国证监会第一届创业板发行审核委员会
- [实用模板]桥梁工程复习题
- [实用模板]2011学而思数学及答案
- [实用模板]初中病句修改专项练习
- [实用模板]监理学习知识1 - 图文
- [实用模板]小机灵杯四年级试题
- [实用模板]国贸专业毕业论文模板
- [实用模板]教育学概论考试练习题-判断题4
- [实用模板]2015届高考英语一轮复习精品资料(译林
- 00Nkmhe_市场营销学工商管理_电子商务_
- 事业单位考试法律常识
- 诚信教育实施方案
- 吉大小天鹅食品安全检测箱方案(高中低
- 房地产销售培训资料
- 高一地理必修1复习提纲
- 新概念英语第二册lesson_1_练习题
- 证券公司内部培训资料
- 小学英语时间介词专项练习
- 新世纪英语专业综合教程(第二版)第1册U
- 【新课标】浙教版最新2018年八年级数学
- 工程建设管理纲要
- 外研版 必修一Module 4 A Social Surve
- Adobe认证考试 AE复习资料
- 基于H.264AVC与AVS标准的帧内预测技术
- 《食品检验机构资质认定管理办法》(质
- ABB变频器培训课件
- (完整版)小学说明文阅读练习题及答案
- 深思洛克(SenseLock) 深思IV,深思4,深
- 弟子规全文带拼音




