首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

透过网络为系统校时

2012-06-25 
通过网络为系统校时下载本工具虽然从XP以后,系统已经提供了通过网络更新系统时间的功能,具体操作为:控制面

通过网络为系统校时
下载本工具
虽然从XP以后,系统已经提供了通过网络更新系统时间的功能,具体操作为:控制面板--日期和时间属性--Internet时间--立即更新。
但我发现在好多情况下,因为各种原因,那个“立即更新”的按钮常会变灰--不可用,或是点击“立即更新”后,系统说RPC服务器不可用,于是我便自己写了个小程序,实现自动网络校时的功能。其原理说白了十分简单,你也不妨自己来试一下:
先选择一个网络时间服务器,这个从网上可以找到好多,我在工具里用到的是:129.7.1.66。通过socket与它的37端口相连,然后等接收服务器发回的时间数据,进行解析一下就可以得到一个精确的时间值了。
  CSocket sockClient;
sockClient.Create();//创建socket
int ret = sockClient.Connect(“129.7.1.66”, 37); // strServer:时间服务器网址; 37:端口号

DWORD dwTime = 0;//用来存放服务器传来的标准时间数据
unsigned char nTime[8];
memset(nTime, 0, sizeof(nTime));
sockClient.Receive(nTime, sizeof(nTime));//接收服务器发送来得4个字节的数据
sockClient.Close();//关闭socket

dwTime += nTime[0] << 24;//解析时间数据
dwTime += nTime[1] << 16;
dwTime += nTime[2] << 8;
dwTime += nTime[3];

if(0 == dwTime)
return FALSE;
CString strSec("");
//服务器传来的数据是自从1900年以来的秒数
//取得 1900~1970 的时间差(以秒数计算) ,放在dwSpan里面
COleDateTime t00( 1900, 1, 1, 0, 0, 0 ); // 1900.1.1 00:00:00 
COleDateTime t70( 1970, 1, 1, 0, 0, 0 ); // 1970.1.1 00:00:00 

COleDateTimeSpan ts70to00 = t70 - t00; 
DWORD dwSpan = (DWORD)ts70to00.GetTotalSeconds(); 

dwTime -= dwSpan;
//考虑网络延迟因素 
dwTime += dwDely;// dwTime 即为从时间服务器取回的时间

[解决办法]
分享?
[解决办法]
精度不高吧,到不了毫秒级
[解决办法]

探讨

精度不高吧,到不了毫秒级

热点排行