- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用C语言实现在线对时器
用C语言实现的在线对时器 摘要:利用Internet传送标准时间信息称做网络授时。目前网上有很多授时服务器,我们可以用高级语言写一个在线对时器,获取授时服务器上的时间并以此来校对本机时间。本文以C语言为工具,实现了一个简单的在线对时器的开发
关键词:C语言 在线对时
中图分类号:TP302 文献标识码:A 文章编号:1672-3791(2012)10(b)-0006-01
在线对时器的作用是从Internet上获取准确的时间。它的基本设计思想是开发出客户端工具,以此登录到网络上的授时服务器并获取它的准确时间,然后根据这个时间来校对本机的系统时间。下面以C语言为开发工具,介绍一种简单的在线定时器的实现方法
1 登录到授时服务器
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));
2 接收授时服务器传过来的信息
我们这里采用的授时服务器,返回给客户端的是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);
我们得到的对话框如图1所示
为什么得到的结果明显不对呢?这涉及到字节顺序的问题,也就是说我们的客户机存储的整数的字节顺序和授时服务器不一致,导致传过来的ulTime没有得到正确的还原。这个问题很好解决,我们在将ulTime写到缓冲区之前,使用ntohl函数对ulTime做个处理即可(ulTime=ntohl(ulTime))
3 将秒数表示的时间转换为字符形式的时间
下面我们要将上面得到的一串数字转换为我们看得懂的字符形式的时间,我们用以下代码实现
SYSTEMTIME st;
UINT64 uiCurTime,uiBaseTime, uiResult;
uiBaseTime=((UINT64) HIGHTIME
文档评论(0)